mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
added separate stack for c interop
This commit is contained in:
parent
1fc08dae62
commit
7882d18df6
@ -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
src/frame.h
32
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user