Index: generic/nsf.c =================================================================== diff -u -r3e6e82e95cb7d22117f884cdddf8a32d77ec930d -r9e09fe5eab491d8e016657939e0c371dbcf0ea39 --- generic/nsf.c (.../nsf.c) (revision 3e6e82e95cb7d22117f884cdddf8a32d77ec930d) +++ generic/nsf.c (.../nsf.c) (revision 9e09fe5eab491d8e016657939e0c371dbcf0ea39) @@ -31708,7 +31708,6 @@ typedef struct NsfParamWrapper { Nsf_Param *paramPtr; int refCount; - bool canFree; } NsfParamWrapper; static Tcl_DupInternalRepProc ParamDupInteralRep; @@ -31754,25 +31753,22 @@ srcParamWrapperPtr = (NsfParamWrapper *)srcPtr->internalRep.twoPtrValue.ptr1; if (srcParamWrapperPtr != NULL) { - /*fprintf(stderr, "ParamDupInteralRep src %p copy wrapper %p paramPtr %p refCount %d canFree %d\n", + /*fprintf(stderr, "ParamDupInteralRep src %p copy wrapper %p paramPtr %p refCount %d\n", (void*)srcPtr, (void*)srcParamWrapperPtr, (void*)srcParamWrapperPtr->paramPtr, - srcParamWrapperPtr->refCount, - srcParamWrapperPtr->canFree);*/ + srcParamWrapperPtr->refCount);*/ dupParamWrapperPtr = srcParamWrapperPtr; dupPtr->internalRep.twoPtrValue.ptr1 = dupParamWrapperPtr; dupPtr->typePtr = ¶mObjType; dupParamWrapperPtr->refCount ++; - dupParamWrapperPtr->canFree = NSF_FALSE; - - /*fprintf(stderr, "ParamDupInteralRep dup %p .... wrapper %p paramPtr %p refCount %d canFree %d\n", + + /*fprintf(stderr, "ParamDupInteralRep dup %p .... wrapper %p paramPtr %p refCount %d\n", (void*)dupPtr, (void*)dupParamWrapperPtr, (void*)dupParamWrapperPtr->paramPtr, - dupParamWrapperPtr->refCount, - dupParamWrapperPtr->canFree);*/ + dupParamWrapperPtr->refCount);*/ } } @@ -31789,19 +31785,19 @@ paramWrapperPtr = (NsfParamWrapper *)objPtr->internalRep.twoPtrValue.ptr1; if (paramWrapperPtr != NULL) { - /*fprintf(stderr, "ParamFreeInternalRep obj %p type %p '%s' freeing wrapper %p paramPtr %p refCount %d canFree %d\n", + /*fprintf(stderr, "ParamFreeInternalRep obj %p type %p '%s' freeing wrapper %p paramPtr %p refCount %d\n", (void*)objPtr, (void*)objPtr->typePtr, (void*)objPtr->typePtr == NULL ? "None" : objPtr->typePtr->name, (void*)paramWrapperPtr, (void*)paramWrapperPtr->paramPtr, - paramWrapperPtr->refCount, - paramWrapperPtr->canFree);*/ + paramWrapperPtr->refCount);*/ + if (paramWrapperPtr->refCount < 0) { char *p = NULL; *p=0; } - if (paramWrapperPtr->canFree) { + if (paramWrapperPtr->refCount <= 1) { ParamsFree(paramWrapperPtr->paramPtr); FREE(NsfParamWrapper, paramWrapperPtr); } else { @@ -31847,7 +31843,6 @@ paramWrapperPtr->paramPtr = ParamsNew(1u); paramWrapperPtr->refCount = 1; - paramWrapperPtr->canFree = NSF_FALSE; Tcl_AppendLimitedToObj(fullParamObj, ObjStr(objPtr), TCL_INDEX_NONE, INT_MAX, NULL); INCR_REF_COUNT(fullParamObj); @@ -31881,12 +31876,11 @@ objPtr->internalRep.twoPtrValue.ptr2 = NULL; objPtr->typePtr = ¶mObjType; - /*fprintf(stderr, "ParamSetFromAny2 obj %p creates wrapper %p paramPtr %p refCount %d canFree %d\n", + /*fprintf(stderr, "ParamSetFromAny2 obj %p creates wrapper %p paramPtr %p refCount %d\n", (void*)objPtr, (void*)paramWrapperPtr, (void*)paramWrapperPtr->paramPtr, - paramWrapperPtr->refCount, - paramWrapperPtr->canFree);*/ + paramWrapperPtr->refCount);*/ } else { /* * In error cases, free manually memory allocated by this function. @@ -32182,11 +32176,10 @@ result = ArgumentCheck(interp, valueObj, paramPtr, doCheckArguments, &flags, &checkedData, &outObjPtr); RUNTIME_STATE(interp)->doClassConverterOmitUnknown = 0; - /*fprintf(stderr, "ParameterCheck paramPtr %p final refCount of wrapper %d can free %d flags %.6x\n", - paramPtr, paramWrapperPtr->refCount, paramWrapperPtr->canFree, flags);*/ + /*fprintf(stderr, "ParameterCheck paramPtr %p final refCount of wrapper %d flags %.6x\n", + paramPtr, paramWrapperPtr->refCount, flags);*/ assert(paramWrapperPtr->refCount > 0); - paramWrapperPtr->canFree = NSF_TRUE; if ((flags & NSF_PC_MUST_DECR) != 0u) { DECR_REF_COUNT2("valueObj", outObjPtr);