Index: TODO =================================================================== diff -u -re7a27ff80df0f9c20be649e1ea1d0bc55f045739 -r86057e0dc49bf59f550ed1b74e11a0e13198d0a8 --- TODO (.../TODO) (revision e7a27ff80df0f9c20be649e1ea1d0bc55f045739) +++ TODO (.../TODO) (revision 86057e0dc49bf59f550ed1b74e11a0e13198d0a8) @@ -3830,6 +3830,7 @@ "info methods" and "info search methods" - extended regression test +- improve handling of multiple error messages in a single command ======================================================================== TODO: Index: generic/nsf.c =================================================================== diff -u -rd679ea5694ec3aad76b06767bb23287965304db9 -r86057e0dc49bf59f550ed1b74e11a0e13198d0a8 --- generic/nsf.c (.../nsf.c) (revision d679ea5694ec3aad76b06767bb23287965304db9) +++ generic/nsf.c (.../nsf.c) (revision 86057e0dc49bf59f550ed1b74e11a0e13198d0a8) @@ -10819,6 +10819,7 @@ if (success == 1) { *clientData = objPtr; } else { + Tcl_ResetResult(interp); result = NsfObjErrType(interp, NULL, objPtr, ObjStr(pPtr->converterArg), (Nsf_Param *)pPtr); } } @@ -10874,6 +10875,7 @@ if (result == TCL_OK) { *clientData = (ClientData)INT2PTR(bool); } else { + Tcl_ResetResult(interp); NsfObjErrType(interp, NULL, objPtr, "boolean", pPtr); } assert(*outObjPtr == objPtr); @@ -10908,6 +10910,7 @@ *clientData = (ClientData)INT2PTR(i); assert(*outObjPtr == objPtr); } else { + Tcl_ResetResult(interp); NsfObjErrType(interp, NULL, objPtr, "int32", (Nsf_Param *)pPtr); } return result; @@ -10973,6 +10976,7 @@ *clientData = (ClientData)objPtr; assert(*outObjPtr == objPtr); } else { + Tcl_ResetResult(interp); NsfObjErrType(interp, NULL, objPtr, "integer", (Nsf_Param *)pPtr); } return result; @@ -16053,8 +16057,8 @@ result = (*pPtr->converter)(interp, elementObjPtr, pPtr, clientData, &elementObjPtr); if (likely(result == TCL_OK || result == TCL_CONTINUE)) { if (ov[i] != elementObjPtr) { - fprintf(stderr, "ArgumentCheck: switch to output list construction for value %s\n", - ObjStr(elementObjPtr)); + /*fprintf(stderr, "ArgumentCheck: switch to output list construction for value %s\n", + ObjStr(elementObjPtr));*/ /* * The elementObjPtr differs from the input Tcl_Obj, we switch to * the version of this handler building an output list. But first, @@ -21185,7 +21189,8 @@ /*fprintf(stderr, "call alias %s with methodObj %s.%s oc %d, nrArgs %d '%s'\n", paramPtr->name, ObjectName(object), ObjStr(methodObj), oc, paramPtr->nrArgs, ObjStr(newValue));*/ - + + Tcl_ResetResult(interp); result = NsfCallMethodWithArgs(interp, (Nsf_Object*)object, methodObj, ov0, oc, ovPtr, NSF_CSC_IMMEDIATE); } Index: generic/nsfError.c =================================================================== diff -u -r56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a -r86057e0dc49bf59f550ed1b74e11a0e13198d0a8 --- generic/nsfError.c (.../nsfError.c) (revision 56a0f7cc781f54a9f16fea75e9df1dfef4c8e11a) +++ generic/nsfError.c (.../nsfError.c) (revision 86057e0dc49bf59f550ed1b74e11a0e13198d0a8) @@ -391,10 +391,13 @@ { int named = (paramPtr && (paramPtr->flags & NSF_ARG_UNNAMED) == 0); int returnValue = !named && paramPtr && (paramPtr->flags & NSF_ARG_IS_RETURNVALUE); + char *prevErrMsg = ObjStr(Tcl_GetObjResult(interp)); - /*fprintf(stderr, "NsfObjErrType param %p named %d\n", paramPtr, named);*/ + if (*prevErrMsg != '\0') { + Tcl_AppendResult(interp, " 2nd error: ", (char *) NULL); + } - Tcl_ResetResult(interp); + //Tcl_ResetResult(interp); if (context) { Tcl_AppendResult(interp, context, ": ", (char *) NULL); }