Index: generic/nsfStack.c =================================================================== diff -u -r7c4f1e31560a0f40749b954c2e9af64ae9110cdc -ra58654d068b1dbd5395f9d26884a70a95363c892 --- generic/nsfStack.c (.../nsfStack.c) (revision 7c4f1e31560a0f40749b954c2e9af64ae9110cdc) +++ generic/nsfStack.c (.../nsfStack.c) (revision a58654d068b1dbd5395f9d26884a70a95363c892) @@ -3,7 +3,7 @@ * * Stack handling functions of the Next Scripting Framework. * - * Copyright (C) 2010-2012 Gustaf Neumann + * Copyright (C) 2010-2013 Gustaf Neumann * Copyright (C) 2011 Stefan Sobernig * * Permission is hereby granted, free of charge, to any person obtaining a @@ -412,21 +412,22 @@ NsfCallStackFindLastInvocation(Tcl_Interp *interp, int offset, Tcl_CallFrame **framePtrPtr) { register Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); int lvl = Tcl_CallFrame_level(varFramePtr); + + for (; likely(varFramePtr != NULL); varFramePtr = Tcl_CallFrame_callerVarPtr(varFramePtr)) { - for (; varFramePtr; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { if (Tcl_CallFrame_isProcCallFrame(varFramePtr) & (FRAME_IS_NSF_METHOD|FRAME_IS_NSF_CMETHOD)) { NsfCallStackContent *cscPtr = (NsfCallStackContent *)Tcl_CallFrame_clientData(varFramePtr); + if ((cscPtr->flags & (NSF_CSC_CALL_IS_NEXT|NSF_CSC_CALL_IS_ENSEMBLE)) || (cscPtr->frameType & NSF_CSC_TYPE_INACTIVE)) { continue; } + if (offset) { offset--; - } else { - if (Tcl_CallFrame_level(varFramePtr) < lvl) { - if (framePtrPtr) *framePtrPtr = varFramePtr; - return cscPtr; - } + } else if (Tcl_CallFrame_level(varFramePtr) < lvl) { + if (framePtrPtr) *framePtrPtr = varFramePtr; + return cscPtr; } } }