Index: generic/nsfStack.c =================================================================== diff -u -r404ad6bfcb313983a0cc54d3323751008bca991b -r595314aa4926c6455aa34fa4a10ca782e0e978df --- generic/nsfStack.c (.../nsfStack.c) (revision 404ad6bfcb313983a0cc54d3323751008bca991b) +++ generic/nsfStack.c (.../nsfStack.c) (revision 595314aa4926c6455aa34fa4a10ca782e0e978df) @@ -1,6 +1,4 @@ -//static TclVarHashTable *VarHashTableCreate(); - void TclShowStack(Tcl_Interp *interp) { Tcl_CallFrame *framePtr; @@ -16,7 +14,7 @@ framePtr = (Tcl_CallFrame *)Tcl_Interp_framePtr(interp); for (; framePtr; framePtr = Tcl_CallFrame_callerPtr(framePtr)) { int frameFlags = Tcl_CallFrame_isProcCallFrame(framePtr); - NsfCallStackContent *cscPtr = + NsfCallStackContent *cscPtr = (frameFlags & (FRAME_IS_NSF_METHOD|FRAME_IS_NSF_CMETHOD)) ? ((NsfCallStackContent *)Tcl_CallFrame_clientData(framePtr)) : NULL; @@ -32,7 +30,7 @@ cscPtr, cscPtr ? cscPtr->frameType : -1, cscPtr ? cscPtr->flags : -1, - cscPtr ? cscPtr->self : NULL, + cscPtr ? cscPtr->self : NULL, cscPtr ? objectName(cscPtr->self) : ""); } else { fprintf(stderr, " no csc"); @@ -45,7 +43,7 @@ } } -/* +/* * Push and pop operations. * * Note that it is possible that between push and pop @@ -56,17 +54,17 @@ /*fprintf(stderr,"PUSH OBJECT_FRAME (Nsf_PushFrameObj) frame %p\n",framePtr);*/ if (object->nsPtr) { /*fprintf(stderr,"Nsf_PushFrame frame %p with object->nsPtr %p\n", framePtr, object->nsPtr);*/ - Tcl_PushCallFrame(interp, framePtr, object->nsPtr, - 0|FRAME_IS_NSF_OBJECT); + Tcl_PushCallFrame(interp, framePtr, object->nsPtr, + 0|FRAME_IS_NSF_OBJECT); } else { /*fprintf(stderr,"Nsf_PushFrame frame %p (with fakeProc)\n",framePtr);*/ - Tcl_PushCallFrame(interp, framePtr, Tcl_CallFrame_nsPtr(Tcl_Interp_varFramePtr(interp)), + Tcl_PushCallFrame(interp, framePtr, Tcl_CallFrame_nsPtr(Tcl_Interp_varFramePtr(interp)), 1|FRAME_IS_NSF_OBJECT); - + Tcl_CallFrame_procPtr(framePtr) = &RUNTIME_STATE(interp)->fakeProc; if (object->varTablePtr == NULL) { object->varTablePtr = VarHashTableCreate(); - /*fprintf(stderr, "+++ create varTablePtr %p in PushFrameObj obj %p framePtr %p\n", + /*fprintf(stderr, "+++ create varTablePtr %p in PushFrameObj obj %p framePtr %p\n", object->varTablePtr, object, framePtr);*/ } Tcl_CallFrame_varTablePtr(framePtr) = object->varTablePtr; @@ -76,7 +74,7 @@ } static void Nsf_PopFrameObj(Tcl_Interp *interp, Tcl_CallFrame *framePtr) { - /*fprintf(stderr,"POP OBJECT_FRAME (Nsf_PopFrameObj) frame %p, vartable %p set to NULL, already %d\n", + /*fprintf(stderr,"POP OBJECT_FRAME (Nsf_PopFrameObj) frame %p, vartable %p set to NULL, already %d\n", framePtr, Tcl_CallFrame_varTablePtr(framePtr), Tcl_CallFrame_varTablePtr(framePtr) == NULL);*/ Tcl_CallFrame_varTablePtr(framePtr) = NULL; Tcl_PopCallFrame(interp); @@ -87,7 +85,7 @@ /*fprintf(stderr,"PUSH CMETHOD_FRAME (Nsf_PushFrameCsc) frame %p cscPtr %p methodName %s\n", framePtr, cscPtr, Tcl_GetCommandName(interp,cscPtr->cmdPtr));*/ - Tcl_PushCallFrame(interp, framePtr, Tcl_CallFrame_nsPtr(varFramePtr), + Tcl_PushCallFrame(interp, framePtr, Tcl_CallFrame_nsPtr(varFramePtr), 1|FRAME_IS_NSF_CMETHOD); Tcl_CallFrame_clientData(framePtr) = (ClientData)cscPtr; Tcl_CallFrame_procPtr(framePtr) = &RUNTIME_STATE(interp)->fakeProc; @@ -99,8 +97,8 @@ Tcl_PopCallFrame(interp); } -/* - * stack query operations +/* + * stack query operations */ static Tcl_CallFrame * @@ -110,7 +108,7 @@ if (flag & FRAME_IS_NSF_METHOD) { /* never return an inactive method frame */ - if (!(((NsfCallStackContent *)Tcl_CallFrame_clientData(framePtr))->frameType + if (!(((NsfCallStackContent *)Tcl_CallFrame_clientData(framePtr))->frameType & NSF_CSC_TYPE_INACTIVE)) break; } else { if (flag & (FRAME_IS_NSF_CMETHOD|FRAME_IS_NSF_OBJECT)) continue; @@ -145,7 +143,7 @@ /*fprintf(stderr, "GetSelfObj interp has frame %p and varframe %p\n", Tcl_Interp_framePtr(interp),Tcl_Interp_varFramePtr(interp));*/ - for (; varFramePtr; varFramePtr = + for (; varFramePtr; varFramePtr = #if defined(SKIP_LEVELS) Tcl_CallFrame_callerPtr(varFramePtr) @@ -198,7 +196,7 @@ NsfCallStackFindLastInvocation(Tcl_Interp *interp, int offset, Tcl_CallFrame **framePtrPtr) { register Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); int lvl = Tcl_CallFrame_level(varFramePtr); - + for (; varFramePtr; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { if (Tcl_CallFrame_isProcCallFrame(varFramePtr) & (FRAME_IS_NSF_METHOD|FRAME_IS_NSF_CMETHOD)) { NsfCallStackContent *cscPtr = (NsfCallStackContent *)Tcl_CallFrame_clientData(varFramePtr); @@ -245,7 +243,7 @@ static void CallStackUseActiveFrames(Tcl_Interp *interp, callFrameContext *ctx) { - Tcl_CallFrame + Tcl_CallFrame *inFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp), *framePtr; @@ -315,19 +313,19 @@ assert(framePtr); for (varFramePtr = Tcl_CallFrame_callerPtr(framePtr); - Tcl_CallFrame_isProcCallFrame(varFramePtr) & FRAME_IS_NSF_CMETHOD; + Tcl_CallFrame_isProcCallFrame(varFramePtr) & FRAME_IS_NSF_CMETHOD; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { cscPtr = (NsfCallStackContent *)Tcl_CallFrame_clientData(varFramePtr); assert(cscPtr); /* * The test for CALL_IS_ENSEMBLE is just a saftey belt - */ + */ if ((cscPtr->flags & NSF_CSC_CALL_IS_ENSEMBLE) == 0) break; } if (framePtrPtr) { *framePtrPtr = varFramePtr; } - + return cscPtr; } @@ -351,17 +349,17 @@ } static void -CallStackReplaceVarTableReferences(Tcl_Interp *interp, TclVarHashTable *oldVarTablePtr, TclVarHashTable *newVarTablePtr) { +CallStackReplaceVarTableReferences(Tcl_Interp *interp, TclVarHashTable *oldVarTablePtr, TclVarHashTable *newVarTablePtr) { Tcl_CallFrame *framePtr; - for (framePtr = (Tcl_CallFrame *)Tcl_Interp_framePtr(interp); framePtr; + for (framePtr = (Tcl_CallFrame *)Tcl_Interp_framePtr(interp); framePtr; framePtr = Tcl_CallFrame_callerPtr(framePtr)) { int frameFlags = Tcl_CallFrame_isProcCallFrame(framePtr); - + if (!(frameFlags & FRAME_IS_NSF_OBJECT)) continue; if (!(Tcl_CallFrame_varTablePtr(framePtr) == oldVarTablePtr)) continue; - - /*fprintf(stderr, "+++ makeObjNamespace replacing vartable %p with %p in frame %p\n", + + /*fprintf(stderr, "+++ makeObjNamespace replacing vartable %p with %p in frame %p\n", oldVarTablePtr, newVarTablePtr, framePtr);*/ Tcl_CallFrame_varTablePtr(framePtr) = newVarTablePtr; } @@ -410,7 +408,7 @@ while (1) { Tcl_CallFrame *framePtr = Tcl_Interp_framePtr(interp); - int frameFlags; + int frameFlags; if (!framePtr) break; if (Tcl_CallFrame_level(framePtr) == 0) break; @@ -494,7 +492,7 @@ assert(cscPtr); if (cmd) { - /* + /* * When cmd is provided, the call is not an unknown, the method * will be executed and the object will be stacked. In these * cases, we maintain an activation count. The fact that the @@ -515,29 +513,29 @@ //cscPtr->self = NULL; //return; } - + /* * track object activations - */ + */ object->activationCount ++; //fprintf(stderr, "activationCount ++ (%s) --> %d\n",objectName(object), object->activationCount); /* * track class activations - */ + */ if (cl && cmd) { Namespace *nsPtr = ((Command *)cmd)->nsPtr; cl->object.activationCount ++; - /*fprintf(stderr, "... %s cmd %s cmd ns %p (%s, refCount %d ++) obj ns %p parent %p\n", - className(cl), + /*fprintf(stderr, "... %s cmd %s cmd ns %p (%s, refCount %d ++) obj ns %p parent %p\n", + className(cl), Tcl_GetCommandName(object->teardown, cmd), nsPtr, nsPtr->fullName, nsPtr->refCount, cl->object.nsPtr,cl->object.nsPtr ? ((Namespace*)cl->object.nsPtr)->parentPtr : NULL);*/ - - /* incremement the namespace ptr in case tcl tries to delete this namespace + + /* incremement the namespace ptr in case tcl tries to delete this namespace during the invocation */ nsPtr->refCount ++; } - + } cscPtr->flags |= flags & NSF_CSC_COPY_FLAGS; cscPtr->self = object; @@ -546,7 +544,7 @@ cscPtr->frameType = frameType; cscPtr->filterStackEntry = (frameType == NSF_CSC_TYPE_ACTIVE_FILTER) ? object->filterStack : NULL; cscPtr->objv = NULL; - + /*fprintf(stderr, "CscInit %p (%s) object %p %s flags %.6x cmdPtr %p\n",cscPtr, msg, object, objectName(object), cscPtr->flags, cscPtr->cmdPtr);*/ } @@ -579,24 +577,24 @@ object = cscPtr->self; flags = cscPtr->flags; - /*fprintf(stderr, "CscFinish %p (%s) object %p %s flags %.6x cmdPtr %p\n",cscPtr, msg, + /*fprintf(stderr, "CscFinish %p (%s) object %p %s flags %.6x cmdPtr %p\n",cscPtr, msg, object, objectName(object), flags, cscPtr->cmdPtr);*/ - /* + /* * We cannot rely on the existence of cscPtr->cmdPtr (like in * initialize), since the cmd might have been deleted during the * activation. */ if ((flags & NSF_CSC_OBJECT_ACTIVATED)) { - /* + /* tracking activations of objects */ object->activationCount --; - - /*fprintf(stderr, "... activationCount -- (%s) --> %d\n",objectName(object), + + /*fprintf(stderr, "... activationCount -- (%s) --> %d\n",objectName(object), object->activationCount);*/ - - /*fprintf(stderr, "decr activationCount for %s to %d object->flags %.6x dc %.6x succ %.6x\n", + + /*fprintf(stderr, "decr activationCount for %s to %d object->flags %.6x dc %.6x succ %.6x\n", objectName(cscPtr->self), cscPtr->self->activationCount, object->flags, object->flags & NSF_DESTROY_CALLED, object->flags & NSF_DESTROY_CALLED_SUCCESS @@ -616,29 +614,29 @@ fprintf(stderr,"checkFree %p %s\n",object, objectName(object)); } #endif - - /* - tracking activations of classes + + /* + tracking activations of classes */ if (cscPtr->cl) { Namespace *nsPtr = cscPtr->cmdPtr ? ((Command *)(cscPtr->cmdPtr))->nsPtr : NULL; - + object = &cscPtr->cl->object; object->activationCount --; - + /*fprintf(stderr, "CscFinish check ac %d flags destroy %.6x success %.6x\n", - object->activationCount, + object->activationCount, object->flags & NSF_DESTROY_CALLED, object->flags & NSF_DESTROY_CALLED_SUCCESS);*/ // TODO remove block if (((object->flags & NSF_DESTROY_CALLED_SUCCESS)>0) != ((object->flags & NSF_DESTROY_CALLED)>0)) { fprintf(stderr, "*** flags differ for class %p\n", object); - } + } if (object->activationCount < 1 && object->flags & NSF_DESTROY_CALLED_SUCCESS && allowDestroy) { CallStackDoDestroy(interp, object); - } + } #if defined(OBJDELETION_TRACE) else if (!allowDestroy) { fprintf(stderr,"checkFree %p %s\n",object, objectName(object)); @@ -647,7 +645,7 @@ // TODO do we have a leak now? if (0 && nsPtr) { nsPtr->refCount--; - /*fprintf(stderr, "CscFinish parent %s activationCount %d flags %.4x refCount %d\n", + /*fprintf(stderr, "CscFinish parent %s activationCount %d flags %.4x refCount %d\n", nsPtr->fullName, nsPtr->activationCount, nsPtr->flags, nsPtr->refCount);*/ if ((nsPtr->refCount == 0) && (nsPtr->flags & NS_DEAD)) { @@ -661,7 +659,6 @@ ckfree((char*)nsPtr); } } - } }