Tcl Source Code

Artifact [34a63a9399]
Login

Artifact 34a63a9399adf24ae2a9fda3db210850504c1ad5:

Attachment "patch" to ticket [1081779fff] added by msofer 2004-12-09 08:00:27.
--- generic/tclCompile.c	2004-10-30 08:53:17.000000000 -0300
+++ generic/tclCompile.c	2004-12-08 21:47:28.162918064 -0300
@@ -1890,29 +1890,37 @@
 	 * next invocation of the procedure.
 	 */
 
-	if (!(localPtr->flags & (VAR_ARGUMENT|VAR_TEMPORARY|VAR_RESOLVED))
-		&& (nsPtr->compiledVarResProc || iPtr->resolverPtr)) {
-	    resPtr = iPtr->resolverPtr;
-
-	    if (nsPtr->compiledVarResProc) {
-		result = (*nsPtr->compiledVarResProc)(nsPtr->interp,
-			localPtr->name, localPtr->nameLength,
-			(Tcl_Namespace *) nsPtr, &vinfo);
-	    } else {
-		result = TCL_CONTINUE;
-	    }
+	if (!(localPtr->flags & (VAR_ARGUMENT|VAR_TEMPORARY|VAR_RESOLVED))) {
 
-	    while ((result == TCL_CONTINUE) && resPtr) {
-		if (resPtr->compiledVarResProc) {
-		    result = (*resPtr->compiledVarResProc)(nsPtr->interp,
+	    /*
+	     * Mark the variable as resolved, to avoid looking it up again until
+	     * one of the resolver epoch changes.
+	     */
+	    
+	    localPtr->flags |= VAR_RESOLVED;
+	    
+	    if (nsPtr->compiledVarResProc || iPtr->resolverPtr) {
+		resPtr = iPtr->resolverPtr;
+		
+		if (nsPtr->compiledVarResProc) {
+		    result = (*nsPtr->compiledVarResProc)(nsPtr->interp,
 			    localPtr->name, localPtr->nameLength,
 			    (Tcl_Namespace *) nsPtr, &vinfo);
+		} else {
+		    result = TCL_CONTINUE;
+		}
+		
+		while ((result == TCL_CONTINUE) && resPtr) {
+		    if (resPtr->compiledVarResProc) {
+			result = (*resPtr->compiledVarResProc)(nsPtr->interp,
+				localPtr->name, localPtr->nameLength,
+				(Tcl_Namespace *) nsPtr, &vinfo);
+		    }
+		    resPtr = resPtr->nextPtr;
+		}
+		if (result == TCL_OK) {
+		    localPtr->resolveInfo = vinfo;
 		}
-		resPtr = resPtr->nextPtr;
-	    }
-	    if (result == TCL_OK) {
-		localPtr->resolveInfo = vinfo;
-		localPtr->flags |= VAR_RESOLVED;
 	    }
 	}