Index: TODO =================================================================== diff -u -rfbf70aa67bec4deec1078074787aafb8b66b2dde -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 --- TODO (.../TODO) (revision fbf70aa67bec4deec1078074787aafb8b66b2dde) +++ TODO (.../TODO) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) @@ -1778,6 +1778,16 @@ - cleanup of method-modifiers.tcl - updated next migration guide +- follow current Tcl vonvention for patchlevel var: + - changed name of ::nsf::patchlevel to ::nsf::patchLevel + - changed content ::nsf::patchLevel from eg .0 to full + number including release details + +- fixed bug in ::variable with colon-prefixed name + (shadowCommands does not help, see above) +- removed traces of Nsf_VariableObjCmd() +- extended regression test + TODO: - provide parametersyntax definitions for XOTcl 2.0 similar @@ -1812,9 +1822,6 @@ - extend coro regression test -- handle bug with ::variable with colon-prefixed name - (shadowCommands does not help, see above) - - work on replacing SKIP_LEVELS by SKIP_LAMBDA for openacs (works with regression test, has problems with OrderedComposite::ChildManager.init) Note concerning treating CMETHOD_FRAME like METHOD_FRAMES: we did Index: configure =================================================================== diff -u -r6b67a152a9c351a6669aec517b4e982adeafb641 -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 --- configure (.../configure) (revision 6b67a152a9c351a6669aec517b4e982adeafb641) +++ configure (.../configure) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) @@ -664,7 +664,7 @@ NSF_VERSION NSF_MAJOR_VERSION NSF_MINOR_VERSION -NSF_RELEASE_LEVEL +NSF_PATCH_LEVEL TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR @@ -2037,8 +2037,10 @@ # the script changeXOTclVersion NSF_MAJOR_VERSION=2 NSF_MINOR_VERSION=0 -NSF_RELEASE_LEVEL=.0 +NSF_RELEASE_SERIAL=0 +NSF_PATCH_LEVEL=${NSF_MAJOR_VERSION}.${NSF_MINOR_VERSION}.${NSF_RELEASE_SERIAL} + NSF_VERSION=${NSF_MAJOR_VERSION}.${NSF_MINOR_VERSION} NODOT_VERSION=${NSF_MAJOR_VERSION}${NSF_MINOR_VERSION} @@ -6849,7 +6851,7 @@ - PKG_CFLAGS="$PKG_CFLAGS -DNSF_VERSION=\\\"$NSF_VERSION\\\" -DNSF_PATCHLEVEL=\\\"$NSF_RELEASE_LEVEL\\\" \ + PKG_CFLAGS="$PKG_CFLAGS -DNSF_VERSION=\\\"$NSF_VERSION\\\" -DNSF_PATCHLEVEL=\\\"$NSF_PATCH_LEVEL\\\" \ $AOL_DEFINES $HAVE_TCL_COMPILE_H" @@ -11364,7 +11366,7 @@ NSF_VERSION!$NSF_VERSION$ac_delim NSF_MAJOR_VERSION!$NSF_MAJOR_VERSION$ac_delim NSF_MINOR_VERSION!$NSF_MINOR_VERSION$ac_delim -NSF_RELEASE_LEVEL!$NSF_RELEASE_LEVEL$ac_delim +NSF_PATCH_LEVEL!$NSF_PATCH_LEVEL$ac_delim TCL_VERSION!$TCL_VERSION$ac_delim TCL_PATCH_LEVEL!$TCL_PATCH_LEVEL$ac_delim TCL_BIN_DIR!$TCL_BIN_DIR$ac_delim Index: configure.in =================================================================== diff -u -r6b67a152a9c351a6669aec517b4e982adeafb641 -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 --- configure.in (.../configure.in) (revision 6b67a152a9c351a6669aec517b4e982adeafb641) +++ configure.in (.../configure.in) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) @@ -94,15 +94,17 @@ # the script changeXOTclVersion NSF_MAJOR_VERSION=2 NSF_MINOR_VERSION=0 -NSF_RELEASE_LEVEL=.0 +NSF_RELEASE_SERIAL=0 +NSF_PATCH_LEVEL=${NSF_MAJOR_VERSION}.${NSF_MINOR_VERSION}.${NSF_RELEASE_SERIAL} + NSF_VERSION=${NSF_MAJOR_VERSION}.${NSF_MINOR_VERSION} NODOT_VERSION=${NSF_MAJOR_VERSION}${NSF_MINOR_VERSION} AC_SUBST(NSF_VERSION) AC_SUBST(NSF_MAJOR_VERSION) AC_SUBST(NSF_MINOR_VERSION) -AC_SUBST(NSF_RELEASE_LEVEL) +AC_SUBST(NSF_PATCH_LEVEL) echo "Configuring next Version $PACKAGE_VERSION" @@ -175,7 +177,7 @@ TEA_ADD_HEADERS([generic/nsf.h generic/nsfInt.h generic/nsfDecls.h generic/nsfIntDecls.h]) TEA_ADD_INCLUDES([]) TEA_ADD_LIBS([]) -TEA_ADD_CFLAGS([-DNSF_VERSION=\\\"$NSF_VERSION\\\" -DNSF_PATCHLEVEL=\\\"$NSF_RELEASE_LEVEL\\\" \ +TEA_ADD_CFLAGS([-DNSF_VERSION=\\\"$NSF_VERSION\\\" -DNSF_PATCHLEVEL=\\\"$NSF_PATCH_LEVEL\\\" \ $AOL_DEFINES $HAVE_TCL_COMPILE_H]) TEA_ADD_STUB_SOURCES([nsfStubLib.c]) TEA_ADD_TCL_SOURCES([]) Index: generic/nsf.c =================================================================== diff -u -rfbf70aa67bec4deec1078074787aafb8b66b2dde -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 --- generic/nsf.c (.../nsf.c) (revision fbf70aa67bec4deec1078074787aafb8b66b2dde) +++ generic/nsf.c (.../nsf.c) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) @@ -2319,7 +2319,8 @@ *---------------------------------------------------------------------- */ static int -InterpColonVarResolver(Tcl_Interp *interp, CONST char *varName, Tcl_Namespace *nsPtr, int flags, Tcl_Var *varPtr) { +InterpColonVarResolver(Tcl_Interp *interp, CONST char *varName, Tcl_Namespace *nsPtr, + int flags, Tcl_Var *varPtr) { int new, frameFlags; CallFrame *varFramePtr; TclVarHashTable *varTablePtr; @@ -2343,14 +2344,17 @@ fprintf(stderr, "InterpColonVarResolver called var '%s' flags %.4x frame flags %.6x\n", varName, flags, frameFlags); #endif + varName ++; if (frameFlags & FRAME_IS_NSF_METHOD) { if ((*varPtr = CompiledLocalsLookup(varFramePtr, varName))) { #if defined(VAR_RESOLVER_TRACE) fprintf(stderr, ".... found local %s\n", varName); #endif - return TCL_OK; + fprintf(stderr, ".... found local %s varPtr %p\n", varName, *varPtr); + return TCL_CONTINUE; + //return TCL_OK; } object = ((NsfCallStackContent *)varFramePtr->clientData)->self; @@ -16943,7 +16947,7 @@ #endif Tcl_SetVar(interp, "::nsf::version", NSF_VERSION, TCL_GLOBAL_ONLY); - Tcl_SetVar(interp, "::nsf::patchlevel", NSF_PATCHLEVEL, TCL_GLOBAL_ONLY); + Tcl_SetVar(interp, "::nsf::patchLevel", NSF_PATCHLEVEL, TCL_GLOBAL_ONLY); Tcl_AddInterpResolvers(interp,"nxt", (Tcl_ResolveCmdProc*)InterpColonCmdResolver, Index: generic/nsf.h =================================================================== diff -u -rfbf70aa67bec4deec1078074787aafb8b66b2dde -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 --- generic/nsf.h (.../nsf.h) (revision fbf70aa67bec4deec1078074787aafb8b66b2dde) +++ generic/nsf.h (.../nsf.h) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) @@ -88,8 +88,7 @@ #define NSF_MEM_COUNT 1 */ -//#define TCL_STACK_ALLOC_TRACE 1 -//#define NRE_CALLBACK_TRACE 1 +//#define VAR_RESOLVER_TRACE 1 /* turn tracing output on/off #define NSFOBJ_TRACE 1 Index: generic/nsfInt.h =================================================================== diff -u -rfbf70aa67bec4deec1078074787aafb8b66b2dde -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 --- generic/nsfInt.h (.../nsfInt.h) (revision fbf70aa67bec4deec1078074787aafb8b66b2dde) +++ generic/nsfInt.h (.../nsfInt.h) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) @@ -569,7 +569,7 @@ NSF_GUARD_OPTION, NSF___UNKNOWN__, /* Partly redefined Tcl commands; leave them together at the end */ NSF_EXPR, NSF_FORMAT, NSF_INFO, NSF_INFO_FRAME, NSF_INTERP, NSF_IS, - NSF_RENAME, NSF_SUBST, NSF_VARIABLE + NSF_RENAME, NSF_SUBST } NsfGlobalNames; #if !defined(NSF_C) extern char *NsfGlobalStrings[]; @@ -589,7 +589,7 @@ "-guard", "__unknown__", /* tcl commands */ "expr", "format", "info", "::tcl::info::frame", "interp", "::tcl::string::is", - "rename", "subst", "variable" + "rename", "subst" }; #endif Index: generic/nsfShadow.c =================================================================== diff -u -rf69e0909fcb180e1cbcdd316f0a20de1b254af3d -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 --- generic/nsfShadow.c (.../nsfShadow.c) (revision f69e0909fcb180e1cbcdd316f0a20de1b254af3d) +++ generic/nsfShadow.c (.../nsfShadow.c) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) @@ -107,27 +107,7 @@ return NsfCallCommand(interp, NSF_RENAME, objc, objv); } -#if 0 static int -Nsf_VariableObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - int i; - Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); - int frameFlags = varFramePtr ? Tcl_CallFrame_isProcCallFrame(varFramePtr) : 0; - - if (frameFlags & (FRAME_IS_NSF_METHOD|FRAME_IS_NSF_CMETHOD)) { - for (i=1 ; itclCommands != NULL); assert(initialized == 0); RUNTIME_STATE(interp)->tclCommands = - NEW_ARRAY(NsfShadowTclCommandInfo, NSF_VARIABLE - NSF_EXPR + 1); + NEW_ARRAY(NsfShadowTclCommandInfo, NSF_SUBST - NSF_EXPR + 1); /*fprintf(stderr, "+++ load tcl commands %d %d\n", load, initialized);*/ @@ -234,15 +214,12 @@ /* for the following commands, we have to add our own semantics */ rc |= NsfReplaceCommand(interp, NSF_INFO_FRAME, Nsf_InfoFrameObjCmd, initialized); rc |= NsfReplaceCommand(interp, NSF_RENAME, Nsf_RenameObjCmd, initialized); - /*rc |= NsfReplaceCommand(interp, NSF_VARIABLE, Nsf_VariableObjCmd, initialized);*/ } else if (load == SHADOW_REFETCH) { NsfReplaceCommandCheck(interp, NSF_INFO_FRAME, Nsf_InfoFrameObjCmd); NsfReplaceCommandCheck(interp, NSF_RENAME, Nsf_RenameObjCmd); - /*NsfReplaceCommandCheck(interp, NSF_VARIABLE, Nsf_VariableObjCmd);*/ } else { NsfReplaceCommandCleanup(interp, NSF_INFO_FRAME); NsfReplaceCommandCleanup(interp, NSF_RENAME); - /*NsfReplaceCommandCleanup(interp, NSF_VARIABLE);*/ FREE(NsfShadowTclCommandInfo*, RUNTIME_STATE(interp)->tclCommands); RUNTIME_STATE(interp)->tclCommands = NULL; Index: tests/varresolutiontest.tcl =================================================================== diff -u -rc5d841d4cd001b85e95e01202b4fc0afe75df6a8 -r8651e9f7d6d526196cfe4dad14d08b857a66f5d8 --- tests/varresolutiontest.tcl (.../varresolutiontest.tcl) (revision c5d841d4cd001b85e95e01202b4fc0afe75df6a8) +++ tests/varresolutiontest.tcl (.../varresolutiontest.tcl) (revision 8651e9f7d6d526196cfe4dad14d08b857a66f5d8) @@ -748,5 +748,31 @@ }} 1 } +# +# test for former crash when variable is used in connection with +# prefixed variables +# +Test case tcl-variable-cmd { + Object create o { + :public method ? {varname} {info exists :$varname} + :public method bar args { + variable :a + set a 3 + variable b + set b 3 + variable c 1 + variable :d 1 + :info vars + } + } - + ? {o bar} d + ? {o ? a} 0 + ? {o ? b} 0 + ? {o ? c} 0 + ? {o ? d} 1 + ? {lsort [o info vars]} d + o eval {set :a 1} + ? {o ? a} 1 + ? {lsort [o info vars]} "a d" +}