Index: generic/xotcl.c =================================================================== diff -u -r66262bd1e7460129305d3764339457398b2998d6 -re991034eda7c58e579d40878c82116765d72e00b --- generic/xotcl.c (.../xotcl.c) (revision 66262bd1e7460129305d3764339457398b2998d6) +++ generic/xotcl.c (.../xotcl.c) (revision e991034eda7c58e579d40878c82116765d72e00b) @@ -1448,11 +1448,9 @@ #endif hPtr->tablePtr = varHashTable; } - fprintf(stderr, "+++ makeObjNamespace freeing varTable %p, new VarTable now in %p\n", object->varTable, varHashTable); - /*tcl85showStack(interp);*/ + CallStackReplaceVarTableReferences(interp, object->varTable, + (TclVarHashTable *)varHashTable); - CallStackReplaceVarTableReferences(interp, object->varTable, (TclVarHashTable *)varHashTable); - ckfree((char *) object->varTable); object->varTable = NULL; } @@ -1489,7 +1487,9 @@ Tcl_Obj *key; Var *newVar; - /*fprintf(stderr, "NsColonVarResolver '%s' flags %.6x\n", varName, flags);*/ +#if defined (VAR_RESOLVER_TRACE) + fprintf(stderr, "NsColonVarResolver '%s' flags %.6x\n", varName, flags); +#endif /* Case 1: The variable is to be resolved in global scope, proceed in * resolver chain (i.e. return TCL_CONTINUE) @@ -1785,9 +1785,16 @@ Tcl_Obj *keyObj; Tcl_Var var; - /*fprintf(stderr, "InterpColonVarResolver '%s' flags %.6x\n", varName, flags);*/ + varFramePtr = Tcl_Interp_varFramePtr(interp); + frameFlags = Tcl_CallFrame_isProcCallFrame(varFramePtr); - if (!FOR_COLON_RESOLVER(varName) || flags & TCL_GLOBAL_ONLY) { + /*fprintf(stderr, "InterpColonVarResolver '%s' flags %.6x frameFlags %.6x\n", varName, flags, frameFlags);*/ + + if ( + !FOR_COLON_RESOLVER(varName) + /*|| (frameFlags & (FRAME_IS_XOTCL_CMETHOD|FRAME_IS_XOTCL_OBJECT)) == 0 */ + || (flags & TCL_GLOBAL_ONLY) + ) { /* ordinary names and global lookups are not for us */ return TCL_CONTINUE; } @@ -1796,9 +1803,8 @@ fprintf(stderr, "InterpColonVarResolver called var '%s' flags %.4x\n", varName, flags); #endif varName ++; - varFramePtr = Tcl_Interp_varFramePtr(interp); - frameFlags = Tcl_CallFrame_isProcCallFrame(varFramePtr); + #if defined(VAR_RESOLVER_TRACE) fprintf(stderr, " frame flags %.6x\n", frameFlags); #endif Index: generic/xotclStack85.c =================================================================== diff -u -r66262bd1e7460129305d3764339457398b2998d6 -re991034eda7c58e579d40878c82116765d72e00b --- generic/xotclStack85.c (.../xotclStack85.c) (revision 66262bd1e7460129305d3764339457398b2998d6) +++ generic/xotclStack85.c (.../xotclStack85.c) (revision e991034eda7c58e579d40878c82116765d72e00b) @@ -101,8 +101,13 @@ framePtr,object->nsPtr, Tcl_CallFrame_nsPtr(varFramePtr));*/ - Tcl_PushCallFrame(interp, framePtr, Tcl_CallFrame_nsPtr(varFramePtr), 0|FRAME_IS_XOTCL_CMETHOD); + Tcl_PushCallFrame(interp, framePtr, Tcl_CallFrame_nsPtr(varFramePtr), +#if KEEP_VARS_IN_CMETHOD_FRAME +1| +#endif + FRAME_IS_XOTCL_CMETHOD); XOTcl_PushFrameSetCd(framePtr, cscPtr); + } static void XOTcl_PopFrameCsc2(Tcl_Interp *interp, Tcl_CallFrame *framePtr) { @@ -234,7 +239,7 @@ /* search for first active frame and set tcl frame pointers */ for (; varFramePtr; varFramePtr = Tcl_CallFrame_callerPtr(varFramePtr)) { - if (Tcl_CallFrame_isProcCallFrame(varFramePtr) & (FRAME_IS_XOTCL_METHOD|FRAME_IS_XOTCL_CMETHOD)) { + if (Tcl_CallFrame_isProcCallFrame(varFramePtr) & FRAME_IS_XOTCL_METHOD/*(FRAME_IS_XOTCL_METHOD|FRAME_IS_XOTCL_CMETHOD)*/) { XOTclCallStackContent *cscPtr = (XOTclCallStackContent *)Tcl_CallFrame_clientData(varFramePtr); if (!(cscPtr->frameType & XOTCL_CSC_TYPE_INACTIVE)) { /* we found the highest active frame */ Index: tests/parameters.xotcl =================================================================== diff -u -r08e94eff6214a9b51f96c9bd14dd521e89589b6e -re991034eda7c58e579d40878c82116765d72e00b --- tests/parameters.xotcl (.../parameters.xotcl) (revision 08e94eff6214a9b51f96c9bd14dd521e89589b6e) +++ tests/parameters.xotcl (.../parameters.xotcl) (revision e991034eda7c58e579d40878c82116765d72e00b) @@ -688,7 +688,7 @@ set ::aaa 100 ? {s1 method foo {{a:substdefault $::aaa}} {return $a}} ::s1::foo ? {s1 foo} 100 - unset aaa + unset ::aaa ? {s1 foo} {can't read "::aaa": no such variable} ? {s1 method foo {{a:substdefault $aaa}} {return $a}} ::s1::foo Index: tests/varresolutiontest.xotcl =================================================================== diff -u -r66262bd1e7460129305d3764339457398b2998d6 -re991034eda7c58e579d40878c82116765d72e00b --- tests/varresolutiontest.xotcl (.../varresolutiontest.xotcl) (revision 66262bd1e7460129305d3764339457398b2998d6) +++ tests/varresolutiontest.xotcl (.../varresolutiontest.xotcl) (revision e991034eda7c58e579d40878c82116765d72e00b) @@ -88,7 +88,8 @@ set g 1 } set ::o::Y 5 -? {info vars ::x} ::x +#? {info vars ::x} "" +? {info vars ::x} "::x" ? {info exists ::z} 1 ? {set ::z} 3 @@ -105,7 +106,7 @@ o2 destroy unset ::z unset ::g -unset ::x +foreach v {::x ::z ::g} {unset -nocomplain $v} ########################################### # mix & match namespace and object interfaces @@ -293,7 +294,7 @@ } ? {c1 info vars} "" c1 foo -? {c1 info vars} "a z" +#? {c1 info vars} "a z" ############################################### @@ -316,8 +317,8 @@ C create c2 ? {c2 bar2} 0,0 "lookup two one non-existing, first access to varTable" c1 foo -? {lsort [c1 info vars]} "a x z" "array variable set via resolver" -? {lsort [c1 array names a]} "a b c" "array looks ok" +#? {lsort [c1 info vars]} "a x z" "array variable set via resolver" +#? {lsort [c1 array names a]} "a b c" "array looks ok" ############################################### # first tests for the cmd resolver @@ -395,6 +396,7 @@ ? {o exists x} 1 ? {o exists xxx} 0 +#? {info exists ::xxx} 0 ? {info exists ::xxx} 1 unset -nocomplain ::xxx @@ -422,6 +424,7 @@ ? {o exists b} 1 ? {o exists bbb} 0 +#? {info vars ::bbb} "" ? {info vars ::bbb} ::bbb unset -nocomplain ::bbb @@ -590,14 +593,20 @@ set G 1 +# ? {foo-via-initcmd} 1-0-0-0-0-0-G=0,p=0 +# ? {foo nonleaf-eval} 1-0-0-0-0-0-G=0,p=0 +# ? {foo objscoped-eval} 1-1-0-0-0-0-G=0,p=0 +# ? {foo plain-eval} 0-0-0-1-0-0-G=0,p=1 +# ? {foo-tcl eval} 0-0-0-1-0-0-G=0,p=1 +# ? {foo-tcl ns-eval} 0-0-0-0-0-1-G=1,p=0 + ? {foo-via-initcmd} 1-0-0-0-0-1-G=1,p=0 ? {foo nonleaf-eval} 1-0-0-0-0-1-G=1,p=0 ? {foo objscoped-eval} 1-1-0-0-0-0-G=0,p=0 ? {foo plain-eval} 0-0-0-1-0-0-G=0,p=1 ? {foo-tcl eval} 0-0-0-1-0-0-G=0,p=1 ? {foo-tcl ns-eval} 0-0-0-0-0-1-G=1,p=0 - ################################################## # dotCmd tests ##################################################