Index: generic/nsf.c =================================================================== diff -u -N -rf0bca18a085d7e071f54af9b4f0136b65ad1f8e6 -r0756410503b3b64d5b057afbdc3acb14278ef379 --- generic/nsf.c (.../nsf.c) (revision f0bca18a085d7e071f54af9b4f0136b65ad1f8e6) +++ generic/nsf.c (.../nsf.c) (revision 0756410503b3b64d5b057afbdc3acb14278ef379) @@ -16727,13 +16727,11 @@ nonnull_assert(pPtr != NULL); nonnull_assert(clientData != NULL); - fprintf(stderr, "Nsf_ConvertToTclObjType: converterArg %p\n", (void*)pPtr->converterArg); if (unlikely(pPtr->converterArg != NULL)) { const Tcl_ObjType *tclObjType = pPtr->converterArg->internalRep.twoPtrValue.ptr1; if (tclObjType != NULL) { result = Tcl_ConvertToType(interp, objPtr, tclObjType); - fprintf(stderr, "Nsf_ConvertToTclObjType:type %p -> %d\n", (void*)tclObjType, result); if (result != TCL_OK) { Tcl_ResetResult(interp); @@ -16794,9 +16792,15 @@ nonnull_assert(clientData != NULL); if (unlikely(pPtr->converterArg != NULL)) { - Tcl_Obj *objv[4]; - /*fprintf(stderr, "ConvertToTclobj %s (must be %s)\n", ObjStr(objPtr), ObjStr(pPtr->converterArg));*/ + /* + * Using "string is ..." as value checker. + */ + Tcl_Obj *objv[4], *resultObj; + /* fprintf(stderr, "ConvertToTclobj %s (must be %s)\n", ObjStr(objPtr), ObjStr(pPtr->converterArg));*/ + resultObj = Tcl_GetObjResult(interp); + Tcl_IncrRefCount(resultObj); + objv[0] = NULL; objv[1] = pPtr->converterArg; objv[2] = NsfGlobalObjs[NSF_OPTION_STRICT]; @@ -16805,14 +16809,23 @@ result = NsfCallCommand(interp, NSF_STRING_IS, 4, objv); if (likely(result == TCL_OK)) { int success; + Tcl_GetIntFromObj(interp, Tcl_GetObjResult(interp), &success); if (success == 1) { *clientData = objPtr; + /* + * Restore the original result, which was clobbered by the "string is" + * command. Restoring is necessary in cases, where this function is + * used as result value function of a method. + */ + Tcl_SetObjResult(interp, resultObj); } else { Tcl_ResetResult(interp); result = NsfObjErrType(interp, NULL, objPtr, ObjStr(pPtr->converterArg), (Nsf_Param *)pPtr); } } + Tcl_DecrRefCount(resultObj); + } else { result = TCL_OK; @@ -31939,14 +31952,17 @@ } } paramPtr = paramWrapperPtr->paramPtr; - if (paramPtrPtr != NULL) *paramPtrPtr = paramPtr; + if (paramPtrPtr != NULL) { + *paramPtrPtr = paramPtr; + } if (isNamed) { paramPtr->flags &= ~NSF_ARG_UNNAMED; } RUNTIME_STATE(interp)->doClassConverterOmitUnknown = 1; outObjPtr = NULL; + result = ArgumentCheck(interp, valueObj, paramPtr, doCheckArguments, &flags, &checkedData, &outObjPtr); RUNTIME_STATE(interp)->doClassConverterOmitUnknown = 0;