Compare commits

..

1 Commits

Author SHA1 Message Date
Tanisha Vasudeva
b33ac31726
Merge 6cc3d8023350163e72b83d49981ad2c4b08d39b4 into 35917fc5f4b25375169e5e2417ae659ef0528200 2026-03-06 11:11:04 +05:30
5 changed files with 16 additions and 13 deletions

View File

@ -63,8 +63,7 @@ typedef struct VM {
CachedNames cached_names;
py_StackRef curr_class;
py_StackRef curr_function;
py_StackRef curr_decl_based_function; // this is for get current function without frame
TraceInfo trace_info;
WatchdogInfo watchdog_info;
LineProfiler line_profiler;

View File

@ -391,9 +391,9 @@ PK_API void py_tphookattributes(py_Type type,
/************* Inspection *************/
/// Get the current `Callable` object on the stack of the most recent vectorcall.
/// Get the current `function` object on the stack.
/// Return `NULL` if not available.
/// NOTE: This function should be placed at the beginning of your bindings or you will get wrong result.
/// NOTE: This function should be placed at the beginning of your decl-based bindings.
PK_API py_StackRef py_inspect_currentfunction();
/// Get the current `module` object where the code is executed.
/// Return `NULL` if not available.

View File

@ -1244,7 +1244,7 @@ __ERROR:
__ERROR_RE_RAISE:
do {
self->curr_class = NULL;
self->curr_function = NULL;
self->curr_decl_based_function = NULL;
} while(0);
int target = Frame__goto_exception_handler(frame, &self->stack, &self->unhandled_exc);

View File

@ -103,8 +103,7 @@ void VM__ctor(VM* self) {
self->ctx = NULL;
self->curr_class = NULL;
self->curr_function = NULL;
self->curr_decl_based_function = NULL;
memset(&self->trace_info, 0, sizeof(TraceInfo));
memset(&self->watchdog_info, 0, sizeof(WatchdogInfo));
LineProfiler__ctor(&self->line_profiler);
@ -483,8 +482,8 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall
}
#endif
py_StackRef p1 = self->stack.sp - kwargc * 2;
py_StackRef p0 = p1 - argc - 2;
py_Ref p1 = self->stack.sp - kwargc * 2;
py_Ref p0 = p1 - argc - 2;
// [callable, <self>, args..., kwargs...]
// ^p0 ^p1 ^_sp
@ -497,8 +496,7 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall
// [unbound, self, args..., kwargs...]
}
py_StackRef argv = p0 + 1 + (int)py_isnil(p0 + 1);
self->curr_function = p0; // set current function for inspection
py_Ref argv = p0 + 1 + (int)py_isnil(p0 + 1);
if(p0->type == tp_function) {
Function* fn = py_touserdata(p0);
@ -518,8 +516,10 @@ 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,8 +545,10 @@ 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: {

View File

@ -3,8 +3,10 @@
py_StackRef py_inspect_currentfunction() {
VM* vm = pk_current_vm;
if(vm->curr_function >= vm->stack.sp) return NULL;
return vm->curr_function;
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;
}
py_GlobalRef py_inspect_currentmodule() {