mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
This commit is contained in:
parent
874c009072
commit
742014c332
@ -49,9 +49,9 @@ namespace pkpy{
|
|||||||
typedef PyObject* (*BinaryFuncC)(VM*, PyObject*, PyObject*);
|
typedef PyObject* (*BinaryFuncC)(VM*, PyObject*, PyObject*);
|
||||||
|
|
||||||
struct PyTypeInfo{
|
struct PyTypeInfo{
|
||||||
PyObject* obj;
|
PyObject* obj; // never be garbage collected
|
||||||
Type base;
|
Type base;
|
||||||
PyObject* mod;
|
PyObject* mod; // never be garbage collected
|
||||||
Str name;
|
Str name;
|
||||||
bool subclass_enabled;
|
bool subclass_enabled;
|
||||||
|
|
||||||
@ -353,17 +353,7 @@ public:
|
|||||||
_error(Exception(name, msg));
|
_error(Exception(name, msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _raise(bool re_raise=false){
|
void _raise(bool re_raise=false);
|
||||||
Frame* top = top_frame().get();
|
|
||||||
if(!re_raise){
|
|
||||||
Exception& e = PK_OBJ_GET(Exception, s_data.top());
|
|
||||||
e._ip_on_error = top->_ip;
|
|
||||||
e._code_on_error = (void*)top->co;
|
|
||||||
}
|
|
||||||
bool ok = top->jump_to_exception_handler();
|
|
||||||
if(ok) throw HandledException();
|
|
||||||
else throw UnhandledException();
|
|
||||||
}
|
|
||||||
|
|
||||||
void StackOverflowError() { _error("StackOverflowError", ""); }
|
void StackOverflowError() { _error("StackOverflowError", ""); }
|
||||||
void IOError(const Str& msg) { _error("IOError", msg); }
|
void IOError(const Str& msg) { _error("IOError", msg); }
|
||||||
|
12
src/vm.cpp
12
src/vm.cpp
@ -1078,6 +1078,18 @@ void VM::_error(Exception e){
|
|||||||
_raise();
|
_raise();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VM::_raise(bool re_raise){
|
||||||
|
Frame* top = top_frame().get();
|
||||||
|
if(!re_raise){
|
||||||
|
Exception& e = PK_OBJ_GET(Exception, s_data.top());
|
||||||
|
e._ip_on_error = top->_ip;
|
||||||
|
e._code_on_error = (void*)top->co;
|
||||||
|
}
|
||||||
|
bool ok = top->jump_to_exception_handler();
|
||||||
|
if(ok) throw HandledException();
|
||||||
|
else throw UnhandledException();
|
||||||
|
}
|
||||||
|
|
||||||
void ManagedHeap::mark() {
|
void ManagedHeap::mark() {
|
||||||
for(PyObject* obj: _no_gc) PK_OBJ_MARK(obj);
|
for(PyObject* obj: _no_gc) PK_OBJ_MARK(obj);
|
||||||
for(auto& frame : vm->callstack.data()) frame._gc_mark();
|
for(auto& frame : vm->callstack.data()) frame._gc_mark();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user