Index: generic/nsf.c =================================================================== diff -u -r4fa580aed7f0c54c8e09ec6bb1fc1b46789334ed -r6c041dc5e75dfb3fc2c119ca2cfdc1824968f293 --- generic/nsf.c (.../nsf.c) (revision 4fa580aed7f0c54c8e09ec6bb1fc1b46789334ed) +++ generic/nsf.c (.../nsf.c) (revision 6c041dc5e75dfb3fc2c119ca2cfdc1824968f293) @@ -1899,6 +1899,7 @@ } if (withUnknown != 0) { + /*fprintf(stderr, "**** withUnknown 1 obj %s is shared %d\n", ObjStr(objPtr), Tcl_IsShared(objPtr));*/ result = NsfCallObjectUnknownHandler(interp, isAbsolutePath(objName) ? objPtr : NameInNamespaceObj(objName, CallingNameSpace(interp))); @@ -5990,7 +5991,7 @@ * we have to to perform the string operations. */ - if (parentNsPtr == NULL && nsPtr) { + if (parentNsPtr == NULL && nsPtr != NULL) { parentNsPtr = Tcl_Namespace_parentPtr(nsPtr); } @@ -14689,6 +14690,7 @@ int Nsf_ConvertToClass(Tcl_Interp *interp, Tcl_Obj *objPtr, Nsf_Param const *pPtr, ClientData *clientData, Tcl_Obj **outObjPtr) { + int withUnkown; nonnull_assert(interp != NULL); nonnull_assert(objPtr != NULL); @@ -14697,7 +14699,9 @@ nonnull_assert(outObjPtr != NULL); assert(*outObjPtr == objPtr); - if (likely(GetClassFromObj(interp, objPtr, (NsfClass **)clientData, 0) == TCL_OK)) { + withUnkown = (RUNTIME_STATE(interp)->doClassConverterOmitUnkown == 0); + + if (likely(GetClassFromObj(interp, objPtr, (NsfClass **)clientData, withUnkown) == TCL_OK)) { return IsObjectOfType(interp, (NsfObject *)*clientData, "class", objPtr, pPtr); } return NsfObjErrType(interp, NULL, objPtr, "class", (Nsf_Param *)pPtr); @@ -27839,7 +27843,9 @@ paramPtr->flags &= ~NSF_ARG_UNNAMED; } + RUNTIME_STATE(interp)->doClassConverterOmitUnkown = 1; result = ArgumentCheck(interp, valueObj, paramPtr, doCheckArguments, &flags, &checkedData, &outObjPtr); + RUNTIME_STATE(interp)->doClassConverterOmitUnkown = 0; /*fprintf(stderr, "ParameterCheck paramPtr %p final refCount of wrapper %d can free %d flags %.6x\n", paramPtr, paramWrapperPtr->refCount, paramWrapperPtr->canFree, flags);*/