Compare commits

..

No commits in common. "2d5e515ae74e5cbcaccb6ee2879322c26df8b1fc" and "8720c22c8ab57a2702c2ac5796c4d2fc39923ef4" have entirely different histories.

5 changed files with 14 additions and 20 deletions

View File

@ -51,8 +51,7 @@ typedef struct VM {
py_TValue reg[8]; // users' registers
py_StackRef __curr_class;
py_StackRef __curr_function;
py_TValue* __curr_class;
py_TValue __vectorcall_buffer[PK_MAX_CO_VARNAMES];
ManagedHeap heap;
@ -77,10 +76,10 @@ bool pk_wrapper__self(int argc, py_Ref argv);
bool pk_wrapper__NotImplementedError(int argc, py_Ref argv);
typedef enum FrameResult {
RES_ERROR = 0,
RES_RETURN = 1,
RES_CALL = 2,
RES_YIELD = 3,
RES_RETURN,
RES_CALL,
RES_YIELD,
RES_ERROR,
} FrameResult;
FrameResult VM__run_top_frame(VM* self);

View File

@ -310,9 +310,8 @@ PK_EXPORT void py_setslot(py_Ref self, int i, py_Ref val);
/************* Inspection *************/
/// Get the current `function` object on the stack.
/// Get the current `function` object from the stack.
/// Return `NULL` if not available.
/// NOTE: This function should be placed at the beginning of your decl-based bindings.
PK_EXPORT py_StackRef py_inspect_currentfunction();
/// Get the current `module` object where the code is executed.
/// Return `NULL` if not available.
@ -587,7 +586,6 @@ enum py_MagicNames {
};
enum py_PredefinedTypes {
tp_nil = 0,
tp_object = 1,
tp_type, // py_Type
tp_int,

View File

@ -70,7 +70,6 @@ void VM__ctor(VM* self) {
self->is_curr_exc_handled = false;
self->__curr_class = NULL;
self->__curr_function = NULL;
ManagedHeap__ctor(&self->heap, self);
ValueStack__ctor(&self->stack);
@ -347,7 +346,7 @@ static bool
return TypeError("%s() takes %d positional arguments but %d were given",
co->name->data,
decl_argc,
(int)(p1 - argv));
p1 - argv);
}
py_TValue* t = argv;
@ -420,9 +419,10 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall
// [unbound, self, args..., kwargs...]
}
py_Ref argv = p0 + 1 + (int)py_isnil(p0 + 1);
py_Ref argv = py_isnil(p0 + 1) ? p0 + 2 : p0 + 1;
if(p0->type == tp_function) {
/*****************_py_call*****************/
// check stack overflow
if(self->stack.sp > self->stack.end) {
py_exception(tp_StackOverflowError, "");
@ -441,22 +441,18 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall
memcpy(argv, self->__vectorcall_buffer, co->nlocals * sizeof(py_TValue));
// submit the call
if(!fn->cfunc) {
// python function
VM__push_frame(self, Frame__new(co, &fn->module, p0, argv, true));
return opcall ? RES_CALL : VM__run_top_frame(self);
} else {
// decl-based binding
self->__curr_function = p0;
bool ok = py_callcfunc(fn->cfunc, co->nlocals, argv);
self->stack.sp = p0;
self->__curr_function = NULL;
return ok ? RES_RETURN : RES_ERROR;
}
}
case FuncType_SIMPLE:
if(p1 - argv != fn->decl->args.length) {
const char* fmt = "%s() takes %d positional arguments but %d were given";
TypeError(fmt, co->name->data, fn->decl->args.length, (int)(p1 - argv));
TypeError(fmt, co->name->data, fn->decl->args.length, p1 - argv);
return RES_ERROR;
}
if(kwargc) {
@ -638,7 +634,7 @@ void pk_print_stack(VM* self, Frame* frame, Bytecode byte) {
c11_sbuf__ctor(&buf);
for(py_Ref p = self->stack.begin; p != sp; p++) {
switch(p->type) {
case tp_nil: c11_sbuf__write_cstr(&buf, "nil"); break;
case 0: c11_sbuf__write_cstr(&buf, "nil"); break;
case tp_int: c11_sbuf__write_i64(&buf, p->_i64); break;
case tp_float: c11_sbuf__write_f64(&buf, p->_f64, -1); break;
case tp_bool: c11_sbuf__write_cstr(&buf, p->_bool ? "True" : "False"); break;

View File

@ -153,7 +153,6 @@ void py_clearexc(py_StackRef p0) {
vm->curr_exception = *py_NIL;
vm->is_curr_exc_handled = false;
vm->__curr_class = NULL;
vm->__curr_function = NULL;
if(p0) vm->stack.sp = p0;
}

View File

@ -70,7 +70,9 @@ void py_setslot(py_Ref self, int i, py_Ref val) {
}
py_StackRef py_inspect_currentfunction(){
return pk_current_vm->__curr_function;
Frame* frame = pk_current_vm->top_frame;
if(!frame || !frame->has_function) return NULL;
return frame->p0;
}
py_GlobalRef py_inspect_currentmodule(){