Index: generic/xotclStack85.c =================================================================== diff -u -ra15fb82a6c951540fdf1555473ca9a6fcae7c84c -r8eb2c3e68f127d641d0c004332e1bd057d5654dd --- generic/xotclStack85.c (.../xotclStack85.c) (revision a15fb82a6c951540fdf1555473ca9a6fcae7c84c) +++ generic/xotclStack85.c (.../xotclStack85.c) (revision 8eb2c3e68f127d641d0c004332e1bd057d5654dd) @@ -414,18 +414,22 @@ XOTCLINLINE static void CallStackPop(Tcl_Interp *interp, XOTclCallStackContent *cscPtr) { XOTclObject *object = cscPtr->self; + int allowDestroy = RUNTIME_STATE(interp)->exitHandlerDestroyRound != + XOTCL_EXITHANDLER_ON_SOFT_DESTROY; #if defined(TCL85STACK_TRACE) fprintf(stderr, "POP csc=%p, obj %s method %s\n", cscPtr, objectName(object), Tcl_GetCommandName(interp, cscPtr->cmdPtr)); #endif object->activationCount --; - /* fprintf(stderr, "decr activationCount for %s to %d cscPtr->cl %p\n", objectName(cscPtr->self), - cscPtr->self->activationCount, cscPtr->cl);*/ + /*fprintf(stderr, "decr activationCount for %s to %d cscPtr->cl %p\n", objectName(cscPtr->self), + cscPtr->self->activationCount, cscPtr->cl);*/ - if (object->activationCount < 1 && object->flags & XOTCL_DESTROY_CALLED) { + if (object->activationCount < 1 && object->flags & XOTCL_DESTROY_CALLED && allowDestroy) { CallStackDoDestroy(interp, object); + } else if (!allowDestroy) { + fprintf(stderr,"checkFree %p %s\n",object, objectName(object)); } #if 1 if (cscPtr->cl) { @@ -440,9 +444,10 @@ /*fprintf(stderr, "CallStackPop check ac %d flags %.6x\n", object->activationCount, object->flags & XOTCL_DESTROY_CALLED);*/ - if (object->activationCount < 1 && object->flags & XOTCL_DESTROY_CALLED) { - /* fprintf(stderr, "CallStackPop calls CallStackDoDestroy %p\n", object);*/ + if (object->activationCount < 1 && object->flags & XOTCL_DESTROY_CALLED && allowDestroy) { CallStackDoDestroy(interp, object); + } else if (!allowDestroy) { + fprintf(stderr,"checkFree %p %s\n",object, objectName(object)); } if (nsPtr) {