diff --git a/include/pocketpy/vm.h b/include/pocketpy/vm.h index 76fb6a3c..f3865fc8 100644 --- a/include/pocketpy/vm.h +++ b/include/pocketpy/vm.h @@ -167,9 +167,6 @@ public: void set_main_argv(int argc, char** argv); - void __breakpoint(); - void __pop_frame(); - PyObject* py_str(PyObject* obj); PyObject* py_repr(PyObject* obj); PyObject* py_json(PyObject* obj); @@ -300,29 +297,25 @@ public: PyObject* __minmax_reduce(bool (VM::*op)(PyObject*, PyObject*), PyObject* args, PyObject* key); /***** Error Reporter *****/ - void __raise_exc(bool re_raise=false); - - void _builtin_error(StrName type); - void _builtin_error(StrName type, PyObject* arg); - void _builtin_error(StrName type, const Str& msg); - - void StackOverflowError() { _builtin_error("StackOverflowError"); } - void IOError(const Str& msg) { _builtin_error("IOError", msg); } - void NotImplementedError(){ _builtin_error("NotImplementedError"); } - void TypeError(const Str& msg){ _builtin_error("TypeError", msg); } - void IndexError(const Str& msg){ _builtin_error("IndexError", msg); } - void ValueError(const Str& msg){ _builtin_error("ValueError", msg); } - void RuntimeError(const Str& msg){ _builtin_error("RuntimeError", msg); } - void ZeroDivisionError(const Str& msg){ _builtin_error("ZeroDivisionError", msg); } - void ZeroDivisionError(){ _builtin_error("ZeroDivisionError", "division by zero"); } - void NameError(StrName name){ _builtin_error("NameError", _S("name ", name.escape() + " is not defined")); } - void UnboundLocalError(StrName name){ _builtin_error("UnboundLocalError", _S("local variable ", name.escape() + " referenced before assignment")); } - void KeyError(PyObject* obj){ _builtin_error("KeyError", obj); } - void ImportError(const Str& msg){ _builtin_error("ImportError", msg); } + void StackOverflowError() { __builtin_error("StackOverflowError"); } + void IOError(const Str& msg) { __builtin_error("IOError", msg); } + void NotImplementedError(){ __builtin_error("NotImplementedError"); } + void TypeError(const Str& msg){ __builtin_error("TypeError", msg); } + void IndexError(const Str& msg){ __builtin_error("IndexError", msg); } + void ValueError(const Str& msg){ __builtin_error("ValueError", msg); } + void RuntimeError(const Str& msg){ __builtin_error("RuntimeError", msg); } + void ZeroDivisionError(const Str& msg){ __builtin_error("ZeroDivisionError", msg); } + void ZeroDivisionError(){ __builtin_error("ZeroDivisionError", "division by zero"); } + void NameError(StrName name){ __builtin_error("NameError", _S("name ", name.escape() + " is not defined")); } + void UnboundLocalError(StrName name){ __builtin_error("UnboundLocalError", _S("local variable ", name.escape() + " referenced before assignment")); } + void KeyError(PyObject* obj){ __builtin_error("KeyError", obj); } + void ImportError(const Str& msg){ __builtin_error("ImportError", msg); } + void AssertionError(const Str& msg){ __builtin_error("AssertionError", msg); } + void AssertionError(){ __builtin_error("AssertionError"); } void BinaryOptError(const char* op, PyObject* _0, PyObject* _1); void AttributeError(PyObject* obj, StrName name); - void AttributeError(const Str& msg){ _builtin_error("AttributeError", msg); } + void AttributeError(const Str& msg){ __builtin_error("AttributeError", msg); } void check_type(PyObject* obj, Type type){ if(is_type(obj, type)) return; @@ -376,13 +369,10 @@ public: ImportContext _import_context; PyObject* py_import(Str path, bool throw_err=true); - virtual ~VM(); - + #if PK_DEBUG_CEVAL_STEP void _log_s_data(const char* title = nullptr); #endif - void __unpack_as_list(ArgsView args, List& list); - void __unpack_as_dict(ArgsView args, Dict& dict); PyObject* vectorcall(int ARGC, int KWARGC=0, bool op_call=false); PyObject* py_negate(PyObject* obj); bool py_bool(PyObject* obj); @@ -390,8 +380,6 @@ public: PyObject* py_list(PyObject*); PyObject* new_module(Str name, Str package=""); Str disassemble(CodeObject_ co); - void __init_builtin_types(); - void __post_init_builtin_types(); PyObject* getattr(PyObject* obj, StrName name, bool throw_err=true); void delattr(PyObject* obj, StrName name); PyObject* get_unbound_method(PyObject* obj, StrName name, PyObject** self, bool throw_err=true, bool fallback=false); @@ -404,11 +392,7 @@ public: template PyObject* bind_func(PyObject*, StrName, NativeFuncC, UserData userdata={}, BindType bt=BindType::DEFAULT); void _error(PyObject*); - PyObject* __run_top_frame(); - PyObject* __format_string(Str, PyObject*); - PyObject* __py_generator(Frame&& frame, ArgsView buffer); - void __op_unpack_sequence(uint16_t arg); - void __prepare_py_call(PyObject**, ArgsView, ArgsView, const FuncDecl_&); + // new style binding api PyObject* bind(PyObject*, const char*, const char*, NativeFuncC, UserData userdata={}, BindType bt=BindType::DEFAULT); PyObject* bind(PyObject*, const char*, NativeFuncC, UserData userdata={}, BindType bt=BindType::DEFAULT); @@ -452,6 +436,25 @@ public: } return it->second; } + + virtual ~VM(); + + /***** Private *****/ + void __breakpoint(); + void __pop_frame(); + PyObject* __run_top_frame(); + PyObject* __format_string(Str, PyObject*); + PyObject* __py_generator(Frame&& frame, ArgsView buffer); + void __op_unpack_sequence(uint16_t arg); + void __prepare_py_call(PyObject**, ArgsView, ArgsView, const FuncDecl_&); + void __unpack_as_list(ArgsView args, List& list); + void __unpack_as_dict(ArgsView args, Dict& dict); + void __raise_exc(bool re_raise=false); + void __init_builtin_types(); + void __post_init_builtin_types(); + void __builtin_error(StrName type); + void __builtin_error(StrName type, PyObject* arg); + void __builtin_error(StrName type, const Str& msg); }; diff --git a/src/ceval.cpp b/src/ceval.cpp index e99601d4..d1945e3e 100644 --- a/src/ceval.cpp +++ b/src/ceval.cpp @@ -927,16 +927,16 @@ __NEXT_STEP:; TOP() = call(TOP()); } if(!isinstance(TOP(), tp_exception)){ - _builtin_error("TypeError", "exceptions must derive from Exception"); + TypeError("exceptions must derive from Exception"); } _error(POPX()); } DISPATCH(); case OP_RAISE_ASSERT: if(byte.arg){ PyObject* _0 = py_str(POPX()); - _builtin_error("AssertionError", CAST(Str, _0)); + AssertionError(CAST(Str, _0)); }else{ - _builtin_error("AssertionError"); + AssertionError(); } DISPATCH(); case OP_RE_RAISE: __raise_exc(true); DISPATCH(); diff --git a/src/vm.cpp b/src/vm.cpp index 452dc80c..ef885565 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -1268,9 +1268,9 @@ PyObject* VM::bind_property(PyObject* obj, const char* name, NativeFuncC fget, N return prop; } -void VM::_builtin_error(StrName type){ _error(call(builtins->attr(type))); } -void VM::_builtin_error(StrName type, PyObject* arg){ _error(call(builtins->attr(type), arg)); } -void VM::_builtin_error(StrName type, const Str& msg){ _builtin_error(type, VAR(msg)); } +void VM::__builtin_error(StrName type){ _error(call(builtins->attr(type))); } +void VM::__builtin_error(StrName type, PyObject* arg){ _error(call(builtins->attr(type), arg)); } +void VM::__builtin_error(StrName type, const Str& msg){ __builtin_error(type, VAR(msg)); } void VM::BinaryOptError(const char* op, PyObject* _0, PyObject* _1) { StrName name_0 = _type_name(vm, _tp(_0)); @@ -1280,9 +1280,9 @@ void VM::BinaryOptError(const char* op, PyObject* _0, PyObject* _1) { void VM::AttributeError(PyObject* obj, StrName name){ if(isinstance(obj, vm->tp_type)){ - _builtin_error("AttributeError", _S("type object ", _type_name(vm, PK_OBJ_GET(Type, obj)).escape(), " has no attribute ", name.escape())); + __builtin_error("AttributeError", _S("type object ", _type_name(vm, PK_OBJ_GET(Type, obj)).escape(), " has no attribute ", name.escape())); }else{ - _builtin_error("AttributeError", _S(_type_name(vm, _tp(obj)).escape(), " object has no attribute ", name.escape())); + __builtin_error("AttributeError", _S(_type_name(vm, _tp(obj)).escape(), " object has no attribute ", name.escape())); } }