mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20: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);
|
void pkpy_vm_destroy(pkpy_vm vm);
|
||||||
|
|
||||||
////////binding a c function to pocketpy
|
////////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_cfunction(pkpy_vm, pkpy_cfunction);
|
||||||
void pkpy_push_int(pkpy_vm, int64_t);
|
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;
|
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 {
|
struct Frame {
|
||||||
int _ip = -1;
|
int _ip = -1;
|
||||||
int _next_ip = 0;
|
int _next_ip = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user