Tcl Source Code

Artifact [dc84223e62]
Login

Artifact dc84223e62c546e4debf9312f3cd3ff4f6627215:

Attachment "uplevel+lvt.patch" to ticket [1973096fff] added by msofer 2008-05-26 22:43:21.
Index: generic/tclCompCmds.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclCompCmds.c,v
retrieving revision 1.144
diff -u -r1.144 tclCompCmds.c
--- generic/tclCompCmds.c	7 May 2008 09:07:11 -0000	1.144
+++ generic/tclCompCmds.c	26 May 2008 15:27:15 -0000
@@ -5038,10 +5038,20 @@
 	 * push its name and look it up at runtime.
 	 */
 
-	if ((envPtr->procPtr != NULL) && !hasNsQualifiers) {
-	    localIndex = TclFindCompiledLocal(name, nameChars,
-		    /*create*/ flags & TCL_CREATE_VAR,
-		    envPtr->procPtr);
+	if (!hasNsQualifiers) {
+	    Interp *iPtr = (Interp *) interp;
+
+	    if (envPtr->procPtr != NULL) {
+		localIndex = TclFindCompiledLocal(name, nameChars,
+			/*create*/ flags & TCL_CREATE_VAR,
+			envPtr->procPtr);
+	    } else if (iPtr->varFramePtr->procPtr) {
+		localIndex = TclFindCompiledLocal(name, nameChars,
+			/*create*/ 0, iPtr->varFramePtr->procPtr);
+	    } else {
+		localIndex = -1;
+	    }
+	    
 	    if ((flags & TCL_NO_LARGE_INDEX) && (localIndex > 255)) {
 		/*
 		 * We'll push the name.
@@ -5050,6 +5060,7 @@
 		localIndex = -1;
 	    }
 	}
+
 	if (localIndex < 0) {
 	    PushLiteral(envPtr, name, nameChars);
 	}
Index: generic/tclExecute.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclExecute.c,v
retrieving revision 1.371
diff -u -r1.371 tclExecute.c
--- generic/tclExecute.c	27 Apr 2008 22:21:30 -0000	1.371
+++ generic/tclExecute.c	26 May 2008 15:27:24 -0000
@@ -1463,7 +1463,18 @@
 	    }
 	}
 
-	/*
+	if (codePtr->procPtr == NULL) {
+	    /*
+	     * Check that any compiled locals do refer to the current proc
+	     * environment! If not, recompile.
+	     */
+
+	    if (codePtr->localCachePtr != iPtr->varFramePtr->localCachePtr) {
+		goto recompileObj;
+	    }
+	}
+
+        /*
 	 * Increment the code's ref count while it is being executed. If
 	 * afterwards no references to it remain, free the code.
 	 */
@@ -1493,6 +1504,10 @@
     tclByteCodeType.setFromAnyProc(interp, objPtr);
     iPtr->invokeCmdFramePtr = NULL;
     codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
+    if (iPtr->varFramePtr->localCachePtr) {
+	codePtr->localCachePtr = iPtr->varFramePtr->localCachePtr;
+	codePtr->localCachePtr->refCount++;
+    }
     goto runCompiledObj;
 
     done:
Index: generic/tclProc.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclProc.c,v
retrieving revision 1.140
diff -u -r1.140 tclProc.c
--- generic/tclProc.c	27 Apr 2008 22:21:32 -0000	1.140
+++ generic/tclProc.c	26 May 2008 15:27:44 -0000
@@ -908,7 +908,7 @@
      */
 
     if (objc == 1) {
-	result = Tcl_EvalObjEx(interp, objv[0], TCL_EVAL_DIRECT);
+	result = Tcl_EvalObjEx(interp, objv[0], 0);
     } else {
 	/*
 	 * More than one argument: concatenate them together with spaces