Index: TODO =================================================================== diff -u -r2ef93fd4af1fbb75fea9fa09bb2661a4c3edd525 -r56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a --- TODO (.../TODO) (revision 2ef93fd4af1fbb75fea9fa09bb2661a4c3edd525) +++ TODO (.../TODO) (revision 56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a) @@ -3761,9 +3761,34 @@ - removed conditionals in AddInstance() and RemoveInstance() - dropped result from RemoveInstance() +nsf.c: +- added method NsfMethodNamePath() to compute the ensemble path + in error messages +- reduce verbosity +- extended regression test + ======================================================================== TODO: + - make rough comparsion table with NX, XOTcl, tclOO, itcl, Ruby, Python + Most general superclass + Metaclass + Per-object methods + Per-Object mixins -- none, class, or class hierarchy + Per-Class mixins -- none, class, or class hierarchy + transitive mixins classes + Per-object filters + Per-class filters + aliases + Traits + Composite Traits + Method protection public/protected/private + positional arguments none, leading args, arbitrary + argument value checkers + Create objects classes with no callable methods + + + - doc/tutorial2.html - warnings for "numeric" names for args and nonpos-args? @@ -3796,7 +3821,7 @@ * add switch -array for "variable"? (Just setting is trivial, handling setters and incremental setter is more work) - - call user defined setter in object parameters? + - call user-defined setter in object parameters? - NsfObjWrongArgs() & friends is not aware of submethods. Error messages print with the leaf method names only, e.g.: "anObj method 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 -- Index: generic/nsfError.c =================================================================== diff -u -ra09faeafaaacd8dcd4c52cdb86653993e8dc499a -r56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a --- generic/nsfError.c (.../nsfError.c) (revision a09faeafaaacd8dcd4c52cdb86653993e8dc499a) +++ generic/nsfError.c (.../nsfError.c) (revision 56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a) @@ -198,7 +198,12 @@ } if (methodName) { if (need_space) Tcl_AppendResult(interp, " ", (char *) NULL); - Tcl_AppendResult(interp, NsfMethodName(methodName), (char *) NULL); + + Tcl_Obj *resultObj = NsfMethodNamePath(interp, methodName); + INCR_REF_COUNT(resultObj); + Tcl_AppendResult(interp, ObjStr(resultObj), (char *) NULL); + DECR_REF_COUNT(resultObj); + need_space = 1; } if (arglist != NULL) { Index: generic/nsfInt.h =================================================================== diff -u -ra09faeafaaacd8dcd4c52cdb86653993e8dc499a -r56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a --- generic/nsfInt.h (.../nsfInt.h) (revision a09faeafaaacd8dcd4c52cdb86653993e8dc499a) +++ generic/nsfInt.h (.../nsfInt.h) (revision 56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a) @@ -940,6 +940,8 @@ 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); + /* * NsfFlag type */ Index: tests/info-method.test =================================================================== diff -u -rc4997e0189bb712287aa53d12bb3e332acfb781d -r56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a --- tests/info-method.test (.../info-method.test) (revision c4997e0189bb712287aa53d12bb3e332acfb781d) +++ tests/info-method.test (.../info-method.test) (revision 56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a) @@ -1021,4 +1021,11 @@ ? {D info methods} "c1 d1 d2" ? {D info methods -closure *2} "m2 d2 c2" ? {D info methods -closure -source application} "m1 m2 c1 d1 d2 c2" +} + +# +# Test error messages within an ensemble call +# +nx::Test case error-in-ensemble { + ? {nx::Object info method definition foo 1} {Invalid argument '1', maybe too many arguments; should be "::nx::Object info method args|body|definition|exists|registrationhandle|definitionhandle|handle|origin|parameter|parametersyntax|type|precondition|postcondition|submethods name"} } \ No newline at end of file