diff options
author | dgp <dgp@users.sourceforge.net> | 2016-07-20 16:36:25 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2016-07-20 16:36:25 (GMT) |
commit | f989073e0da7dfb4b8e73925364564da6eefbbcf (patch) | |
tree | a076be478b2887ff2192cfe776da1d0a692bc670 /generic/tclVar.c | |
parent | 837e136aa6c5930d4a439d9bfc8f41977299d79c (diff) | |
parent | 5b8d20e6dee8fed30001d29aae4e546d873c873d (diff) | |
download | tcl-f989073e0da7dfb4b8e73925364564da6eefbbcf.zip tcl-f989073e0da7dfb4b8e73925364564da6eefbbcf.tar.gz tcl-f989073e0da7dfb4b8e73925364564da6eefbbcf.tar.bz2 |
Merge trunk; silence compiler warning.
Diffstat (limited to 'generic/tclVar.c')
-rw-r--r-- | generic/tclVar.c | 59 |
1 files changed, 16 insertions, 43 deletions
diff --git a/generic/tclVar.c b/generic/tclVar.c index 2bc2243..7df7b14 100644 --- a/generic/tclVar.c +++ b/generic/tclVar.c @@ -522,9 +522,8 @@ TclObjLookupVarEx( register Var *varPtr; /* Points to the variable's in-frame Var * structure. */ const char *part1; - int index, len1, len2; + int index, len; int parsed = 0; - Tcl_Obj *objPtr; const Tcl_ObjType *typePtr; const char *errMsg = NULL; CallFrame *varFramePtr = iPtr->varFramePtr; @@ -582,18 +581,17 @@ TclObjLookupVarEx( goto restart; } } - part1 = TclGetStringFromObj(part1Ptr, &len1); + part1 = TclGetStringFromObj(part1Ptr, &len); - if (!parsed && len1 && (*(part1 + len1 - 1) == ')')) { + if (!parsed && len && (*(part1 + len - 1) == ')')) { /* * part1Ptr is possibly an unparsed array element. */ - register int i; + part2 = strchr(part1, '('); + if (part2) { + Tcl_Obj *arrayPtr; - len2 = -1; - for (i = 0; i < len1; i++) { - if (*(part1 + i) == '(') { if (part2Ptr != NULL) { if (flags & TCL_LEAVE_ERR_MSG) { TclObjVarErrMsg(interp, part1Ptr, part2Ptr, msg, @@ -604,44 +602,18 @@ TclObjLookupVarEx( return NULL; } - /* - * part1Ptr points to an array element; first copy the element - * name to a new string part2. - */ - - part2 = part1 + i + 1; - len2 = len1 - i - 2; - len1 = i; - - part2Ptr = Tcl_NewStringObj(part2, len2); - - /* - * Free the internal rep of the original part1Ptr, now renamed - * objPtr, and set it to parsedVarNameType. - */ + arrayPtr = Tcl_NewStringObj(part1, (part2 - part1)); + part2Ptr = Tcl_NewStringObj(part2 + 1, len - (part2 - part1) - 2); - objPtr = part1Ptr; - TclFreeIntRep(objPtr); - objPtr->typePtr = &parsedVarNameType; + TclFreeIntRep(part1Ptr); - /* - * Define a new string object to hold the new part1Ptr, i.e., - * the array name. Set the internal rep of objPtr, reset - * typePtr and part1 to contain the references to the array - * name. - */ - - TclNewStringObj(part1Ptr, part1, len1); - Tcl_IncrRefCount(part1Ptr); - - objPtr->internalRep.twoPtrValue.ptr1 = part1Ptr; - Tcl_IncrRefCount(part2Ptr); - objPtr->internalRep.twoPtrValue.ptr2 = part2Ptr; + Tcl_IncrRefCount(arrayPtr); + part1Ptr->internalRep.twoPtrValue.ptr1 = arrayPtr; + Tcl_IncrRefCount(part2Ptr); + part1Ptr->internalRep.twoPtrValue.ptr2 = part2Ptr; + part1Ptr->typePtr = &parsedVarNameType; - typePtr = part1Ptr->typePtr; - part1 = TclGetString(part1Ptr); - break; - } + part1Ptr = arrayPtr; } } @@ -5332,6 +5304,7 @@ FreeLocalVarName( LocalGetIntRep(objPtr, index, namePtr); + index++; /* Compiler warning bait. */ if (namePtr) { Tcl_DecrRefCount(namePtr); } |