summaryrefslogtreecommitdiffstats
path: root/generic/tclVar.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2016-07-20 17:46:57 (GMT)
committerdgp <dgp@users.sourceforge.net>2016-07-20 17:46:57 (GMT)
commit5a6cdcde8e54ebfcd785dbea62feafab8910af06 (patch)
tree88ce4a2945329f3e764d824a267a2f63ffbcfd56 /generic/tclVar.c
parent69c90a583502502a7df9cb388daa67419874e849 (diff)
parenta7a2c2e589efa82857ba0a2526acede975aa89d0 (diff)
downloadtcl-5a6cdcde8e54ebfcd785dbea62feafab8910af06.zip
tcl-5a6cdcde8e54ebfcd785dbea62feafab8910af06.tar.gz
tcl-5a6cdcde8e54ebfcd785dbea62feafab8910af06.tar.bz2
merge trunk
Diffstat (limited to 'generic/tclVar.c')
-rw-r--r--generic/tclVar.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/generic/tclVar.c b/generic/tclVar.c
index 7df7b14..e9f2632 100644
--- a/generic/tclVar.c
+++ b/generic/tclVar.c
@@ -519,15 +519,13 @@ TclObjLookupVarEx(
* is set to NULL. */
{
Interp *iPtr = (Interp *) interp;
+ CallFrame *varFramePtr = iPtr->varFramePtr;
register Var *varPtr; /* Points to the variable's in-frame Var
* structure. */
- const char *part1;
- int index, len;
- int parsed = 0;
- const Tcl_ObjType *typePtr;
const char *errMsg = NULL;
- CallFrame *varFramePtr = iPtr->varFramePtr;
- const char *part2 = part2Ptr? TclGetString(part2Ptr):NULL;
+ int index, parsed = 0;
+ const Tcl_ObjType *typePtr;
+
int localIndex;
Tcl_Obj *namePtr;
@@ -544,7 +542,7 @@ TclObjLookupVarEx(
* Use the cached index if the names coincide.
*/
- Tcl_Obj *checkNamePtr = localName(iPtr->varFramePtr, localIndex);
+ Tcl_Obj *checkNamePtr = localName(varFramePtr, localIndex);
if ((!namePtr && (checkNamePtr == part1Ptr)) ||
(namePtr && (checkNamePtr == namePtr))) {
@@ -581,15 +579,21 @@ TclObjLookupVarEx(
goto restart;
}
}
- part1 = TclGetStringFromObj(part1Ptr, &len);
- if (!parsed && len && (*(part1 + len - 1) == ')')) {
+ if (!parsed) {
+
/*
* part1Ptr is possibly an unparsed array element.
*/
- part2 = strchr(part1, '(');
- if (part2) {
+ int len;
+ const char *part1 = TclGetStringFromObj(part1Ptr, &len);
+
+ if (len > 1 && (part1[len - 1] == ')')) {
+
+ const char *part2 = strchr(part1, '(');
+
+ if (part2) {
Tcl_Obj *arrayPtr;
if (part2Ptr != NULL) {
@@ -614,6 +618,7 @@ TclObjLookupVarEx(
part1Ptr->typePtr = &parsedVarNameType;
part1Ptr = arrayPtr;
+ }
}
}
@@ -623,8 +628,6 @@ TclObjLookupVarEx(
* the cached types if possible.
*/
- TclFreeIntRep(part1Ptr);
-
varPtr = TclLookupSimpleVar(interp, part1Ptr, flags, createPart1,
&errMsg, &index);
if (varPtr == NULL) {
@@ -640,11 +643,12 @@ TclObjLookupVarEx(
* Cache the newly found variable if possible.
*/
+ TclFreeIntRep(part1Ptr);
if (index >= 0) {
/*
* An indexed local variable.
*/
- Tcl_Obj *cachedNamePtr = localName(iPtr->varFramePtr, index);
+ Tcl_Obj *cachedNamePtr = localName(varFramePtr, index);
if (part1Ptr == cachedNamePtr) {
cachedNamePtr = NULL;