From 7882d18df66dcc537f0bec6dead3a92b8e61c6fa Mon Sep 17 00:00:00 2001 From: Kolten Pearson Date: Sun, 30 Apr 2023 09:03:32 -0600 Subject: [PATCH] added separate stack for c interop --- c_bindings/pocketpy_c.h | 2 +- src/frame.h | 32 ++++++++++++++++++++++++++++++++ src/vm.h | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/c_bindings/pocketpy_c.h b/c_bindings/pocketpy_c.h index 1bb96397..f800548f 100644 --- a/c_bindings/pocketpy_c.h +++ b/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); diff --git a/src/frame.h b/src/frame.h index 552fbfa5..91ee5bda 100644 --- a/src/frame.h +++ b/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; diff --git a/src/vm.h b/src/vm.h index ac50942a..97951a18 100644 --- a/src/vm.h +++ b/src/vm.h @@ -78,6 +78,7 @@ class VM { public: ManagedHeap heap; ValueStack s_data; + CVirtualStack c_data; stack< Frame > callstack; std::vector _all_types;