Index: TODO =================================================================== diff -u -r0c03b745902c592c2ea8d637cc7f6b85fbf7c895 -r5ebe07f669899129e692d36bcb2016d27ef421b8 --- TODO (.../TODO) (revision 0c03b745902c592c2ea8d637cc7f6b85fbf7c895) +++ TODO (.../TODO) (revision 5ebe07f669899129e692d36bcb2016d27ef421b8) @@ -1792,6 +1792,10 @@ similar to nx for all methods without a spec (e.g. fur builtin Tcl cmds, forwarders) +- make sure not to return CompiledLocal vars + from InterpColonVarResolver() when TCL_NAMESPACE_ONLY + is requested. + TODO: - "-returns" Index: generic/nsf.c =================================================================== diff -u -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 -r5ebe07f669899129e692d36bcb2016d27ef421b8 --- generic/nsf.c (.../nsf.c) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) +++ generic/nsf.c (.../nsf.c) (revision 5ebe07f669899129e692d36bcb2016d27ef421b8) @@ -2247,11 +2247,12 @@ *---------------------------------------------------------------------- */ static void -CompiledColonVarFree(Tcl_ResolvedVarInfo *vinfoPtr) { - nsfResolvedVarInfo *resVarInfo = (nsfResolvedVarInfo *)vinfoPtr; +CompiledColonVarFree(Tcl_ResolvedVarInfo *vInfoPtr) { + nsfResolvedVarInfo *resVarInfo = (nsfResolvedVarInfo *)vInfoPtr; + DECR_REF_COUNT(resVarInfo->nameObj); if (resVarInfo->var) {HashVarFree(resVarInfo->var);} - ckfree((char *) vinfoPtr); + ckfree((char *) vInfoPtr); } /* @@ -2328,7 +2329,7 @@ Tcl_Obj *keyObj; Tcl_Var var; - if (!FOR_COLON_RESOLVER(varName) || (flags & TCL_GLOBAL_ONLY)) { + if (!FOR_COLON_RESOLVER(varName) || (flags & (TCL_GLOBAL_ONLY|TCL_NAMESPACE_ONLY))) { /* ordinary names and global lookups are not for us */ #if defined(VAR_RESOLVER_TRACE) fprintf(stderr, "InterpColonVarResolver '%s' flags %.6x not for us nsPtr %p\n", @@ -2350,11 +2351,10 @@ if (frameFlags & FRAME_IS_NSF_METHOD) { if ((*varPtr = CompiledLocalsLookup(varFramePtr, varName))) { #if defined(VAR_RESOLVER_TRACE) - fprintf(stderr, ".... found local %s\n", varName); + fprintf(stderr, ".... found local %s varPtr %p flags %.6x only %d\n", + varName, *varPtr, flags, flags&TCL_NAMESPACE_ONLY); #endif - fprintf(stderr, ".... found local %s varPtr %p\n", varName, *varPtr); - return TCL_CONTINUE; - //return TCL_OK; + return TCL_OK; } object = ((NsfCallStackContent *)varFramePtr->clientData)->self; @@ -2378,7 +2378,7 @@ #if 0 if (varTablePtr == NULL) { /* this seems to be the first access to object->varTablePtr for this object */ - varTablePtr = object->varTablePtr = VarHashTableCreate(); + object->varTablePtr = varTablePtr = VarHashTableCreate(); } #endif assert(varTablePtr); @@ -2392,7 +2392,8 @@ var = (Tcl_Var)VarHashCreateVar(varTablePtr, keyObj, NULL); if (var) { #if defined(VAR_RESOLVER_TRACE) - fprintf(stderr, ".... found in hashtable %s %p\n", varName, var); + fprintf(stderr, ".... found in hashtable %s %p flags %.6x ns %p\n", + varName, var, ((Var *)var)->flags, object->nsPtr); #endif } else { /* @@ -2403,11 +2404,13 @@ fprintf(stderr, ".... var %p %s created in hashtable %p\n", var, varName, varTablePtr); #endif } + *varPtr = var; DECR_REF_COUNT(keyObj); return TCL_OK; } + /********************************************************* * * End of var resolvers Index: tests/varresolutiontest.tcl =================================================================== diff -u -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 -r5ebe07f669899129e692d36bcb2016d27ef421b8 --- tests/varresolutiontest.tcl (.../varresolutiontest.tcl) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) +++ tests/varresolutiontest.tcl (.../varresolutiontest.tcl) (revision 5ebe07f669899129e692d36bcb2016d27ef421b8) @@ -766,13 +766,13 @@ } } - ? {o bar} d + ? {o bar} "" ? {o ? a} 0 ? {o ? b} 0 ? {o ? c} 0 - ? {o ? d} 1 - ? {lsort [o info vars]} d + ? {o ? d} 0 + ? {lsort [o info vars]} "" o eval {set :a 1} ? {o ? a} 1 - ? {lsort [o info vars]} "a d" + ? {lsort [o info vars]} a }