diff --git a/c_bindings/test.c b/c_bindings/test.c index 6cb80e21..915d97f2 100644 --- a/c_bindings/test.c +++ b/c_bindings/test.c @@ -368,5 +368,15 @@ int main(int argc, char** argv) { check(pkpy_to_float(vm, -1, &r_float)); printf("pi: %.2f\n", r_float); check(pkpy_pop(vm, 1)); + check(pkpy_stack_size(vm) == 0); + + PRINT_TITLE("test py_repr"); + check(pkpy_eval(vm, "['1', 2, (3, '4')]")); + check(pkpy_py_repr(vm, -1)); + check(pkpy_to_string(vm, -1, &r_string)); + for(int i = 0; i < r_string.size; i++) putchar(r_string.data[i]); + putchar('\n'); + check(pkpy_pop(vm, 1)); + check(pkpy_stack_size(vm) == 0); return 0; } diff --git a/c_bindings/test_answers.txt b/c_bindings/test_answers.txt index 0a06690e..03b3b13a 100644 --- a/c_bindings/test_answers.txt +++ b/c_bindings/test_answers.txt @@ -98,3 +98,6 @@ pi: 3.14 ====== test eval ====== pi: 2.00 + +====== test py_repr ====== +['1', 2, (3, '4')] diff --git a/docs/C-API/stack.md b/docs/C-API/stack.md index 7692a4f2..e8d80a6d 100644 --- a/docs/C-API/stack.md +++ b/docs/C-API/stack.md @@ -140,3 +140,10 @@ PK_EXPORT bool pkpy_is_none(pkpy_vm*, int i); ``` [obj] -> [obj. self] ``` ++ `bool pkpy_py_repr(pkpy_vm*, int i)` + + Get the repr of the value at the given index and push it onto the stack. + + ``` + [..., value, ...] -> [..., value, ..., repr(value)] + ``` \ No newline at end of file diff --git a/include/pocketpy/pocketpy_c.h b/include/pocketpy/pocketpy_c.h index fcd92e82..7e7a31ee 100644 --- a/include/pocketpy/pocketpy_c.h +++ b/include/pocketpy/pocketpy_c.h @@ -75,6 +75,7 @@ PK_EXPORT bool pkpy_setglobal(pkpy_vm*, pkpy_CName); PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source); PK_EXPORT bool pkpy_unpack_sequence(pkpy_vm*, int size); PK_EXPORT bool pkpy_get_unbound_method(pkpy_vm*, pkpy_CName); +PK_EXPORT bool pkpy_py_repr(pkpy_vm*, int i); /* Error Handling */ PK_EXPORT bool pkpy_error(pkpy_vm*, const char* name, pkpy_CString); diff --git a/src/pocketpy_c.cpp b/src/pocketpy_c.cpp index 0830996a..90b32b29 100644 --- a/src/pocketpy_c.cpp +++ b/src/pocketpy_c.cpp @@ -1,5 +1,4 @@ #include "pocketpy.h" -#include "pocketpy/pocketpy_c.h" #include "pocketpy_c.h" using namespace pkpy; @@ -440,6 +439,18 @@ bool pkpy_get_unbound_method(pkpy_vm* vm_handle, pkpy_CName name){ return true; } +bool pkpy_py_repr(pkpy_vm* vm_handle, int i) { + VM* vm = (VM*) vm_handle; + PK_ASSERT_NO_ERROR() + PK_ASSERT_N_EXTRA_ELEMENTS(1) + PK_PROTECTED( + PyObject* item = stack_item(vm, i); + PyObject* repr = vm->py_repr(item); + vm->s_data.push(repr); + ) + return true; +} + /* Error Handling */ bool pkpy_error(pkpy_vm* vm_handle, const char* name, pkpy_CString message) { VM* vm = (VM*) vm_handle;