diff --git a/build_c.sh b/build_c.sh index 6d7355d3..54d82df6 100644 --- a/build_c.sh +++ b/build_c.sh @@ -1,11 +1,11 @@ python3 preprocess.py echo "compiling c++ lib" -clang++ -c -o pocketpy_c.o c_bindings/pocketpy_c.cpp -Wfatal-errors --std=c++17 -O2 -Wall -Wno-sign-compare -Wno-unused-variable -fno-rtti -stdlib=libc++ -I src/ -echo "compiling c executable" -clang -c -o main.o c_bindings/main.c -Wfatal-errors -O2 -Wall -Wno-sign-compare -Wno-unused-variable -I src/ +clang++ -c -o pocketpy_c.o c_bindings/pocketpy_c.cpp -Wfatal-errors --std=c++17 -O2 -Wall -Wno-sign-compare -Wno-unused-variable -fno-rtti -stdlib=libc++ -I src/ -fsanitize=address -g +echo "compiling c executable" +clang -c -o main.o c_bindings/main.c -Wfatal-errors -O2 -Wall -Wno-sign-compare -Wno-unused-variable -I src/ -fsanitize=address -g echo "linking" -clang++ -o pocketpy_c main.o pocketpy_c.o -stdlib=libc++ +clang++ -o pocketpy_c main.o pocketpy_c.o -stdlib=libc++ -fsanitize=address -g echo "cleaning up" rm pocketpy_c.o rm main.o diff --git a/c_bindings/main.c b/c_bindings/main.c index f3592583..ff18459a 100644 --- a/c_bindings/main.c +++ b/c_bindings/main.c @@ -1,4 +1,5 @@ #include "pocketpy_c.h" +#include void test_binding(pkpy_vm vm) { @@ -20,7 +21,16 @@ int main(int argc, char** argv) { pkpy_vm_exec(vm, "print(eleven)"); pkpy_vm_exec(vm, "print(binding())"); - pkpy_vm_destroy(vm); + pkpy_vm_exec(vm, "x = lambda x : x + 1"); + pkpy_get_global(vm, "x"); + pkpy_push_null(vm); + pkpy_push_int(vm, 1); + pkpy_call(vm, 1); + + int64_t r = pkpy_toint(vm, 1); + printf("%li\n", r); + + pkpy_vm_destroy(vm); return 0; } diff --git a/c_bindings/pocketpy_c.cpp b/c_bindings/pocketpy_c.cpp index 070dfaca..9e0ec369 100644 --- a/c_bindings/pocketpy_c.cpp +++ b/c_bindings/pocketpy_c.cpp @@ -21,7 +21,7 @@ void pkpy_vm_destroy(pkpy_vm vm_handle) { void pkpy_push_cfunction(pkpy_vm vm_handle, pkpy_cfunction f) { pkpy::VM* vm = (pkpy::VM*) vm_handle; - vm->s_data.push(pkpy::py_var(vm, pkpy::StackFunc((pkpy::StackFuncC) f))); + vm->s_data.push(VAR((pkpy::StackFunc) f)); } void pkpy_push_int(pkpy_vm vm_handle, int64_t value) { @@ -29,6 +29,12 @@ void pkpy_push_int(pkpy_vm vm_handle, int64_t value) { vm->s_data.push(VAR(value)); } +void pkpy_push_null(pkpy_vm vm_handle) { + pkpy::VM* vm = (pkpy::VM*) vm_handle; + vm->s_data.push(pkpy::PY_NULL); +} + + void pkpy_push_float(pkpy_vm vm_handle, double value) { pkpy::VM* vm = (pkpy::VM*) vm_handle; vm->s_data.push(VAR(value)); @@ -42,4 +48,24 @@ void pkpy_set_global(pkpy_vm vm_handle, const char* name) { vm->s_data.pop(); } +void pkpy_get_global(pkpy_vm vm_handle, const char* name) { + pkpy::VM* vm = (pkpy::VM*) vm_handle; + + pkpy::PyObject* o = vm->_main->attr().try_get(name); + + vm->s_data.push(o); +} + +void pkpy_call(pkpy_vm vm_handle, int argc) { + pkpy::VM* vm = (pkpy::VM*) vm_handle; + pkpy::PyObject* o = vm->vectorcall(argc, 0, 0); + vm->s_data.push(o); +} + +int pkpy_toint(pkpy_vm vm_handle, int index) { + pkpy::VM* vm = (pkpy::VM*) vm_handle; + + pkpy::PyObject* o = vm->s_data.peek(index); + return pkpy::py_cast(vm, o); +} diff --git a/c_bindings/pocketpy_c.h b/c_bindings/pocketpy_c.h index 80f153cc..1bb96397 100644 --- a/c_bindings/pocketpy_c.h +++ b/c_bindings/pocketpy_c.h @@ -20,9 +20,13 @@ typedef void (*pkpy_cfunction)(pkpy_vm); void pkpy_push_cfunction(pkpy_vm, pkpy_cfunction); void pkpy_push_int(pkpy_vm, int64_t); void pkpy_push_float(pkpy_vm, double); +void pkpy_push_null(pkpy_vm); void pkpy_set_global(pkpy_vm, const char* name); +void pkpy_get_global(pkpy_vm vm_handle, const char* name); +void pkpy_call(pkpy_vm vm_handle, int argc); +int pkpy_toint(pkpy_vm vm_handle, int index); diff --git a/src/frame.h b/src/frame.h index 150e75c4..552fbfa5 100644 --- a/src/frame.h +++ b/src/frame.h @@ -188,4 +188,4 @@ struct Frame { } }; -}; // namespace pkpy \ No newline at end of file +}; // namespace pkpy diff --git a/src/obj.h b/src/obj.h index fc787db5..78c4c631 100644 --- a/src/obj.h +++ b/src/obj.h @@ -24,14 +24,7 @@ struct NativeFunc { }; -typedef void (*StackFuncC)(VM*); -struct StackFunc { - StackFuncC f; - - StackFunc(StackFuncC f) : f(f) {} - void operator()(VM* vm) const; -}; - +typedef void (*StackFunc)(VM*); struct FuncDecl { struct KwArg { diff --git a/src/vm.h b/src/vm.h index a6612a47..dcbf4222 100644 --- a/src/vm.h +++ b/src/vm.h @@ -414,11 +414,6 @@ inline PyObject* NativeFunc::operator()(VM* vm, ArgsView args) const{ return f(vm, args); } -inline void StackFunc::operator()(VM* vm) const{ - return f(vm); -} - - inline void CodeObject::optimize(VM* vm){ // uint32_t base_n = (uint32_t)(names.size() / kLocalsLoadFactor + 0.5); // perfect_locals_capacity = std::max(find_next_capacity(base_n), NameDict::__Capacity); @@ -866,6 +861,7 @@ inline void VM::init_builtin_types(){ tp_module = _new_type_object("module"); tp_function = _new_type_object("function"); tp_native_func = _new_type_object("native_func"); + tp_stack_func = _new_type_object("stack_func"); tp_iterator = _new_type_object("iterator"); tp_bound_method = _new_type_object("bound_method"); tp_super = _new_type_object("super");