Index: generic/xotclStack85.c =================================================================== diff -u -rae922ee26ff2c658d5d0c3b8b98b71ab2f8bb4f9 -rd8cfbde70910574be327e506ba621cb3845e5cef --- generic/xotclStack85.c (.../xotclStack85.c) (revision ae922ee26ff2c658d5d0c3b8b98b71ab2f8bb4f9) +++ generic/xotclStack85.c (.../xotclStack85.c) (revision d8cfbde70910574be327e506ba621cb3845e5cef) @@ -75,25 +75,27 @@ #endif XOTclCallStackContent * -XOTclCallStackFindLastInvocation(Tcl_Interp *interp, int offset) { +XOTclCallStackFindLastInvocation(Tcl_Interp *interp, int offset, Tcl_CallFrame **framePtrPtr) { register Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); - int topLevel = Tcl_CallFrame_level(varFramePtr); + int lvl = Tcl_CallFrame_level(varFramePtr); for (; varFramePtr; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { if (Tcl_CallFrame_isProcCallFrame(varFramePtr) & (FRAME_IS_XOTCL_METHOD|FRAME_IS_XOTCL_CMETHOD)) { XOTclCallStackContent *csc = (XOTclCallStackContent *)Tcl_CallFrame_clientData(varFramePtr); if ((csc->callType & XOTCL_CSC_CALL_IS_NEXT) || (csc->frameType & XOTCL_CSC_TYPE_INACTIVE)) { continue; } - if (offset) + if (offset) { offset--; - else { - if (Tcl_CallFrame_level(varFramePtr) < topLevel) { + } else { + if (Tcl_CallFrame_level(varFramePtr) < lvl) { + if (framePtrPtr) *framePtrPtr = varFramePtr; return csc; } } } } + if (framePtrPtr) *framePtrPtr = NULL; return NULL; }