Index: generic/xotcl.c =================================================================== diff -u -rae922ee26ff2c658d5d0c3b8b98b71ab2f8bb4f9 -rd8cfbde70910574be327e506ba621cb3845e5cef --- generic/xotcl.c (.../xotcl.c) (revision ae922ee26ff2c658d5d0c3b8b98b71ab2f8bb4f9) +++ generic/xotcl.c (.../xotcl.c) (revision d8cfbde70910574be327e506ba621cb3845e5cef) @@ -7039,30 +7039,28 @@ static Tcl_Obj * computeLevelObj(Tcl_Interp *interp, CallStackLevel level) { - XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; - XOTclCallStackContent *csc; + Tcl_CallFrame *framePtr; Tcl_Obj *resultObj; switch (level) { - case CALLING_LEVEL: csc = XOTclCallStackFindLastInvocation(interp, 1); break; - case ACTIVE_LEVEL: csc = XOTclCallStackFindActiveFrame(interp, 1, NULL /*todo*/); break; - default: csc = NULL; + case CALLING_LEVEL: XOTclCallStackFindLastInvocation(interp, 1, &framePtr); break; + case ACTIVE_LEVEL: XOTclCallStackFindActiveFrame(interp, 1, &framePtr); break; + default: framePtr = NULL; } - if (cs->top->currentFramePtr == ((Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp)) - && csc && csc < cs->top && csc->currentFramePtr) { - /* this was from an xotcl frame, return absolute frame number */ + if (framePtr) { + /* the call was from an xotcl frame, return absolute frame number */ char buffer[LONG_AS_STRING]; int l; + buffer[0] = '#'; - /* fprintf(stderr,"*** csc=%p\n", csc);*/ - XOTcl_ltoa(buffer+1,(long)Tcl_CallFrame_level(csc->currentFramePtr),&l); + XOTcl_ltoa(buffer+1,(long)Tcl_CallFrame_level(framePtr), &l); + fprintf(stderr,"*** framePtr=%p buffer %s\n", framePtr, buffer); resultObj = Tcl_NewStringObj(buffer, l+1); } else { /* If not called from an xotcl frame, return 1 as default */ resultObj = Tcl_NewIntObj(1); } - /*XOTclStackDump(interp);XOTclCallStackDump(interp);*/ return resultObj; } @@ -7179,13 +7177,13 @@ break; case callingprocIdx: - csc = XOTclCallStackFindLastInvocation(interp, 1); + csc = XOTclCallStackFindLastInvocation(interp, 1, NULL); Tcl_SetResult(interp, csc ? (char *)Tcl_GetCommandName(interp, csc->cmdPtr) : "", TCL_VOLATILE); break; case callingclassIdx: - csc = XOTclCallStackFindLastInvocation(interp, 1); + csc = XOTclCallStackFindLastInvocation(interp, 1, NULL); Tcl_SetObjResult(interp, csc && csc->cl ? csc->cl->object.cmdName : XOTclGlobalObjects[XOTE_EMPTY]); break; @@ -7199,7 +7197,7 @@ break; case callingobjectIdx: - csc = XOTclCallStackFindLastInvocation(interp, 1); + csc = XOTclCallStackFindLastInvocation(interp, 1, NULL); Tcl_SetObjResult(interp, csc ? csc->self->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); break; @@ -10953,9 +10951,7 @@ objv += i; if (!framePtr) { - XOTclCallStackContent *csc = XOTclCallStackFindLastInvocation(interp, 1); - if (csc) - framePtr = csc->currentFramePtr; + XOTclCallStackFindLastInvocation(interp, 1, &framePtr); } savedVarFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); 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; 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; }