Browse Source

added separate stack for c interop

Kolten Pearson 2 years ago
parent
commit
7882d18df6
3 changed files with 34 additions and 1 deletions
  1. 1 1
      c_bindings/pocketpy_c.h
  2. 32 0
      src/frame.h
  3. 1 0
      src/vm.h

+ 1 - 1
c_bindings/pocketpy_c.h

@@ -15,7 +15,7 @@ void pkpy_vm_exec(pkpy_vm vm_handle, const char* source);
 void pkpy_vm_destroy(pkpy_vm vm);
 
 ////////binding a c function to pocketpy
-typedef void (*pkpy_cfunction)(pkpy_vm); 
+typedef int (*pkpy_cfunction)(pkpy_vm); 
 
 void pkpy_push_cfunction(pkpy_vm, pkpy_cfunction);
 void pkpy_push_int(pkpy_vm, int64_t);

+ 32 - 0
src/frame.h

@@ -98,6 +98,38 @@ struct ValueStack {
     ValueStack& operator=(ValueStack&&) = delete;
 };
 
+//stack for working with c bindings
+struct CVirtualStack {
+    static const size_t MAX_SIZE = 256;
+    // We allocate 512 more bytes to keep `_sp` valid when `is_overflow() == true`.
+    PyObject* _begin[MAX_SIZE];
+    PyObject** _sp;
+
+    CVirtualStack(): _sp(_begin) {}
+
+    PyObject* top() const { return _sp[-1]; }
+    PyObject* peek(int n) const { return _sp[-n]; }
+    void push(PyObject* v){ *_sp++ = v; }
+    void pop(){ --_sp; }
+    void shrink(int n){ _sp -= n; }
+    int size() const { return _sp - _begin; }
+    bool empty() const { return _sp == _begin; }
+    PyObject** begin() { return _begin; }
+    PyObject** end() { return _sp; }
+    void reset(PyObject** sp) {
+#if DEBUG_EXTRA_CHECK
+        if(sp < _begin || sp > _begin + MAX_SIZE) FATAL_ERROR();
+#endif
+        _sp = sp;
+    }
+    void clear() { _sp = _begin; }
+    
+    ValueStack(const ValueStack&) = delete;
+    ValueStack(ValueStack&&) = delete;
+    ValueStack& operator=(const ValueStack&) = delete;
+    ValueStack& operator=(ValueStack&&) = delete;
+};
+
 struct Frame {
     int _ip = -1;
     int _next_ip = 0;

+ 1 - 0
src/vm.h

@@ -78,6 +78,7 @@ class VM {
 public:
     ManagedHeap heap;
     ValueStack s_data;
+    CVirtualStack c_data;
     stack< Frame > callstack;
     std::vector<PyTypeInfo> _all_types;