Index: generic/nsf.c =================================================================== diff -u -r75a78fbf5f0abe57ec568be9f7dbd41836ddf005 -r69dd5028cf4ef20149baa013e1929b1b3bb65c2a --- generic/nsf.c (.../nsf.c) (revision 75a78fbf5f0abe57ec568be9f7dbd41836ddf005) +++ generic/nsf.c (.../nsf.c) (revision 69dd5028cf4ef20149baa013e1929b1b3bb65c2a) @@ -1736,10 +1736,10 @@ #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION>6 if (origTypePtr == objPtr->typePtr && Tcl_Command_cmdEpoch(cmd) > 0) { - TclFreeIntRep(objPtr); + /* TclFreeIntRep(objPtr); fprintf(stderr, ".... %p RETRY flags %.6x cmd epoch %d\n", objPtr, Tcl_Command_flags(cmd), Tcl_Command_cmdEpoch(cmd)); - return GetObjectFromObj(interp, objPtr, objectPtr); + return GetObjectFromObj(interp, objPtr, objectPtr);*/ } #endif @@ -6786,6 +6786,9 @@ fprintf(stderr, " CallStackDestroyObject has to DispatchDestroyMethod %p activationCount %d\n", object, activationCount); #endif + fprintf(stderr, " CallStackDestroyObject has to DispatchDestroyMethod %p activationCount %d\n", + object, activationCount); + DispatchDestroyMethod(interp, object, 0); if (activationCount == 0) { @@ -14113,8 +14116,8 @@ return TCL_OK; } - /*fprintf(stderr, " DispatchDestroyMethod obj %p flags %.6x active %d\n", - object, object->flags, object->activationCount); */ + fprintf(stderr, " DispatchDestroyMethod obj %p flags %.6x active %d cmd %p epoch %d\n", + object, object->flags, object->activationCount, object->id, Tcl_Command_cmdEpoch(object->id)); PRINTOBJ("DispatchDestroyMethod", object); @@ -18665,11 +18668,11 @@ nonnull_assert(interp != NULL); nonnull_assert(object != NULL); - /*fprintf(stderr, "CleanupDestroyObject obj %p softrecreate %d nsPtr %p\n", - object, softrecreate, object->nsPtr);*/ + fprintf(stderr, "CleanupDestroyObject obj %p softrecreate %d nsPtr %p\n", + object, softrecreate, object->nsPtr); - /* - * The object pointer is guaranteed to point to the same object, so it is + + /* The object pointer is guaranteed to point to the same object, so it is * not sufficient for methodObj validation. Therefore, for objects * containing per-object methods, we increment the objectMethodEpoch. */ @@ -18844,10 +18847,12 @@ TclDeletesObject(ClientData clientData) { NsfObject *object; Tcl_Interp *interp; + Command *cmdPtr; nonnull_assert(clientData != NULL); object = (NsfObject *)clientData; + cmdPtr = (Command *)object->id; /* * TODO: Actually, it seems like a good idea to flag a deletion from Tcl by * setting object->id to NULL. However, we seem to have some dependencies @@ -18861,6 +18866,7 @@ #ifdef OBJDELETION_TRACE fprintf(stderr, "TclDeletesObject %p obj->id %p flags %.6x\n", object, object->id, object->flags); #endif + fprintf(stderr, "TclDeletesObject %p obj->id %p epoch %d\n", object, object->id, Tcl_Command_cmdEpoch(object->id)); if ((object->flags & NSF_DURING_DELETE) != 0u || !object->teardown) { return; } @@ -18870,6 +18876,7 @@ # endif CallStackDestroyObject(interp, object); + cmdPtr->cmdEpoch++; } @@ -19671,6 +19678,7 @@ nameString = ObjStr(nameObj); object = (NsfObject *)cl; + fprintf(stderr, "CKALLOC Class %p %s\n", cl, nameString); #if defined(NSFOBJ_TRACE) fprintf(stderr, "CKALLOC Class %p %s\n", cl, nameString); #endif @@ -19878,7 +19886,7 @@ errObj = Tcl_GetObjResult(interp); INCR_REF_COUNT(errObj); - + fprintf(stderr, "DoObjInitialization %p\n", (NsfObject *)object); DispatchDestroyMethod(interp, (NsfObject *)object, 0); Tcl_SetObjResult(interp, errObj); @@ -24533,8 +24541,8 @@ Command *procPtr = (Command *)cmd; char *tail = Tcl_GetHashKey(procPtr->hPtr->tablePtr, procPtr->hPtr); - fprintf(stderr, "... cmd %p flags %.6x name '%s' ns '%s'", - (void *)cmd, Tcl_Command_flags(cmd), tail, procPtr->nsPtr->name); + fprintf(stderr, "... cmd %p flags %.6x name '%s' ns '%s' epoch '%d'", + (void *)cmd, Tcl_Command_flags(cmd), tail, procPtr->nsPtr->name, Tcl_Command_cmdEpoch(cmd)); } } fprintf(stderr, "\n"); @@ -28984,8 +28992,8 @@ return NsfPrintError(interp, "cannot destroy base class %s", ObjectName_(object)); } } - - /*fprintf(stderr,"NsfODestroyMethod %p %s flags %.6x activation %d cmd %p cmd->flags %.6x\n", + + /* fprintf(stderr,"NsfODestroyMethod %p %s flags %.6x activation %d cmd %p cmd->flags %.6x\n", object, ((Command *)object->id)->flags == 0 ? ObjectName(object) : "(deleted)", object->flags, object->activationCount, object->id, ((Command *)object->id)->flags);*/ Index: library/nx/nx.tcl =================================================================== diff -u -r361fa327cab70ec1c7bf085054bb96b649ed266c -r69dd5028cf4ef20149baa013e1929b1b3bb65c2a --- library/nx/nx.tcl (.../nx.tcl) (revision 361fa327cab70ec1c7bf085054bb96b649ed266c) +++ library/nx/nx.tcl (.../nx.tcl) (revision 69dd5028cf4ef20149baa013e1929b1b3bb65c2a) @@ -1318,23 +1318,35 @@ # When slot objects are destroyed, flush the parameter cache and # delete the accessors # - #puts stderr "*** slot destroy of [self], domain ${:domain} per-object ${:per-object}" + puts stderr "*** slot destroy of [self], domain ${:domain} per-object ${:per-object}" if {${:per-object}} { ::nsf::parameter::cache::objectinvalidate ${:domain} if {[${:domain} ::nsf::methods::object::info::method exists ${:name}]} { ::nsf::method::delete ${:domain} -per-object ${:name} } - } elseif {[::nsf::is class ${:domain}]} { - ::nsf::parameter::cache::classinvalidate ${:domain} - if {[${:domain} ::nsf::methods::class::info::method exists ${:name}]} { - ::nsf::method::delete ${:domain} ${:name} - } } else { - nsf::log Warning "ignore inproper domain ${:domain} during destroy (maybe per-object not set?)" + + puts stderr ---isEnter--- + # set is [::nsf::is class ${:domain}] + set is [${:domain} ::nsf::methods::object::info::hastype ::nx::Class] + puts stderr ---isLeave($is)--- + if {$is} { + puts stderr ---1--- + ::nsf::parameter::cache::classinvalidate ${:domain} + puts stderr ---2--- + if {[${:domain} ::nsf::methods::class::info::method exists ${:name}]} { + ::nsf::method::delete ${:domain} ${:name} + } + } else { + nsf::log Warning "ignore inproper domain ${:domain} during destroy (maybe per-object not set?)" + } } } - ::nsf::next + puts stderr ---destroyEnter--- + set r [::nsf::next] + puts stderr ---destroyLeave--- + return $r } #