Index: generic/nsf.c =================================================================== diff -u -rbd39c6f1905eff26cec664d0bb2db580925b21e6 -rba23ab58bc8dd8018eb4de475a104619abc8a128 --- generic/nsf.c (.../nsf.c) (revision bd39c6f1905eff26cec664d0bb2db580925b21e6) +++ generic/nsf.c (.../nsf.c) (revision ba23ab58bc8dd8018eb4de475a104619abc8a128) @@ -3596,29 +3596,30 @@ */ Tcl_Obj * -NsfMethodNamePath(Tcl_Interp *interp, Tcl_Obj *procObj) { - Tcl_CallFrame *framePtr; - NsfCallStackContent *cscPtr = CallStackGetTopFrame(interp, &framePtr); - Tcl_Obj *resultObj; +NsfMethodNamePath(Tcl_Interp *interp, + Tcl_CallFrame *framePtr, + CONST char *methodName) { - /* NsfShowStack(interp);*/ - if (cscPtr && (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); + Tcl_Obj *resultObj = Tcl_NewListObj(0, NULL); + + if (!framePtr) { + /* We default to the top frame, if not requested otherwise */ + (void) CallStackGetTopFrame(interp, &framePtr); } - /* 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"); + + if (framePtr) { + Tcl_ListObjAppendList(interp, resultObj, + CallStackMethodPath(interp, framePtr)); } -#endif + if (methodName) { + + assert(*methodName != ':'); + + Tcl_ListObjAppendElement(interp, resultObj, + Tcl_NewStringObj(methodName,-1)); + } + return resultObj; } @@ -10335,12 +10336,22 @@ * method path, and the unknown final method. */ Tcl_Obj *callInfoObj = Tcl_NewListObj(1, &callerSelf->cmdName); - Tcl_Obj *methodPathObj = CallStackMethodPath(interp, (Tcl_CallFrame *)framePtr); + + Tcl_Obj *methodPathObj = + NsfMethodNamePath(interp, + (Tcl_CallFrame *)framePtr, + MethodName(objv[0])); + INCR_REF_COUNT(methodPathObj); + Tcl_ListObjAppendList(interp, callInfoObj, methodPathObj); + + /* Tcl_Obj *methodPathObj = CallStackMethodPath(interp, (Tcl_CallFrame *)framePtr); + INCR_REF_COUNT(methodPathObj); Tcl_ListObjAppendList(interp, callInfoObj, methodPathObj); + */ - Tcl_ListObjAppendElement(interp, callInfoObj, Tcl_NewStringObj(MethodName(objv[0]), -1)); + /* Tcl_ListObjAppendElement(interp, callInfoObj, Tcl_NewStringObj(MethodName(objv[0]), -1));*/ Tcl_ListObjAppendElement(interp, callInfoObj, objv[1]); DECR_REF_COUNT(methodPathObj); @@ -17475,14 +17486,22 @@ } else if (unlikely(pPtr->flags & NSF_ARG_REQUIRED) && (processFlags & NSF_ARGPARSE_FORCE_REQUIRED)) { Tcl_Obj *paramDefsObj = NsfParamDefsSyntax(ifd); + Tcl_Obj *methodPathObj = NsfMethodNamePath(interp, + NULL /* use topmost frame */, + MethodName(pcPtr->full_objv[0])); + INCR_REF_COUNT2("methodPathObj", methodPathObj); + NsfPrintError(interp, "required argument '%s' is missing, should be:\n\t%s%s%s %s", pPtr->nameObj ? ObjStr(pPtr->nameObj) : pPtr->name, pcPtr->object ? ObjectName(pcPtr->object) : "", pcPtr->object ? " " : "", - ObjStr(pcPtr->full_objv[0]), + ObjStr(methodPathObj), ObjStr(paramDefsObj)); + DECR_REF_COUNT2("paramDefsObj", paramDefsObj); + DECR_REF_COUNT2("methodPathObj", methodPathObj); + return TCL_ERROR; } else { @@ -21885,8 +21904,9 @@ break; case CurrentoptionMethodpathIdx: - (void) CallStackGetTopFrame(interp, &framePtr); - Tcl_SetObjResult(interp, CallStackMethodPath(interp, framePtr)); + Tcl_SetObjResult(interp, NsfMethodNamePath(interp, + NULL /* use topmost frame */, + NULL /* exclude leaf */)); break; case CurrentoptionClassIdx: /* class subcommand */ @@ -21951,25 +21971,9 @@ cscPtr = NsfCallStackFindLastInvocation(interp, 1, &framePtr); if (cscPtr && cscPtr->cmdPtr) { - Tcl_Obj *methodNameObj = Tcl_NewStringObj(Tcl_GetCommandName(interp, cscPtr->cmdPtr), -1); - /* - * By checking the characteristic frame and call type pattern for "leaf" - * ensemble dispatches, we make sure that the method path is only - * reported for these cases. Otherwise, we constrain the result to the - * method name. - */ - if ((cscPtr->frameType & NSF_CSC_TYPE_ENSEMBLE) && - (cscPtr->flags & NSF_CSC_CALL_IS_COMPILE) == 0) { - resultObj = CallStackMethodPath(interp, framePtr); - result = Tcl_ListObjAppendElement(interp, resultObj, methodNameObj); - if (result != TCL_OK) { - DECR_REF_COUNT(resultObj); - DECR_REF_COUNT(methodNameObj); - break; - } - } else { - resultObj = methodNameObj; - } + resultObj = NsfMethodNamePath(interp, + framePtr, + Tcl_GetCommandName(interp, cscPtr->cmdPtr)); } else { resultObj = NsfGlobalObjs[NSF_EMPTY]; } Index: generic/nsfError.c =================================================================== diff -u -r6b1a83846ee9bd80b7ce10d88cc427bdb5585819 -rba23ab58bc8dd8018eb4de475a104619abc8a128 --- generic/nsfError.c (.../nsfError.c) (revision 6b1a83846ee9bd80b7ce10d88cc427bdb5585819) +++ generic/nsfError.c (.../nsfError.c) (revision ba23ab58bc8dd8018eb4de475a104619abc8a128) @@ -242,7 +242,9 @@ if (need_space) Tcl_AppendResult(interp, " ", (char *) NULL); - resultObj = NsfMethodNamePath(interp, methodName); + resultObj = NsfMethodNamePath(interp, + NULL /* use topmost frame */, + NsfMethodName(methodName)); INCR_REF_COUNT(resultObj); Tcl_AppendResult(interp, ObjStr(resultObj), (char *) NULL); DECR_REF_COUNT(resultObj); Index: generic/nsfInt.h =================================================================== diff -u -rccb2c99f6fb6f381dfc7e300584ac08e3d2809d3 -rba23ab58bc8dd8018eb4de475a104619abc8a128 --- generic/nsfInt.h (.../nsfInt.h) (revision ccb2c99f6fb6f381dfc7e300584ac08e3d2809d3) +++ generic/nsfInt.h (.../nsfInt.h) (revision ba23ab58bc8dd8018eb4de475a104619abc8a128) @@ -987,7 +987,9 @@ EXTERN void NsfReportVars(Tcl_Interp *interp); EXTERN void NsfDStringArgv(Tcl_DString *dsPtr, int objc, Tcl_Obj *CONST objv[]); -EXTERN Tcl_Obj *NsfMethodNamePath(Tcl_Interp *interp, Tcl_Obj *procObj); +EXTERN Tcl_Obj *NsfMethodNamePath(Tcl_Interp *interp, + Tcl_CallFrame *framePtr, + CONST char *methodName); /* * Definition of methodEpoch macros