Index: generic/xotclStack.c =================================================================== diff -u -rae922ee26ff2c658d5d0c3b8b98b71ab2f8bb4f9 -rd8cfbde70910574be327e506ba621cb3845e5cef --- generic/xotclStack.c (.../xotclStack.c) (revision ae922ee26ff2c658d5d0c3b8b98b71ab2f8bb4f9) +++ generic/xotclStack.c (.../xotclStack.c) (revision d8cfbde70910574be327e506ba621cb3845e5cef) @@ -35,7 +35,7 @@ } XOTclCallStackContent * -XOTclCallStackFindLastInvocation(Tcl_Interp *interp, int offset) { +XOTclCallStackFindLastInvocation(Tcl_Interp *interp, int offset, Tcl_CallFrame **framePtrPtr) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; register XOTclCallStackContent *csc = cs->top; int topLevel = csc->currentFramePtr ? Tcl_CallFrame_level(csc->currentFramePtr) : 0; @@ -53,15 +53,18 @@ else { /* fprintf(stderr, "csc %p offset ok, deeper=%d\n",csc,deeper); */ if (!deeper || cs->top->callType & XOTCL_CSC_CALL_IS_GUARD) { + if (framePtrPtr) *framePtrPtr = csc->currentFramePtr; return csc; } if (csc->currentFramePtr && Tcl_CallFrame_level(csc->currentFramePtr) < topLevel) { + if (framePtrPtr) *framePtrPtr = csc->currentFramePtr; return csc; } } } /* for some reasons, we could not find invocation (topLevel, destroy) */ /* fprintf(stderr, "csc %p could not find invocation\n",csc);*/ + if (framePtrPtr) *framePtrPtr = NULL; return NULL; } @@ -96,7 +99,6 @@ /*fprintf(stderr,"CallStackUseActiveFrames inframe %p varFrame %p activeFrame %p lvl %d\n", inFramePtr,varFramePtr,activeFramePtr, Tcl_CallFrame_level(inFramePtr));*/ - if (activeFramePtr == varFramePtr || active == top || Tcl_CallFrame_level(inFramePtr) == 0) { /* top frame is a active frame, or we could not find a calling frame */ framePtr = varFramePtr;