Index: generic/nsfStack.c =================================================================== diff -u -r236b6dfeb5bc9a7fa81e596f9f5d0bb7dfa6ea9e -r1d47bd9661fd8d641c0c8441f6def1081902c9db --- generic/nsfStack.c (.../nsfStack.c) (revision 236b6dfeb5bc9a7fa81e596f9f5d0bb7dfa6ea9e) +++ generic/nsfStack.c (.../nsfStack.c) (revision 1d47bd9661fd8d641c0c8441f6def1081902c9db) @@ -388,6 +388,38 @@ return NULL; } +static Tcl_CallFrame* CallStackGetFrame(Tcl_Interp *interp, + Tcl_CallFrame *startFrame, + int skip) nonnull(1); + +static Tcl_CallFrame* CallStackGetFrame(Tcl_Interp *interp, + Tcl_CallFrame *startFrame, + int skip) { + register Tcl_CallFrame *varFramePtr; + + assert(interp); + + /* NsfShowStack(interp); */ + + if (startFrame == NULL) { + varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); + } else { + varFramePtr = startFrame; + } + + while(skip-- && varFramePtr != NULL) { + varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr); + } + + for (; varFramePtr; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { + if (Tcl_CallFrame_isProcCallFrame(varFramePtr) & (FRAME_IS_NSF_METHOD|FRAME_IS_NSF_CMETHOD)) { + return varFramePtr; + } + } + + return NULL; +} + /* *---------------------------------------------------------------------- * CallStackGetTopFrame, CallStackGetTopFrame0, NsfCallStackGetTopFrame --