added separate stack for c interop

This commit is contained in:
Kolten Pearson 2023-04-30 09:03:32 -06:00
parent 1fc08dae62
commit 7882d18df6
3 changed files with 34 additions and 1 deletions

View File

@ -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);

View File

@ -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;

View File

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