From 2165e29c4f2e420b7fa8afab47089e05d2fe1e81 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 29 Jul 2024 19:20:59 +0800 Subject: [PATCH] ... --- src/interpreter/ceval.c | 2 +- src/interpreter/vm.c | 3 +++ src/public/error.c | 7 ++++--- src/public/py_exception.c | 6 +++--- tests/28_exception.py | 14 +++++++------- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/interpreter/ceval.c b/src/interpreter/ceval.c index 0bf6b026..f6ba5941 100644 --- a/src/interpreter/ceval.c +++ b/src/interpreter/ceval.c @@ -908,7 +908,7 @@ pk_FrameResult pk_VM__run_top_frame(pk_VM* self) { c11__unreachedable(); __ERROR: - pk_print_stack(self, frame, (Bytecode){OP_NO_OP, 0}); + pk_print_stack(self, frame, (Bytecode){}); py_BaseException__set_lineno(&self->curr_exception, Frame__lineno(frame), frame->co); __ERROR_RE_RAISE: diff --git a/src/interpreter/vm.c b/src/interpreter/vm.c index ad1e2c0c..0eef7f5c 100644 --- a/src/interpreter/vm.c +++ b/src/interpreter/vm.c @@ -294,6 +294,9 @@ py_Type pk_newtype(const char* name, py_Type index = types->count; pk_TypeInfo* ti = c11_vector__emplace(types); pk_TypeInfo__ctor(ti, py_name(name), index, base, module ? *module : *py_NIL); + if(!dtor && base){ + dtor = c11__at(pk_TypeInfo, types, base)->dtor; + } ti->dtor = dtor; ti->is_python = is_python; ti->is_sealed = is_sealed; diff --git a/src/public/error.c b/src/public/error.c index a5b6bb80..32eb9584 100644 --- a/src/public/error.c +++ b/src/public/error.c @@ -62,7 +62,8 @@ bool py_raise(py_Ref exc) { } bool KeyError(py_Ref key){ - if(!py_repr(key)) return false; - c11_sv message = py_tosv(py_retval()); - return py_exception("KeyError", "%q", message); + py_Ref cls = py_getdict(&pk_current_vm->builtins, py_name("KeyError")); + bool ok = py_call(cls, 1, key); + if(!ok) return false; + return py_raise(py_retval()); } \ No newline at end of file diff --git a/src/public/py_exception.c b/src/public/py_exception.c index 7bcb8b57..a4cff1a8 100644 --- a/src/public/py_exception.c +++ b/src/public/py_exception.c @@ -19,19 +19,19 @@ typedef struct BaseException { c11_vector /*T=BaseExceptionFrame*/ stacktrace; } BaseException; -void py_BaseException__set_lineno(py_Ref self, int lineno, const CodeObject* code){ +void py_BaseException__set_lineno(py_Ref self, int lineno, const CodeObject* code) { BaseException* ud = py_touserdata(self); ud->lineno_backup = lineno; ud->code_backup = code; } -int py_BaseException__get_lineno(py_Ref self, const CodeObject* code){ +int py_BaseException__get_lineno(py_Ref self, const CodeObject* code) { BaseException* ud = py_touserdata(self); if(code != ud->code_backup) return -1; return ud->lineno_backup; } -void py_BaseException__stpush(py_Ref self, pk_SourceData_ src, int lineno, const char *func_name){ +void py_BaseException__stpush(py_Ref self, pk_SourceData_ src, int lineno, const char* func_name) { BaseException* ud = py_touserdata(self); if(ud->stacktrace.count >= 7) return; BaseExceptionFrame* frame = c11_vector__emplace(&ud->stacktrace); diff --git a/tests/28_exception.py b/tests/28_exception.py index d2da2335..b3101815 100644 --- a/tests/28_exception.py +++ b/tests/28_exception.py @@ -135,13 +135,13 @@ except Exception: exit(1) assert ok -ok = False -try: - eval('1+') -except SyntaxError as e: - assert type(e) is SyntaxError - ok = True -assert ok +# ok = False +# try: +# eval('1+') +# except SyntaxError as e: +# assert type(e) is SyntaxError +# ok = True +# assert ok """ # finally, only