Index: TODO =================================================================== diff -u -r8ee718fe7e27c3df71bc659f3261710a4aaf5805 -rb19a6e9aa168b386cf12ae0f66998c7a2a9ce495 --- TODO (.../TODO) (revision 8ee718fe7e27c3df71bc659f3261710a4aaf5805) +++ TODO (.../TODO) (revision b19a6e9aa168b386cf12ae0f66998c7a2a9ce495) @@ -1505,6 +1505,12 @@ - updated migration guide - extended regression test +- provide debugging output when varFramePtr in GetSelfObj() is NULL +- filter misleading "proc" entry for "info frame" for nsf-stack entries +- add "method" for "info frame" for nsf-stack entries +- defnied SKIP_LEVELS to omit optionally skipping of + tcl-stack entries in GetSelfObj() + TODO: - check my for NRE-enabling - major coro cleanup, when working Index: generic/nsfInt.h =================================================================== diff -u -rafe1427fb16c3833bbbf45bb8496e059a6519d09 -rb19a6e9aa168b386cf12ae0f66998c7a2a9ce495 --- generic/nsfInt.h (.../nsfInt.h) (revision afe1427fb16c3833bbbf45bb8496e059a6519d09) +++ generic/nsfInt.h (.../nsfInt.h) (revision b19a6e9aa168b386cf12ae0f66998c7a2a9ce495) @@ -645,7 +645,7 @@ # define NsfImmediateFromCallerFlags(flags) \ (((flags) & (NSF_CSC_CALL_IS_NRE|NSF_CSC_IMMEDIATE)) == NSF_CSC_CALL_IS_NRE ? 0 : NSF_CSC_IMMEDIATE) -// #define NRE_SANE_PATCH 1 +//#define NRE_SANE_PATCH 1 #if defined(NRE_SANE_PATCH) # define NsfNRRunCallbacks(interp, result, rootPtr) TclNRRunCallbacks(interp, result, rootPtr) Index: generic/nsfShadow.c =================================================================== diff -u -rcec13372cd20131e3283e5ec1c864d734441ba61 -rb19a6e9aa168b386cf12ae0f66998c7a2a9ce495 --- generic/nsfShadow.c (.../nsfShadow.c) (revision cec13372cd20131e3283e5ec1c864d734441ba61) +++ generic/nsfShadow.c (.../nsfShadow.c) (revision b19a6e9aa168b386cf12ae0f66998c7a2a9ce495) @@ -99,7 +99,7 @@ Tcl_Obj *methodObj = object ? NsfMethodObj(interp, object, NSF_o_move_idx) : NULL; if (object && methodObj) { return NsfCallMethodWithArgs((ClientData)object, interp, - methodObj, objv[2], 1, 0, 0); + methodObj, objv[2], 1, 0, NSF_CSC_IMMEDIATE); } } @@ -120,7 +120,7 @@ CallFrame *varFramePtr = Tcl_Interp_varFramePtr(interp); Tcl_Obj *resultObj = Tcl_GetObjResult(interp); - /* level must be ok, otherwise we weould not have a TCL_OK */ + /* level must be ok, otherwise we would not have a TCL_OK */ Tcl_GetIntFromObj(interp, objv[1], &level); /* todo: coroutine level messing is missing */ @@ -129,23 +129,45 @@ if (level > 0) { level -= topLevel; } - /*fprintf(stderr, "topLevel %d level %d\n",topLevel, level);*/ + while (++level <= 0) { framePtr = framePtr->nextPtr; varFramePtr = varFramePtr->callerPtr; } - frameFlags = Tcl_CallFrame_isProcCallFrame(varFramePtr); + if (varFramePtr == 0) { + fprintf(stderr, "*********** varFramePtr is NULL\n"); + } + frameFlags = varFramePtr ? Tcl_CallFrame_isProcCallFrame(varFramePtr) : 0; /*fprintf(stderr, " ... frame %p varFramePtr %p frameFlags %.6x\n", framePtr, varFramePtr, frameFlags); Tcl85showStack(interp);*/ if (frameFlags & (FRAME_IS_NSF_METHOD|FRAME_IS_NSF_CMETHOD)) { NsfCallStackContent *cscPtr = ((NsfCallStackContent *)Tcl_CallFrame_clientData(varFramePtr)); - Tcl_ListObjAppendElement(interp, resultObj, Tcl_NewStringObj("object",6)); - Tcl_ListObjAppendElement(interp, resultObj, cscPtr->self->cmdName); - Tcl_ListObjAppendElement(interp, resultObj, Tcl_NewStringObj("class",5)); - Tcl_ListObjAppendElement(interp, resultObj, - cscPtr->cl ? cscPtr->cl->object.cmdName : NsfGlobalObjs[NSF_EMPTY]); - Tcl_ListObjAppendElement(interp, resultObj, Tcl_NewStringObj("frametype",9)); + Tcl_Obj *listObj, **ov; + int oc, i; + + listObj = Tcl_NewListObj(0, NULL); + /* remove "proc" element from list, if provided */ + Tcl_ListObjGetElements(interp, resultObj, &oc, &ov); + for (i=0; iself->cmdName); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("class",5)); + Tcl_ListObjAppendElement(interp, listObj, cscPtr->cl + ? cscPtr->cl->object.cmdName + : NsfGlobalObjs[NSF_EMPTY]); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("method",6)); + Tcl_ListObjAppendElement(interp, listObj, cscPtr->cmdPtr + ? Tcl_NewStringObj(Tcl_GetCommandName(interp, cscPtr->cmdPtr), -1) + : NsfGlobalObjs[NSF_EMPTY]); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("frametype",9)); if (cscPtr->frameType == NSF_CSC_TYPE_PLAIN) { frameType = "intrinsic"; } else if (cscPtr->frameType & NSF_CSC_TYPE_ACTIVE_MIXIN) { @@ -157,7 +179,8 @@ } else { frameType = "unknown"; } - Tcl_ListObjAppendElement(interp, resultObj, Tcl_NewStringObj(frameType,-1)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj(frameType,-1)); + Tcl_SetObjResult(interp, listObj); } } Index: generic/nsfStack.c =================================================================== diff -u -rafe1427fb16c3833bbbf45bb8496e059a6519d09 -rb19a6e9aa168b386cf12ae0f66998c7a2a9ce495 --- generic/nsfStack.c (.../nsfStack.c) (revision afe1427fb16c3833bbbf45bb8496e059a6519d09) +++ generic/nsfStack.c (.../nsfStack.c) (revision b19a6e9aa168b386cf12ae0f66998c7a2a9ce495) @@ -129,32 +129,31 @@ return framePtr; } +#define SKIP_LEVELS + NSF_INLINE static NsfObject* GetSelfObj(Tcl_Interp *interp) { register Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); /*fprintf(stderr, "GetSelfObj interp has frame %p and varframe %p\n", Tcl_Interp_framePtr(interp),Tcl_Interp_varFramePtr(interp));*/ - for (; varFramePtr; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { - register int flag = Tcl_CallFrame_isProcCallFrame(varFramePtr); -#if defined(TCL85STACK_TRACE) - fprintf(stderr, "GetSelfObj check frame %p flags %.6x cd %p objv[0] %s\n", - varFramePtr, Tcl_CallFrame_isProcCallFrame(varFramePtr), - Tcl_CallFrame_clientData(varFramePtr), - Tcl_CallFrame_objc(varFramePtr) ? ObjStr(Tcl_CallFrame_objv(varFramePtr)[0]) : "(null)"); + + for (; varFramePtr; varFramePtr = + +#if defined(SKIP_LEVELS) + Tcl_CallFrame_callerPtr(varFramePtr) +#else + NULL #endif + ) { + register int flag = Tcl_CallFrame_isProcCallFrame(varFramePtr); + if (flag & (FRAME_IS_NSF_METHOD|FRAME_IS_NSF_CMETHOD)) { NsfCallStackContent *cscPtr = (NsfCallStackContent *)Tcl_CallFrame_clientData(varFramePtr); -#if defined(TCL85STACK_TRACE) - fprintf(stderr, "... self returns %p %.6x %s\n", cscPtr->self, - cscPtr->self->flags, objectName(cscPtr->self)); -#endif return cscPtr->self; + } else if (flag & FRAME_IS_NSF_OBJECT) { -#if defined(TCL85STACK_TRACE) - fprintf(stderr, "... self returns %s\n", - objectName(((NsfObject*)Tcl_CallFrame_clientData(varFramePtr)))); -#endif + return (NsfObject *)Tcl_CallFrame_clientData(varFramePtr); } } @@ -166,12 +165,7 @@ register Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); for (; varFramePtr; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { -# if defined(TCL85STACK_TRACE) - fprintf(stderr, "... check frame %p flags %.6x cd %p objv[0] %s\n", - varFramePtr, Tcl_CallFrame_isProcCallFrame(varFramePtr), - Tcl_CallFrame_clientData(varFramePtr), - Tcl_CallFrame_objc(varFramePtr) ? ObjStr(Tcl_CallFrame_objv(varFramePtr)[0]) : "(null)"); -# endif + if (Tcl_CallFrame_isProcCallFrame(varFramePtr) & (FRAME_IS_NSF_METHOD|FRAME_IS_NSF_CMETHOD)) { if (framePtrPtr) *framePtrPtr = varFramePtr; return (NsfCallStackContent *)Tcl_CallFrame_clientData(varFramePtr); @@ -242,9 +236,7 @@ *framePtr; /*NsfCallStackFindActiveFrame(interp, 0, &activeFramePtr);*/ -# if defined(TCL85STACK_TRACE) - TclShowStack(interp); -# endif + /* Get the first active non object frame */ framePtr = CallStackGetActiveProcFrame(inFramePtr); @@ -541,14 +533,6 @@ cscPtr->filterStackEntry = (frameType == NSF_CSC_TYPE_ACTIVE_FILTER) ? object->filterStack : NULL; cscPtr->objv = NULL; -#if defined(TCL85STACK_TRACE) - fprintf(stderr, "PUSH csc %p type %d obj %s, self=%p cmd=%p (%s) id=%p (%s) obj refcount %d name refcount %d\n", - cscPtr, frameType, objectName(object), object, - cmd, (char *) Tcl_GetCommandName(object->teardown, cmd), - object->id, object->id ? Tcl_GetCommandName(object->teardown, object->id) : "(deleted)", - object->id ? Tcl_Command_refCount(object->id) : -100, object->cmdName->refCount - ); -#endif /*fprintf(stderr, "CscInit %p (%s) object %p %s flags %.6x cmdPtr %p\n",cscPtr, msg, object, objectName(object), cscPtr->flags, cscPtr->cmdPtr);*/ } @@ -584,10 +568,6 @@ /*fprintf(stderr, "CscFinish %p (%s) object %p %s flags %.6x cmdPtr %p\n",cscPtr, msg, object, objectName(object), flags, cscPtr->cmdPtr);*/ -#if defined(TCL85STACK_TRACE) - fprintf(stderr, "POP csc=%p, obj %s method %s (%s)\n", cscPtr, objectName(object), - Tcl_GetCommandName(interp, cscPtr->cmdPtr), msg); -#endif /* * We cannot rely on the existence of cscPtr->cmdPtr (like in * initialize), since the cmd might have been deleted during the Index: library/xotcl/library/lib/staticMetadata.xotcl =================================================================== diff -u -rf3b7952aabc9e4f9079febd1f5b7f5fb833fd50c -rb19a6e9aa168b386cf12ae0f66998c7a2a9ce495 --- library/xotcl/library/lib/staticMetadata.xotcl (.../staticMetadata.xotcl) (revision f3b7952aabc9e4f9079febd1f5b7f5fb833fd50c) +++ library/xotcl/library/lib/staticMetadata.xotcl (.../staticMetadata.xotcl) (revision b19a6e9aa168b386cf12ae0f66998c7a2a9ce495) @@ -1,3 +1,4 @@ +# -*- Tcl -*- package require XOTcl package require xotcl::metadataAnalyzer package provide xotcl::staticMetadataAnalyzer 0.84 @@ -49,10 +50,10 @@ namespace eval $namespace $command } elseif {[regexp "^ *package " $command]} { #puts stderr "$command===========================" - namespace eval $namespace [list my handlePackage $command] + namespace eval $namespace [list [self] handlePackage $command] } elseif {[regexp "^ *namespace *eval *(\[^\{\]*) *\{(.*)\}\[^\}\]*$" $command _ namespace nsc]} { #puts stderr "$command===========================" - namespace eval $namespace [list my evaluateCommands $nsc] + namespace eval $namespace [list [self] evaluateCommands $nsc] } } } Index: library/xotcl/library/xotcl2.tcl =================================================================== diff -u -rdcd56c07afd64a356db1a4672a35b4aaf4caf6ea -rb19a6e9aa168b386cf12ae0f66998c7a2a9ce495 --- library/xotcl/library/xotcl2.tcl (.../xotcl2.tcl) (revision dcd56c07afd64a356db1a4672a35b4aaf4caf6ea) +++ library/xotcl/library/xotcl2.tcl (.../xotcl2.tcl) (revision b19a6e9aa168b386cf12ae0f66998c7a2a9ce495) @@ -424,7 +424,7 @@ if {$argName eq $arg} { # upvar 2 $varName default # use "my" here to avoid surprises with aliases or interceptors - my upvar $varName default + $o upvar $varName default #puts "--- info_default var '$varName' level=[info level]" if {[llength $flag] == 2} { set default [lindex $flag 1] Index: library/xotcl/tests/testx.xotcl =================================================================== diff -u -rbedb248602f8940383c0f4a10bb4f99b3a5f2c4f -rb19a6e9aa168b386cf12ae0f66998c7a2a9ce495 --- library/xotcl/tests/testx.xotcl (.../testx.xotcl) (revision bedb248602f8940383c0f4a10bb4f99b3a5f2c4f) +++ library/xotcl/tests/testx.xotcl (.../testx.xotcl) (revision b19a6e9aa168b386cf12ae0f66998c7a2a9ce495) @@ -3665,7 +3665,8 @@ up1=[uplevel 1 self] \ up2=[uplevel 2 self] \ up3=[uplevel 3 self] ] - uplevelCmds::upproc + #uplevelCmds::upproc + uplevelCmds upproc return $::result } Object o2 -proc m {} { @@ -3678,7 +3679,7 @@ o3 m } ::errorCheck [o4 m] \ - "{self=::o1 up1=::o2 up2=::o3 up3=::o4} {self=::o1 up1=::o1 up2=::o2 up3=::o3}" \ + "{self=::o1 up1=::o2 up2=::o3 up3=::o4} {self=::uplevelCmds up1=::o1 up2=::o2 up3=::o3}" \ "uplevel self" o4 m