Index: generic/xotcl.c =================================================================== diff -u -rf9807b1cea03590c9573b5a521760538d53ee90f -r5b0ee985a6ff266c1246c8ade3e86c33956ac772 --- generic/xotcl.c (.../xotcl.c) (revision f9807b1cea03590c9573b5a521760538d53ee90f) +++ generic/xotcl.c (.../xotcl.c) (revision 5b0ee985a6ff266c1246c8ade3e86c33956ac772) @@ -217,13 +217,13 @@ if (requiredSize > PARSE_CONTEXT_PREALLOC) { if (pcPtr->objv == &pcPtr->objv_static[1]) { /* realloc from preallocated memory */ - fprintf(stderr, "alloc %d\n", requiredSize); pcPtr->full_objv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj*) * (requiredSize+1)); memcpy(pcPtr->full_objv, &pcPtr->objv_static[0], sizeof(Tcl_Obj*) * PARSE_CONTEXT_PREALLOC); + /*fprintf(stderr, "alloc %d\n", requiredSize);*/ } else { /* realloc from mallocated memory */ pcPtr->full_objv = (Tcl_Obj **)ckrealloc((char *)pcPtr->full_objv, sizeof(Tcl_Obj*) * (requiredSize)); - fprintf(stderr, "realloc %d\n", requiredSize); + /*fprintf(stderr, "realloc %d\n", requiredSize);*/ } pcPtr->objv = &pcPtr->full_objv[1]; } @@ -5499,7 +5499,6 @@ XOTclCallStackContent *cscPtr) { CheckOptions co; int result; - XOTclRuntimeState *rst = RUNTIME_STATE(interp); #if defined(TCL85STACK) XOTcl_FrameDecls; #endif @@ -5539,9 +5538,8 @@ printCall(interp, "CmdMethodDispatch cmd", objc, objv); fprintf(stderr, "\tcmd=%s\n", Tcl_GetCommandName(interp, cmdPtr)); #endif - rst->deallocCalled = 0; - /*fprintf(stderr, "CmdDispatch obj %p %p %s\n", obj, methodName, methodName);*/ + /*fprintf(stderr, "CmdDispatch obj %p %p %s\n", obj, methodName, methodName);*/ #if !defined(NRE) result = (*Tcl_Command_objProc(cmdPtr))(cp, interp, objc, objv); #else @@ -5557,12 +5555,9 @@ } #endif - /*fprintf(stderr, "CmdDispatch obj %p %p deallocCalled %d\n", - obj, methodName, rst->deallocCalled);*/ - - /* The order of the if-condition below is important, since obj might be already - freed in case the call was a "dealloc" */ - if (!rst->deallocCalled && obj->opt) { + /* Reference counting in the calling ObjectDispatch() makes sure + that obj->opt is still accessible even after "dealloc" */ + if (obj->opt) { co = obj->opt->checkoptions; if ((co & CHECK_INVAR) && ((result = AssertionCheckInvars(interp, obj, methodName, co)) == TCL_ERROR)) { @@ -12405,10 +12400,7 @@ static int XOTclCDeallocMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *obj) { XOTclObject *delobject; - XOTclRuntimeState *rst = RUNTIME_STATE(interp); - rst->deallocCalled = 1; - /*fprintf(stderr, "XOTclCDeallocMethod obj %p %s\n",obj, ObjStr(obj));*/ if (GetObjectFromObj(interp, obj, &delobject) != TCL_OK) {