From cf70668a2f4ea9984f0d6bddbe89eb39e01e5dcf Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Fri, 13 Mar 2026 22:05:52 +0800 Subject: [PATCH] improve `py_inspect_currentfunction` --- include/pocketpy/interpreter/vm.h | 3 ++- include/pocketpy/pocketpy.h | 4 ++-- src/interpreter/ceval.c | 2 +- src/interpreter/vm.c | 14 ++++++-------- src/public/Inspection.c | 6 ++---- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/include/pocketpy/interpreter/vm.h b/include/pocketpy/interpreter/vm.h index 6b765c40..1b3126ac 100644 --- a/include/pocketpy/interpreter/vm.h +++ b/include/pocketpy/interpreter/vm.h @@ -63,7 +63,8 @@ typedef struct VM { CachedNames cached_names; py_StackRef curr_class; - py_StackRef curr_decl_based_function; // this is for get current function without frame + py_StackRef curr_function; + TraceInfo trace_info; WatchdogInfo watchdog_info; LineProfiler line_profiler; diff --git a/include/pocketpy/pocketpy.h b/include/pocketpy/pocketpy.h index 4a470aab..b012234a 100644 --- a/include/pocketpy/pocketpy.h +++ b/include/pocketpy/pocketpy.h @@ -391,9 +391,9 @@ PK_API void py_tphookattributes(py_Type type, /************* Inspection *************/ -/// Get the current `function` object on the stack. +/// Get the current `Callable` object on the stack of the most recent vectorcall. /// Return `NULL` if not available. -/// NOTE: This function should be placed at the beginning of your decl-based bindings. +/// NOTE: This function should be placed at the beginning of your bindings or you will get wrong result. PK_API py_StackRef py_inspect_currentfunction(); /// Get the current `module` object where the code is executed. /// Return `NULL` if not available. diff --git a/src/interpreter/ceval.c b/src/interpreter/ceval.c index 6076464b..b0c877d1 100644 --- a/src/interpreter/ceval.c +++ b/src/interpreter/ceval.c @@ -1244,7 +1244,7 @@ __ERROR: __ERROR_RE_RAISE: do { self->curr_class = NULL; - self->curr_decl_based_function = NULL; + self->curr_function = NULL; } while(0); int target = Frame__goto_exception_handler(frame, &self->stack, &self->unhandled_exc); diff --git a/src/interpreter/vm.c b/src/interpreter/vm.c index 66a20476..f5573780 100644 --- a/src/interpreter/vm.c +++ b/src/interpreter/vm.c @@ -103,7 +103,8 @@ void VM__ctor(VM* self) { self->ctx = NULL; self->curr_class = NULL; - self->curr_decl_based_function = NULL; + self->curr_function = NULL; + memset(&self->trace_info, 0, sizeof(TraceInfo)); memset(&self->watchdog_info, 0, sizeof(WatchdogInfo)); LineProfiler__ctor(&self->line_profiler); @@ -482,8 +483,8 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall } #endif - py_Ref p1 = self->stack.sp - kwargc * 2; - py_Ref p0 = p1 - argc - 2; + py_StackRef p1 = self->stack.sp - kwargc * 2; + py_StackRef p0 = p1 - argc - 2; // [callable, , args..., kwargs...] // ^p0 ^p1 ^_sp @@ -496,7 +497,8 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall // [unbound, self, args..., kwargs...] } - py_Ref argv = p0 + 1 + (int)py_isnil(p0 + 1); + py_StackRef argv = p0 + 1 + (int)py_isnil(p0 + 1); + self->curr_function = p0; // set current function for inspection if(p0->type == tp_function) { Function* fn = py_touserdata(p0); @@ -516,10 +518,8 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall return opcall ? RES_CALL : VM__run_top_frame(self); } else { // decl-based binding - self->curr_decl_based_function = p0; bool ok = py_callcfunc(fn->cfunc, co->nlocals, argv); self->stack.sp = p0; - self->curr_decl_based_function = NULL; return ok ? RES_RETURN : RES_ERROR; } } @@ -545,10 +545,8 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall return opcall ? RES_CALL : VM__run_top_frame(self); } else { // decl-based binding - self->curr_decl_based_function = p0; bool ok = py_callcfunc(fn->cfunc, co->nlocals, argv); self->stack.sp = p0; - self->curr_decl_based_function = NULL; return ok ? RES_RETURN : RES_ERROR; } case FuncType_GENERATOR: { diff --git a/src/public/Inspection.c b/src/public/Inspection.c index adab739c..58d329bb 100644 --- a/src/public/Inspection.c +++ b/src/public/Inspection.c @@ -3,10 +3,8 @@ py_StackRef py_inspect_currentfunction() { VM* vm = pk_current_vm; - if(vm->curr_decl_based_function) return vm->curr_decl_based_function; - py_Frame* frame = vm->top_frame; - if(!frame || frame->is_locals_special) return NULL; - return frame->p0; + if(vm->curr_function >= vm->stack.sp) return NULL; + return vm->curr_function; } py_GlobalRef py_inspect_currentmodule() {