Parcourir la source

basic proof of concept working

Kolten Pearson il y a 2 ans
Parent
commit
f701cc1e67
7 fichiers modifiés avec 49 ajouts et 20 suppressions
  1. 4 4
      build_c.sh
  2. 11 1
      c_bindings/main.c
  3. 27 1
      c_bindings/pocketpy_c.cpp
  4. 4 0
      c_bindings/pocketpy_c.h
  5. 1 1
      src/frame.h
  6. 1 8
      src/obj.h
  7. 1 5
      src/vm.h

+ 4 - 4
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

+ 11 - 1
c_bindings/main.c

@@ -1,4 +1,5 @@
 #include "pocketpy_c.h"
+#include <stdio.h>
 
 
 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;
 }

+ 27 - 1
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<int>(vm, o);
+}
 

+ 4 - 0
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);
 
 
 

+ 1 - 1
src/frame.h

@@ -188,4 +188,4 @@ struct Frame {
     }
 };
 
-}; // namespace pkpy
+}; // namespace pkpy

+ 1 - 8
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 {

+ 1 - 5
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");