diff --git a/README.md b/README.md index d7fc2047..b06fab87 100644 --- a/README.md +++ b/README.md @@ -92,41 +92,63 @@ python scripts/run_tests.py ### Example -```cpp +```c #include "pocketpy.h" +#include -using namespace pkpy; +static bool int_add(int argc, py_Ref argv) { + PY_CHECK_ARGC(2); + PY_CHECK_ARG_TYPE(0, tp_int); + PY_CHECK_ARG_TYPE(1, tp_int); + py_i64 a = py_toint(py_arg(0)); + py_i64 b = py_toint(py_arg(1)); + py_newint(py_retval(), a + b); + return true; +} -int main(){ - // Create a virtual machine - VM* vm = new VM(); +int main() { + // Initialize pocketpy + py_initialize(); // Hello world! - vm->exec("print('Hello world!')"); + bool ok = py_exec("print('Hello world!')", "", EXEC_MODE, NULL); + if(!ok) goto __ERROR; - // Create a list - vm->exec("a = [1, 2, 3]"); + // Create a list: [1, 2, 3] + py_Ref r0 = py_getreg(0); + py_newlistn(r0, 3); + py_newint(py_list_getitem(r0, 0), 1); + py_newint(py_list_getitem(r0, 1), 2); + py_newint(py_list_getitem(r0, 2), 3); // Eval the sum of the list - PyVar result = vm->eval("sum(a)"); - std::cout << "Sum of the list: "<< py_cast(vm, result) << std::endl; // 6 + py_Ref f_sum = py_getbuiltin(py_name("sum")); + py_push(f_sum); + py_pushnil(); + py_push(r0); + ok = py_vectorcall(1, 0); + if(!ok) goto __ERROR; - // Bindings - vm->bind(vm->_main, "add(a: int, b: int)", - [](VM* vm, ArgsView args){ - int a = py_cast(vm, args[0]); - int b = py_cast(vm, args[1]); - return py_var(vm, a + b); - }); + printf("Sum of the list: %d\n", (int)py_toint(py_retval())); // 6 - // Call the function - PyVar f_add = vm->_main->attr("add"); - result = vm->call(f_add, py_var(vm, 3), py_var(vm, 7)); - std::cout << "Sum of 2 variables: "<< py_cast(vm, result) << std::endl; // 10 + // Bind native `int_add` as a global variable + py_newnativefunc(r0, int_add); + py_setglobal(py_name("add"), r0); - // Dispose the virtual machine - delete vm; + // Call `add` in python + ok = py_exec("add(3, 7)", "", EVAL_MODE, NULL); + if(!ok) goto __ERROR; + + py_i64 res = py_toint(py_retval()); + printf("Sum of 2 variables: %d\n", (int)res); // 10 + + py_finalize(); return 0; + +__ERROR: + py_printexc(); + py_finalize(); + return 1; } ``` diff --git a/include/pocketpy/pocketpy.h b/include/pocketpy/pocketpy.h index 98f67823..00024863 100644 --- a/include/pocketpy/pocketpy.h +++ b/include/pocketpy/pocketpy.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "pocketpy/common/config.h" #include "pocketpy/common/export.h" diff --git a/src/interpreter/ceval.c b/src/interpreter/ceval.c index 0934ddbf..db956de0 100644 --- a/src/interpreter/ceval.c +++ b/src/interpreter/ceval.c @@ -921,7 +921,6 @@ FrameResult VM__run_top_frame(VM* self) { // call on_end_subclass py_TypeInfo* ti = c11__at(py_TypeInfo, &self->types, py_totype(TOP())); if(ti->base != tp_object) { - // PyTypeInfo* base_ti = &_all_types[ti->base]; py_TypeInfo* base_ti = c11__at(py_TypeInfo, &self->types, ti->base); if(base_ti->on_end_subclass) base_ti->on_end_subclass(ti); } diff --git a/src2/example.c b/src2/example.c new file mode 100644 index 00000000..10fa7ada --- /dev/null +++ b/src2/example.c @@ -0,0 +1,57 @@ +#include "pocketpy.h" +#include + +static bool int_add(int argc, py_Ref argv) { + PY_CHECK_ARGC(2); + PY_CHECK_ARG_TYPE(0, tp_int); + PY_CHECK_ARG_TYPE(1, tp_int); + py_i64 a = py_toint(py_arg(0)); + py_i64 b = py_toint(py_arg(1)); + py_newint(py_retval(), a + b); + return true; +} + +int main() { + // Initialize pocketpy + py_initialize(); + + // Hello world! + bool ok = py_exec("print('Hello world!')", "", EXEC_MODE, NULL); + if(!ok) goto __ERROR; + + // Create a list: [1, 2, 3] + py_Ref r0 = py_getreg(0); + py_newlistn(r0, 3); + py_newint(py_list_getitem(r0, 0), 1); + py_newint(py_list_getitem(r0, 1), 2); + py_newint(py_list_getitem(r0, 2), 3); + + // Eval the sum of the list + py_Ref f_sum = py_getbuiltin(py_name("sum")); + py_push(f_sum); + py_pushnil(); + py_push(r0); + ok = py_vectorcall(1, 0); + if(!ok) goto __ERROR; + + printf("Sum of the list: %d\n", (int)py_toint(py_retval())); // 6 + + // Bind native `int_add` as a global variable + py_newnativefunc(r0, int_add); + py_setglobal(py_name("add"), r0); + + // Call `add` in python + ok = py_exec("add(3, 7)", "", EVAL_MODE, NULL); + if(!ok) goto __ERROR; + + py_i64 res = py_toint(py_retval()); + printf("Sum of 2 variables: %d\n", (int)res); // 10 + + py_finalize(); + return 0; + +__ERROR: + py_printexc(); + py_finalize(); + return 1; +} \ No newline at end of file