This commit is contained in:
blueloveTH 2024-08-18 12:45:56 +08:00
parent 8720c22c8a
commit 8b0e1697c0
3 changed files with 11 additions and 9 deletions

View File

@ -76,10 +76,10 @@ bool pk_wrapper__self(int argc, py_Ref argv);
bool pk_wrapper__NotImplementedError(int argc, py_Ref argv); bool pk_wrapper__NotImplementedError(int argc, py_Ref argv);
typedef enum FrameResult { typedef enum FrameResult {
RES_RETURN, RES_ERROR = 0,
RES_CALL, RES_RETURN = 1,
RES_YIELD, RES_CALL = 2,
RES_ERROR, RES_YIELD = 3,
} FrameResult; } FrameResult;
FrameResult VM__run_top_frame(VM* self); FrameResult VM__run_top_frame(VM* self);

View File

@ -586,6 +586,7 @@ enum py_MagicNames {
}; };
enum py_PredefinedTypes { enum py_PredefinedTypes {
tp_nil = 0,
tp_object = 1, tp_object = 1,
tp_type, // py_Type tp_type, // py_Type
tp_int, tp_int,

View File

@ -346,7 +346,7 @@ static bool
return TypeError("%s() takes %d positional arguments but %d were given", return TypeError("%s() takes %d positional arguments but %d were given",
co->name->data, co->name->data,
decl_argc, decl_argc,
p1 - argv); (int)(p1 - argv));
} }
py_TValue* t = 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...] // [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) { if(p0->type == tp_function) {
/*****************_py_call*****************/
// check stack overflow // check stack overflow
if(self->stack.sp > self->stack.end) { if(self->stack.sp > self->stack.end) {
py_exception(tp_StackOverflowError, ""); 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)); memcpy(argv, self->__vectorcall_buffer, co->nlocals * sizeof(py_TValue));
// submit the call // submit the call
if(!fn->cfunc) { if(!fn->cfunc) {
// python function
VM__push_frame(self, Frame__new(co, &fn->module, p0, argv, true)); VM__push_frame(self, Frame__new(co, &fn->module, p0, argv, true));
return opcall ? RES_CALL : VM__run_top_frame(self); return opcall ? RES_CALL : VM__run_top_frame(self);
} else { } else {
// decl-based binding
bool ok = py_callcfunc(fn->cfunc, co->nlocals, argv); bool ok = py_callcfunc(fn->cfunc, co->nlocals, argv);
self->stack.sp = p0; self->stack.sp = p0;
return ok ? RES_RETURN : RES_ERROR; 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: case FuncType_SIMPLE:
if(p1 - argv != fn->decl->args.length) { if(p1 - argv != fn->decl->args.length) {
const char* fmt = "%s() takes %d positional arguments but %d were given"; 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; return RES_ERROR;
} }
if(kwargc) { if(kwargc) {
@ -634,7 +635,7 @@ void pk_print_stack(VM* self, Frame* frame, Bytecode byte) {
c11_sbuf__ctor(&buf); c11_sbuf__ctor(&buf);
for(py_Ref p = self->stack.begin; p != sp; p++) { for(py_Ref p = self->stack.begin; p != sp; p++) {
switch(p->type) { 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_int: c11_sbuf__write_i64(&buf, p->_i64); break;
case tp_float: c11_sbuf__write_f64(&buf, p->_f64, -1); 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; case tp_bool: c11_sbuf__write_cstr(&buf, p->_bool ? "True" : "False"); break;