Index: generic/xotcl.c =================================================================== diff -u -ra15fb82a6c951540fdf1555473ca9a6fcae7c84c -r6ef9f6401f8c86de81a5e5889d4a9675fbd22e51 --- generic/xotcl.c (.../xotcl.c) (revision a15fb82a6c951540fdf1555473ca9a6fcae7c84c) +++ generic/xotcl.c (.../xotcl.c) (revision 6ef9f6401f8c86de81a5e5889d4a9675fbd22e51) @@ -837,7 +837,7 @@ XOTclCleanupObject(XOTclObject *object) { XOTclObjectRefCountDecr(object); - /*fprintf(stderr, "XOTclCleanupObject %p refcount %d\n", obj, obj->refCount);*/ + /*fprintf(stderr, "XOTclCleanupObject %p %s refcount %d\n", object, objectName(object), object->refCount);*/ if (object->refCount <= 0) { assert(object->refCount == 0); @@ -11166,7 +11166,7 @@ Tcl_GetErrorLine(interp), ObjStr(Tcl_GetObjResult(interp))); } - RUNTIME_STATE(interp)->doFilters = 0; + /* RUNTIME_STATE(interp)->doFilters = 0; TODO finally remove me*/ destroyObjectSystems(interp); XOTclClassListFree(RUNTIME_STATE(interp)->rootClasses); @@ -14435,13 +14435,25 @@ } } + /* TODO: currently, we need filter deactivation here. + although we have XOTCL_EXITHANDLER_ON_SOFT_DESTROY activated, + objects and classes are destroyed physically, most likely + via deleteCommandFromToken during cleanups. This could cause + a destroy callback not run.... + */ + RUNTIME_STATE(interp)->doFilters = 0; + + /*fprintf(stderr, "===CALL destroy on CLASSES\n");*/ + for (hPtr = Tcl_FirstHashEntry(commandTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(commandTable, hPtr); cl = XOTclpGetClass(interp, key); if (cl && !(cl->object.flags & XOTCL_DESTROY_CALLED)) { callDestroyMethod(interp, (XOTclObject *)cl, 0); } } + /*fprintf(stderr, "===CALL destroy on CLASSES done\n");*/ + RUNTIME_STATE(interp)->doFilters = 0; #ifdef DO_CLEANUP freeAllXOTclObjectsAndClasses(interp, commandTable);