Index: generic/nsf.c =================================================================== diff -u -r6c08389a5c2ec56b3dd75e754ab9be88e94be6c0 -r56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a --- generic/nsf.c (.../nsf.c) (revision 6c08389a5c2ec56b3dd75e754ab9be88e94be6c0) +++ generic/nsf.c (.../nsf.c) (revision 56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a) @@ -3060,7 +3060,49 @@ return MethodName(methodObj); } +/* + *---------------------------------------------------------------------- + * NsfMethodNamePath -- + * + * Compute the full method name for error messages containing the + * ensemble root. + * + * Results: + * Tcl_Obj, caller has to take care for refcounting + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ +Tcl_Obj * +NsfMethodNamePath(Tcl_Interp *interp, Tcl_Obj *procObj) { + Tcl_CallFrame *framePtr; + NsfCallStackContent *cscPtr = CallStackGetTopFrame(interp, &framePtr); + Tcl_Obj *resultObj; + + /* NsfShowStack(interp);*/ + if ((cscPtr->flags & NSF_CSC_CALL_IS_ENSEMBLE)) { + resultObj = Tcl_NewListObj(0, NULL); + Tcl_ListObjAppendElement(interp, resultObj, + Tcl_NewStringObj(Tcl_GetCommandName(interp, cscPtr->cmdPtr), -1)); + Tcl_ListObjAppendElement(interp, resultObj, Tcl_NewStringObj(MethodName(procObj), -1)); + } else { + resultObj = Tcl_NewStringObj(MethodName(procObj), -1); + } + /* The following might be needed for deeper nested errors, but so far, it + does not appear to be necessary. Just kept as a reminder here */ +#if 0 + if ((cscPtr->frameType & NSF_CSC_TYPE_ENSEMBLE)) { + cscPtr = CallStackFindEnsembleCsc(framePtr, &framePtr); + fprintf(stderr, "inside ensemble\n"); + } +#endif + + return resultObj; +} + /* *---------------------------------------------------------------------- * NsColonVarResolver -- @@ -9335,8 +9377,10 @@ * these elements takes care that the cmdPtr is deleted on a pop * operation (although we do a Tcl_DeleteCommandFromToken() below. */ - fprintf(stderr, "methodName %s found DELETED object with cmd %p my cscPtr %p\n", - methodName, cmd, cscPtr); + + /*fprintf(stderr, "methodName %s found DELETED object with cmd %p my cscPtr %p\n", + methodName, cmd, cscPtr);*/ + assert(cscPtr->cmdPtr == cmd); Tcl_DeleteCommandFromToken(interp, cmd); if (cscPtr->cl) { @@ -15979,6 +16023,7 @@ return TCL_OK; } + /* *---------------------------------------------------------------------- * ArgumentParse --