From fd2996eb8770dc2103a5a823bce9804de344ba60 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 15 Jul 2023 12:22:53 +0800 Subject: [PATCH] ... --- c_bindings/test.c | 187 +++++++++++++++++----------------- docs/C-API/error.md | 2 +- docs/C-API/specials.md | 6 +- include/pocketpy/pocketpy_c.h | 3 +- src/pocketpy_c.cpp | 24 +++-- 5 files changed, 120 insertions(+), 102 deletions(-) diff --git a/c_bindings/test.c b/c_bindings/test.c index 185767e4..ef541a9c 100644 --- a/c_bindings/test.c +++ b/c_bindings/test.c @@ -71,34 +71,30 @@ int test_return_none(pkpy_vm* vm) { } int test_error_propagate(pkpy_vm* vm) { - pkpy_error(vm, "NameError", "catch me"); + pkpy_error(vm, "NameError", pkpy_string("catch me")); return 1; } int test_nested_error(pkpy_vm* vm) { - pkpy_get_global(vm, "error_from_python"); - pkpy_call(vm, 0); + pkpy_getglobal(vm, pkpy_name("error_from_python")); + pkpy_push_null(vm); + pkpy_vectorcall(vm, 0); return 0; } - -pkpy_vm* vm; - int main(int argc, char** argv) { + pkpy_vm* vm = pkpy_new_vm(true); - vm = pkpy_vm_create(true, true); - - //test run - check(pkpy_vm_run(vm, "print('hello world!')")); - - error(pkpy_get_global(vm, "nonexistatn")); + check(pkpy_exec(vm, "print('hello world!')")); + error(pkpy_getglobal(vm, pkpy_name("nonexistatn"))); printf("\ntesting int methods\n"); int r_int; check(pkpy_push_int(vm, 11)); - check(pkpy_set_global(vm, "eleven")); - check(pkpy_vm_run(vm, "print(eleven)")); - check(pkpy_get_global(vm, "eleven")); + pkpy_CName m_eleven = pkpy_name("eleven"); + check(pkpy_setglobal(vm, m_eleven)); + check(pkpy_exec(vm, "print(eleven)")); + check(pkpy_getglobal(vm, m_eleven)); check(pkpy_is_int(vm, -1)); check(pkpy_to_int(vm, -1, &r_int)); printf("%i\n", r_int); @@ -109,11 +105,12 @@ int main(int argc, char** argv) { fail(pkpy_is_voidp(vm, -1)); printf("\ntesting float methods\n"); - double r_float; + float r_float; check(pkpy_push_float(vm, 11.11)); - check(pkpy_set_global(vm, "elevenf")); - check(pkpy_vm_run(vm, "print(elevenf)")); - check(pkpy_get_global(vm, "elevenf")); + pkpy_CName m_elevenf = pkpy_name("elevenf"); + check(pkpy_setglobal(vm, m_elevenf)); + check(pkpy_exec(vm, "print(elevenf)")); + check(pkpy_getglobal(vm, m_elevenf)); check(pkpy_is_float(vm, -1)); check(pkpy_to_float(vm, -1, &r_float)); printf("%f\n", r_float); @@ -126,9 +123,10 @@ int main(int argc, char** argv) { printf("\ntesting bool methods\n"); bool r_bool; check(pkpy_push_bool(vm, false)); - check(pkpy_set_global(vm, "false_test")); - check(pkpy_vm_run(vm, "print(false_test)")); - check(pkpy_get_global(vm, "false_test")); + pkpy_CName m_false_test = pkpy_name("false_test"); + check(pkpy_setglobal(vm, m_false_test)); + check(pkpy_exec(vm, "print(false_test)")); + check(pkpy_getglobal(vm, m_false_test)); check(pkpy_is_bool(vm, -1)); check(pkpy_to_bool(vm, -1, &r_bool)); printf("%i\n", r_bool); @@ -139,19 +137,19 @@ int main(int argc, char** argv) { fail(pkpy_is_voidp(vm, -1)); printf("\ntesting string methods\n"); - char* r_string; - check(pkpy_push_string(vm, "hello!")); - check(pkpy_set_global(vm, "hello1")); - check(pkpy_vm_run(vm, "print(hello1)")); - check(pkpy_push_stringn(vm, "hello!", 5)); + pkpy_CString r_string; + check(pkpy_push_string(vm, pkpy_string("hello!"))); + check(pkpy_setglobal(vm, pkpy_name("hello1"))); + check(pkpy_exec(vm, "print(hello1)")); + check(pkpy_push_string(vm, pkpy_string("hello!"))); check(pkpy_is_string(vm, -1)); check(pkpy_to_string(vm, -1, &r_string)); - printf("%s\n", r_string); - free(r_string); - const char* r_stringn; - int r_size; - check(pkpy_to_stringn(vm, -1, &r_stringn, &r_size)); - printf("%.*s\n", r_size, r_stringn); + + for(int i=0; i_main->attr().try_get(name); if (o == nullptr) { o = vm->builtins->attr().try_get(name); if (o == nullptr){ - pkpy_error(vm_handle, "NameError", name); + pkpy_error(vm_handle, "NameError", pkpy_name_to_string(name_)); return false; } } @@ -388,11 +390,11 @@ bool pkpy_getglobal(pkpy_vm* vm_handle, const char* name) { return true; } -bool pkpy_setglobal(pkpy_vm* vm_handle, const char* name) { +bool pkpy_setglobal(pkpy_vm* vm_handle, pkpy_CName name_) { VM* vm = (VM*) vm_handle; PK_ASSERT_NO_ERROR() PK_ASSERT_N_EXTRA_ELEMENTS(1) - vm->_main->attr().set(name, vm->s_data.popx()); + vm->_main->attr().set(StrName(name_), vm->s_data.popx()); return true; } @@ -440,10 +442,10 @@ bool pkpy_get_unbound_method(pkpy_vm* vm_handle, pkpy_CName name){ } /* Error Handling */ -bool pkpy_error(pkpy_vm* vm_handle, const char* name, const char* message) { +bool pkpy_error(pkpy_vm* vm_handle, const char* name, pkpy_CString message) { VM* vm = (VM*) vm_handle; PK_ASSERT_NO_ERROR() - vm->_c.error = py_var(vm, Exception(name, message)); + vm->_c.error = py_var(vm, Exception(name, Str(message.data, message.size))); return false; } @@ -494,6 +496,14 @@ pkpy_CName pkpy_name(const char* name){ return StrName(name).index; } +pkpy_CString pkpy_name_to_string(pkpy_CName name){ + std::string_view sv = StrName(name).sv(); + pkpy_CString s; + s.data = sv.data(); + s.size = sv.size(); + return s; +} + void pkpy_compile_to_string(pkpy_vm* vm_handle, const char* source, const char* filename, int mode, bool* ok, char** out){ VM* vm = (VM*) vm_handle; try{