Index: generic/xotclStack85.c =================================================================== diff -u -r4e4b28776b65781a8624006c026986add5080cb5 -ra19d77bc89cdb0882d2cad69305be4e0e483cae3 --- generic/xotclStack85.c (.../xotclStack85.c) (revision 4e4b28776b65781a8624006c026986add5080cb5) +++ generic/xotclStack85.c (.../xotclStack85.c) (revision a19d77bc89cdb0882d2cad69305be4e0e483cae3) @@ -64,6 +64,66 @@ } } +/* + TODO: we have a small divergence in the test "filterGuards" due to + different lifetime of stack entries, so we keep for reference and + for potential mor digging the following function, which can be used + in xotcl.c in CallStackDestroyObject() like + + int marked = CallStackMarkDestroyed(interp, obj); + int mm2 = CallStackMarkDestroyed84dummy(interp, obj); + + fprintf(stderr, "84 => %d marked, 85 => %d marked, ok = %d\n",marked, m2, marked == m2); + if (marked != m2) { + tcl85showStack(interp); + } +*/ +static int +CallStackMarkDestroyed84dummy(Tcl_Interp *interp, XOTclObject *obj) { + XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; + XOTclCallStackContent *csc; + int countSelfs = 0; + Tcl_Command oid = obj->id; + + for (csc = &cs->content[1]; csc <= cs->top; csc++) { + if (csc->self == obj) { + /*csc->destroyedCmd = oid; + csc->callType |= XOTCL_CSC_CALL_IS_DESTROY;*/ + fprintf(stderr,"84 setting destroy on csc %p for obj %p\n", csc, obj); + if (oid) { + /*Tcl_Command_refCount(csc->destroyedCmd)++;*/ + MEM_COUNT_ALLOC("command refCount", csc->destroyedCmd); + } + countSelfs++; + } + } + return countSelfs; +} + +static int +CallStackMarkDestroyed(Tcl_Interp *interp, XOTclObject *obj) { + register Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); + int marked = 0; + Tcl_Command oid = obj->id; + + for (; varFramePtr; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { + if (Tcl_CallFrame_isProcCallFrame(varFramePtr) & FRAME_IS_XOTCL_METHOD) { + XOTclCallStackContent *csc = (XOTclCallStackContent *)Tcl_CallFrame_clientData(varFramePtr); + if (csc->self == obj) { + csc->destroyedCmd = oid; + csc->callType |= XOTCL_CSC_CALL_IS_DESTROY; + /*fprintf(stderr,"setting destroy on csc %p for obj %p\n", csc, obj);*/ + if (csc->destroyedCmd) { + Tcl_Command_refCount(csc->destroyedCmd)++; + MEM_COUNT_ALLOC("command refCount", csc->destroyedCmd); + } + marked++; + } + } + } + return marked; +} + #endif /* TCL85STACK */