blueloveTH 2 yıl önce
ebeveyn
işleme
4caf6a1110

+ 10 - 0
c_bindings/test.c

@@ -368,5 +368,15 @@ int main(int argc, char** argv) {
     check(pkpy_to_float(vm, -1, &r_float));
     check(pkpy_to_float(vm, -1, &r_float));
     printf("pi: %.2f\n", r_float);
     printf("pi: %.2f\n", r_float);
     check(pkpy_pop(vm, 1));
     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;
     return 0;
 }
 }

+ 3 - 0
c_bindings/test_answers.txt

@@ -98,3 +98,6 @@ pi: 3.14
 
 
 ====== test eval ======
 ====== test eval ======
 pi: 2.00
 pi: 2.00
+
+====== test py_repr ======
+['1', 2, (3, '4')]

+ 7 - 0
docs/C-API/stack.md

@@ -140,3 +140,10 @@ PK_EXPORT bool pkpy_is_none(pkpy_vm*, int i);
     ```
     ```
     [obj] -> [obj.<name> self]
     [obj] -> [obj.<name> 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)]
+    ```

+ 1 - 0
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_eval(pkpy_vm*, const char* source);
 PK_EXPORT bool pkpy_unpack_sequence(pkpy_vm*, int size);
 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_get_unbound_method(pkpy_vm*, pkpy_CName);
+PK_EXPORT bool pkpy_py_repr(pkpy_vm*, int i);
 
 
 /* Error Handling */
 /* Error Handling */
 PK_EXPORT bool pkpy_error(pkpy_vm*, const char* name, pkpy_CString);
 PK_EXPORT bool pkpy_error(pkpy_vm*, const char* name, pkpy_CString);

+ 12 - 1
src/pocketpy_c.cpp

@@ -1,5 +1,4 @@
 #include "pocketpy.h"
 #include "pocketpy.h"
-#include "pocketpy/pocketpy_c.h"
 #include "pocketpy_c.h"
 #include "pocketpy_c.h"
 
 
 using namespace pkpy;
 using namespace pkpy;
@@ -440,6 +439,18 @@ bool pkpy_get_unbound_method(pkpy_vm* vm_handle, pkpy_CName name){
     return true;
     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 */
 /* Error Handling */
 bool pkpy_error(pkpy_vm* vm_handle, const char* name, pkpy_CString message) {
 bool pkpy_error(pkpy_vm* vm_handle, const char* name, pkpy_CString message) {
     VM* vm = (VM*) vm_handle;
     VM* vm = (VM*) vm_handle;