diff --git a/include/pocketpy/error.h b/include/pocketpy/error.h index 076b6cbd..2c3bfabd 100644 --- a/include/pocketpy/error.h +++ b/include/pocketpy/error.h @@ -89,9 +89,10 @@ struct Exception { }; struct TopLevelException: std::exception{ + VM* vm; Exception* ptr; - TopLevelException(Exception* ptr): ptr(ptr) {} - + TopLevelException(VM* vm, Exception* ptr): vm(vm), ptr(ptr) {} + Str summary() const { return ptr->summary(); } const char* what() const noexcept override { diff --git a/src/ceval.cpp b/src/ceval.cpp index 60fd5d84..f820e5e3 100644 --- a/src/ceval.cpp +++ b/src/ceval.cpp @@ -1057,7 +1057,7 @@ __NEXT_STEP: __pop_frame(); if(callstack.empty()){ // propagate to the top level - throw TopLevelException(&_e); + throw TopLevelException(this, &_e); } frame = &callstack.top(); PUSH(__last_exception); diff --git a/src/compiler.cpp b/src/compiler.cpp index 0aa22247..ac93d8b0 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -1379,7 +1379,7 @@ __EAT_DOTS_END: vm->__last_exception = vm->call(vm->builtins->attr(type), VAR(msg)).get(); Exception& e = vm->__last_exception->as(); e.st_push(src, lineno, cursor, ""); - throw TopLevelException(&e); + throw TopLevelException(vm, &e); } std::string_view TokenDeserializer::read_string(char c){ diff --git a/src/vm.cpp b/src/vm.cpp index 78ab4595..90002289 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -1442,7 +1442,7 @@ void VM::_error(PyVar e_obj){ if(callstack.empty()){ e.is_re = false; __last_exception = e_obj.get(); - throw TopLevelException(&e); + throw TopLevelException(this, &e); } PUSH(e_obj); __raise_exc();