diff --git a/include/pocketpy/interpreter/vm.h b/include/pocketpy/interpreter/vm.h index d9d72683..0979226f 100644 --- a/include/pocketpy/interpreter/vm.h +++ b/include/pocketpy/interpreter/vm.h @@ -76,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_RETURN, - RES_CALL, - RES_YIELD, - RES_ERROR, + RES_ERROR = 0, + RES_RETURN = 1, + RES_CALL = 2, + RES_YIELD = 3, } FrameResult; FrameResult VM__run_top_frame(VM* self); diff --git a/include/pocketpy/pocketpy.h b/include/pocketpy/pocketpy.h index a6e7d8c6..f6b04d99 100644 --- a/include/pocketpy/pocketpy.h +++ b/include/pocketpy/pocketpy.h @@ -586,6 +586,7 @@ enum py_MagicNames { }; enum py_PredefinedTypes { + tp_nil = 0, tp_object = 1, tp_type, // py_Type tp_int, diff --git a/src/interpreter/vm.c b/src/interpreter/vm.c index 3bce47c4..b8631172 100644 --- a/src/interpreter/vm.c +++ b/src/interpreter/vm.c @@ -346,7 +346,7 @@ static bool return TypeError("%s() takes %d positional arguments but %d were given", co->name->data, decl_argc, - p1 - argv); + (int)(p1 - argv)); } py_TValue* t = argv; @@ -419,10 +419,9 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall // [unbound, self, args..., kwargs...] } - py_Ref argv = py_isnil(p0 + 1) ? p0 + 2 : p0 + 1; + py_Ref argv = p0 + 1 + (int)py_isnil(p0 + 1); if(p0->type == tp_function) { - /*****************_py_call*****************/ // check stack overflow if(self->stack.sp > self->stack.end) { py_exception(tp_StackOverflowError, ""); @@ -441,9 +440,11 @@ 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 bool ok = py_callcfunc(fn->cfunc, co->nlocals, argv); self->stack.sp = p0; return ok ? RES_RETURN : RES_ERROR; @@ -452,7 +453,7 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall 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, p1 - argv); + TypeError(fmt, co->name->data, fn->decl->args.length, (int)(p1 - argv)); return RES_ERROR; } if(kwargc) { @@ -634,7 +635,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 0: c11_sbuf__write_cstr(&buf, "nil"); break; + case tp_nil: 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;