summaryrefslogtreecommitdiffstats
path: root/generic/tclVar.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2016-07-20 16:36:25 (GMT)
committerdgp <dgp@users.sourceforge.net>2016-07-20 16:36:25 (GMT)
commitf989073e0da7dfb4b8e73925364564da6eefbbcf (patch)
treea076be478b2887ff2192cfe776da1d0a692bc670 /generic/tclVar.c
parent837e136aa6c5930d4a439d9bfc8f41977299d79c (diff)
parent5b8d20e6dee8fed30001d29aae4e546d873c873d (diff)
downloadtcl-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.c59
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);
}