Index: generic/nsf.c =================================================================== diff -u -N -r1f89f17b2505f2923955e12bbe511978921df706 -rd007a8d7283d2861e0de5cfe567d540b8bd801de --- generic/nsf.c (.../nsf.c) (revision 1f89f17b2505f2923955e12bbe511978921df706) +++ generic/nsf.c (.../nsf.c) (revision d007a8d7283d2861e0de5cfe567d540b8bd801de) @@ -18634,12 +18634,13 @@ NsfProcStubDeleteProc(ClientData clientData) { NsfProcClientData *tcd = clientData; - /*fprintf(stderr, "NsfProcStubDeleteProc received %p\n", clientData); - fprintf(stderr, "... procName %s paramDefs %p\n", ObjStr(tcd->procName), tcd->paramDefs);*/ - + fprintf(stderr, "NsfProcStubDeleteProc received %p\n", clientData); + /*fprintf(stderr, "... procName %s paramDefs %p\n", ObjStr(tcd->procName), tcd->paramDefs);*/ + DECR_REF_COUNT2("procNameObj", tcd->procName); if (tcd->cmd != NULL) { - NsfCommandRelease(tcd->cmd); + /* NsfCommandRelease(tcd->cmd); */ + Tcl_DeleteCommandFromToken(tcd->interp, tcd->cmd); } /* tcd->paramDefs is freed by NsfProcDeleteProc() */ FREE(NsfProcClientData, tcd); @@ -18988,7 +18989,8 @@ Tcl_DStringSetLength(dsPtr, 0); Tcl_DStringAppend(dsPtr, "::nsf::procs", -1); DStringAppendQualName(dsPtr, cmdNsPtr, Tcl_GetCommandName(interp, cmd)); - procNameObj = Tcl_NewStringObj(Tcl_DStringValue(dsPtr), Tcl_DStringLength(dsPtr)); + procNameObj = Tcl_NewStringObj(Tcl_DStringValue(dsPtr), + Tcl_DStringLength(dsPtr)); INCR_REF_COUNT2("procNameObj", procNameObj); /* will be freed, when NsfProcStub is deleted */ @@ -19016,6 +19018,7 @@ tcd->flags = (checkAlwaysFlag != 0u ? NSF_PROC_FLAG_CHECK_ALWAYS : 0u) | (with_ad != 0 ? NSF_PROC_FLAG_AD : 0u); tcd->cmd = NULL; tcd->wrapperCmd = cmd; /* TODO should we preserve? */ + tcd->interp = interp; /* for deleting the shadowed proc */ /*fprintf(stderr, "NsfProcAdd %s tcd %p paramdefs %p\n", ObjStr(procNameObj), tcd, tcd->paramDefs);*/