diff options
| author | Miguel Sofer <miguel.sofer@gmail.com> | 2007-03-30 14:22:30 (GMT) | 
|---|---|---|
| committer | Miguel Sofer <miguel.sofer@gmail.com> | 2007-03-30 14:22:30 (GMT) | 
| commit | 18602aa3752175c93bc985c5c13cde3f0f9fb3ee (patch) | |
| tree | 40a5e67b211a69a71edc7de3a63659abc08e4efb /generic/tclExecute.c | |
| parent | 9a08b056c6086eb886da58e32ce8efae27b13b25 (diff) | |
| download | tcl-18602aa3752175c93bc985c5c13cde3f0f9fb3ee.zip tcl-18602aa3752175c93bc985c5c13cde3f0f9fb3ee.tar.gz tcl-18602aa3752175c93bc985c5c13cde3f0f9fb3ee.tar.bz2  | |
	* generic/tclExecute.c: optimise the lookup of elements of indexed
	arrays.
Diffstat (limited to 'generic/tclExecute.c')
| -rw-r--r-- | generic/tclExecute.c | 50 | 
1 files changed, 39 insertions, 11 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 415412f..2ed4e7d 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -12,7 +12,7 @@   * See the file "license.terms" for information on usage and redistribution of   * this file, and for a DISCLAIMER OF ALL WARRANTIES.   * - * RCS: @(#) $Id: tclExecute.c,v 1.264 2007/03/22 18:19:47 dgp Exp $ + * RCS: @(#) $Id: tclExecute.c,v 1.265 2007/03/30 14:22:30 msofer Exp $   */  #include "tclInt.h" @@ -2049,12 +2049,26 @@ TclExecuteByteCode(  	    arrayPtr = arrayPtr->value.linkPtr;  	}  	TRACE(("%u \"%.30s\" => ", opnd, part2)); -	varPtr = TclLookupArrayElement(interp, part1, part2, -		TCL_LEAVE_ERR_MSG, "read", 0, 1, arrayPtr); +	if (!TclIsVarUndefined(arrayPtr) +		&& TclIsVarArray(arrayPtr) +		&& TclIsVarUntraced(arrayPtr)) { +	    Tcl_HashEntry *hPtr = Tcl_FindHashEntry(arrayPtr->value.tablePtr, part2); +	    if (hPtr == NULL) { +		varPtr = NULL; +	    } else { +		varPtr = (Var *) Tcl_GetHashValue(hPtr); +	    } +	} else { +	    varPtr = NULL; +	}  	if (varPtr == NULL) { -	    TRACE_APPEND(("ERROR: %.30s\n", O2S(Tcl_GetObjResult(interp)))); -	    result = TCL_ERROR; -	    goto checkForCatch; +	    varPtr = TclLookupArrayElement(interp, part1, part2, +		    TCL_LEAVE_ERR_MSG, "read", 0, 1, arrayPtr); +	    if (varPtr == NULL) { +		TRACE_APPEND(("ERROR: %.30s\n", O2S(Tcl_GetObjResult(interp)))); +		result = TCL_ERROR; +		goto checkForCatch; +	    }  	}  	if (TclIsVarDirectReadable(varPtr)  		&& ((arrayPtr == NULL) || TclIsVarUntraced(arrayPtr))) { @@ -2213,12 +2227,26 @@ TclExecuteByteCode(  	while (TclIsVarLink(arrayPtr)) {  	    arrayPtr = arrayPtr->value.linkPtr;  	} -	varPtr = TclLookupArrayElement(interp, part1, part2, -		TCL_LEAVE_ERR_MSG, "set", 1, 1, arrayPtr); +	if (!TclIsVarUndefined(arrayPtr) +		&& TclIsVarArray(arrayPtr) +		&& TclIsVarUntraced(arrayPtr)) { +	    Tcl_HashEntry *hPtr = Tcl_FindHashEntry(arrayPtr->value.tablePtr, part2); +	    if (hPtr == NULL) { +		varPtr = NULL; +	    } else { +		varPtr = (Var *) Tcl_GetHashValue(hPtr); +	    } +	} else { +	    varPtr = NULL; +	}  	if (varPtr == NULL) { -	    TRACE_APPEND(("ERROR: %.30s\n", O2S(Tcl_GetObjResult(interp)))); -	    result = TCL_ERROR; -	    goto checkForCatch; +	    varPtr = TclLookupArrayElement(interp, part1, part2, +		    TCL_LEAVE_ERR_MSG, "set", 1, 1, arrayPtr); +	    if (varPtr == NULL) { +		TRACE_APPEND(("ERROR: %.30s\n", O2S(Tcl_GetObjResult(interp)))); +		result = TCL_ERROR; +		goto checkForCatch; +	    }  	}  	cleanup = 2;  	goto doCallPtrSetVar;  | 
