mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
This commit is contained in:
parent
7ca97f03a7
commit
56097f6927
@ -7,12 +7,6 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define PK_INLINE inline
|
|
||||||
#else
|
|
||||||
#define PK_INLINE static inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PK_REGION(name) 1
|
#define PK_REGION(name) 1
|
||||||
|
|
||||||
#define PK_SLICE_LOOP(i, start, stop, step) \
|
#define PK_SLICE_LOOP(i, start, stop, step) \
|
||||||
|
@ -38,38 +38,26 @@ typedef struct Frame {
|
|||||||
struct Frame* f_back;
|
struct Frame* f_back;
|
||||||
const Bytecode* ip;
|
const Bytecode* ip;
|
||||||
const CodeObject* co;
|
const CodeObject* co;
|
||||||
py_TValue module; // weak ref
|
py_TValue module; // weak ref
|
||||||
PyObject* function; // a function object or NULL (global scope)
|
py_StackRef function; // a function object or NULL (global scope)
|
||||||
py_TValue* p0; // unwinding base
|
py_StackRef p0; // unwinding base
|
||||||
py_TValue* locals; // locals base
|
py_StackRef locals; // locals base
|
||||||
const CodeObject* locals_co;
|
const CodeObject* locals_co;
|
||||||
UnwindTarget* uw_list;
|
UnwindTarget* uw_list;
|
||||||
} Frame;
|
} Frame;
|
||||||
|
|
||||||
Frame* Frame__new(const CodeObject* co,
|
Frame* Frame__new(const CodeObject* co,
|
||||||
py_TValue* module,
|
py_TValue* module,
|
||||||
const py_TValue* function,
|
py_StackRef function,
|
||||||
py_TValue* p0,
|
py_StackRef p0,
|
||||||
py_TValue* locals,
|
py_StackRef locals,
|
||||||
const CodeObject* locals_co);
|
const CodeObject* locals_co);
|
||||||
void Frame__delete(Frame* self);
|
void Frame__delete(Frame* self);
|
||||||
|
|
||||||
PK_INLINE int Frame__ip(const Frame* self) { return self->ip - (Bytecode*)self->co->codes.data; }
|
int Frame__ip(const Frame* self);
|
||||||
|
int Frame__lineno(const Frame* self);
|
||||||
PK_INLINE int Frame__lineno(const Frame* self) {
|
int Frame__iblock(const Frame* self);
|
||||||
int ip = Frame__ip(self);
|
py_TValue* Frame__f_locals_try_get(Frame* self, py_Name name);
|
||||||
return c11__getitem(BytecodeEx, &self->co->codes_ex, ip).lineno;
|
|
||||||
}
|
|
||||||
|
|
||||||
PK_INLINE int Frame__iblock(const Frame* self) {
|
|
||||||
int ip = Frame__ip(self);
|
|
||||||
return c11__getitem(BytecodeEx, &self->co->codes_ex, ip).iblock;
|
|
||||||
}
|
|
||||||
|
|
||||||
PK_INLINE py_TValue* Frame__f_locals_try_get(Frame* self, py_Name name) {
|
|
||||||
return FastLocals__try_get_by_name(self->locals, self->locals_co, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
py_TValue* Frame__f_closure_try_get(Frame* self, py_Name name);
|
py_TValue* Frame__f_closure_try_get(Frame* self, py_Name name);
|
||||||
|
|
||||||
int Frame__prepare_jump_exception_handler(Frame* self, ValueStack*);
|
int Frame__prepare_jump_exception_handler(Frame* self, ValueStack*);
|
||||||
|
@ -246,6 +246,12 @@ py_ObjectRef py_getslot(py_Ref self, int i);
|
|||||||
/// Set the i-th slot of the object.
|
/// Set the i-th slot of the object.
|
||||||
void py_setslot(py_Ref self, int i, py_Ref val);
|
void py_setslot(py_Ref self, int i, py_Ref val);
|
||||||
|
|
||||||
|
/************* Inspection *************/
|
||||||
|
|
||||||
|
/// Get the current `function` object from the stack.
|
||||||
|
/// Return `NULL` if not available.
|
||||||
|
py_StackRef py_inspect_currentfunction();
|
||||||
|
|
||||||
/************* Bindings *************/
|
/************* Bindings *************/
|
||||||
|
|
||||||
/// Bind a function to the object via "decl-based" style.
|
/// Bind a function to the object via "decl-based" style.
|
||||||
|
@ -36,9 +36,9 @@ void UnwindTarget__delete(UnwindTarget* self) { free(self); }
|
|||||||
|
|
||||||
Frame* Frame__new(const CodeObject* co,
|
Frame* Frame__new(const CodeObject* co,
|
||||||
py_TValue* module,
|
py_TValue* module,
|
||||||
const py_TValue* function,
|
py_StackRef function,
|
||||||
py_TValue* p0,
|
py_StackRef p0,
|
||||||
py_TValue* locals,
|
py_StackRef locals,
|
||||||
const CodeObject* locals_co) {
|
const CodeObject* locals_co) {
|
||||||
static_assert(sizeof(Frame) <= kPoolFrameBlockSize, "!(sizeof(Frame) <= kPoolFrameBlockSize)");
|
static_assert(sizeof(Frame) <= kPoolFrameBlockSize, "!(sizeof(Frame) <= kPoolFrameBlockSize)");
|
||||||
Frame* self = PoolFrame_alloc();
|
Frame* self = PoolFrame_alloc();
|
||||||
@ -46,7 +46,7 @@ Frame* Frame__new(const CodeObject* co,
|
|||||||
self->ip = (Bytecode*)co->codes.data - 1;
|
self->ip = (Bytecode*)co->codes.data - 1;
|
||||||
self->co = co;
|
self->co = co;
|
||||||
self->module = *module;
|
self->module = *module;
|
||||||
self->function = function ? function->_obj : NULL;
|
self->function = function;
|
||||||
self->p0 = p0;
|
self->p0 = p0;
|
||||||
self->locals = locals;
|
self->locals = locals;
|
||||||
self->locals_co = locals_co;
|
self->locals_co = locals_co;
|
||||||
@ -133,7 +133,23 @@ void Frame__set_unwind_target(Frame* self, py_TValue* sp) {
|
|||||||
|
|
||||||
py_TValue* Frame__f_closure_try_get(Frame* self, py_Name name) {
|
py_TValue* Frame__f_closure_try_get(Frame* self, py_Name name) {
|
||||||
if(self->function == NULL) return NULL;
|
if(self->function == NULL) return NULL;
|
||||||
Function* ud = PyObject__userdata(self->function);
|
Function* ud = py_touserdata(self->function);
|
||||||
if(ud->closure == NULL) return NULL;
|
if(ud->closure == NULL) return NULL;
|
||||||
return NameDict__try_get(ud->closure, name);
|
return NameDict__try_get(ud->closure, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Frame__ip(const Frame* self) { return self->ip - (Bytecode*)self->co->codes.data; }
|
||||||
|
|
||||||
|
int Frame__lineno(const Frame* self) {
|
||||||
|
int ip = Frame__ip(self);
|
||||||
|
return c11__getitem(BytecodeEx, &self->co->codes_ex, ip).lineno;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Frame__iblock(const Frame* self) {
|
||||||
|
int ip = Frame__ip(self);
|
||||||
|
return c11__getitem(BytecodeEx, &self->co->codes_ex, ip).iblock;
|
||||||
|
}
|
||||||
|
|
||||||
|
py_TValue* Frame__f_locals_try_get(Frame* self, py_Name name) {
|
||||||
|
return FastLocals__try_get_by_name(self->locals, self->locals_co, name);
|
||||||
}
|
}
|
@ -559,7 +559,6 @@ void ManagedHeap__mark(ManagedHeap* self) {
|
|||||||
// mark frame
|
// mark frame
|
||||||
for(Frame* frame = vm->top_frame; frame; frame = frame->f_back) {
|
for(Frame* frame = vm->top_frame; frame; frame = frame->f_back) {
|
||||||
mark_value(&frame->module);
|
mark_value(&frame->module);
|
||||||
if(frame->function) mark_object(frame->function);
|
|
||||||
}
|
}
|
||||||
// mark vm's registers
|
// mark vm's registers
|
||||||
mark_value(&vm->last_retval);
|
mark_value(&vm->last_retval);
|
||||||
|
@ -491,8 +491,7 @@ static bool super__new__(int argc, py_Ref argv) {
|
|||||||
if(argc == 1) {
|
if(argc == 1) {
|
||||||
// super()
|
// super()
|
||||||
if(frame->function) {
|
if(frame->function) {
|
||||||
// class_arg = PK_OBJ_GET(Function, frame->_callable)._class;
|
Function* func = py_touserdata(frame->function);
|
||||||
Function* func = PyObject__userdata(frame->function);
|
|
||||||
*class_arg = *(py_Type*)PyObject__userdata(func->clazz);
|
*class_arg = *(py_Type*)PyObject__userdata(func->clazz);
|
||||||
if(frame->locals_co->nlocals > 0) self_arg = &frame->locals[0];
|
if(frame->locals_co->nlocals > 0) self_arg = &frame->locals[0];
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,12 @@ void py_setslot(py_Ref self, int i, py_Ref val) {
|
|||||||
PyObject__slots(self->_obj)[i] = *val;
|
PyObject__slots(self->_obj)[i] = *val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
py_StackRef py_inspect_currentfunction(){
|
||||||
|
Frame* frame = pk_current_vm->top_frame;
|
||||||
|
if(!frame) return NULL;
|
||||||
|
return frame->function;
|
||||||
|
}
|
||||||
|
|
||||||
void py_assign(py_Ref dst, py_Ref src) { *dst = *src; }
|
void py_assign(py_Ref dst, py_Ref src) { *dst = *src; }
|
||||||
|
|
||||||
/* Stack References */
|
/* Stack References */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user