summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2016-07-20 17:39:04 (GMT)
committerdgp <dgp@users.sourceforge.net>2016-07-20 17:39:04 (GMT)
commita7a2c2e589efa82857ba0a2526acede975aa89d0 (patch)
treeffe0cf1e98673efa9814eb9a9de34e893407caec /generic
parent1eff5acecce7c6cae25d692ba941f02c9961dc74 (diff)
downloadtcl-a7a2c2e589efa82857ba0a2526acede975aa89d0.zip
tcl-a7a2c2e589efa82857ba0a2526acede975aa89d0.tar.gz
tcl-a7a2c2e589efa82857ba0a2526acede975aa89d0.tar.bz2
Streamline TclObjLookupVarEx
Diffstat (limited to 'generic')
-rw-r--r--generic/tclVar.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/generic/tclVar.c b/generic/tclVar.c
index 20fce82..55eb436 100644
--- a/generic/tclVar.c
+++ b/generic/tclVar.c
@@ -501,15 +501,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 = part1Ptr->typePtr;
const char *errMsg = NULL;
- CallFrame *varFramePtr = iPtr->varFramePtr;
- const char *part2 = part2Ptr? TclGetString(part2Ptr):NULL;
+ int index, parsed = 0;
+ const Tcl_ObjType *typePtr = part1Ptr->typePtr;
+
*arrayPtrPtr = NULL;
if (typePtr == &localVarNameType) {
@@ -525,7 +523,7 @@ TclObjLookupVarEx(
*/
Tcl_Obj *namePtr = part1Ptr->internalRep.twoPtrValue.ptr1;
- Tcl_Obj *checkNamePtr = localName(iPtr->varFramePtr, localIndex);
+ Tcl_Obj *checkNamePtr = localName(varFramePtr, localIndex);
if ((!namePtr && (checkNamePtr == part1Ptr)) ||
(namePtr && (checkNamePtr == namePtr))) {
@@ -565,15 +563,21 @@ TclObjLookupVarEx(
}
parsed = 1;
}
- 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) {
@@ -598,6 +602,7 @@ TclObjLookupVarEx(
part1Ptr->typePtr = &tclParsedVarNameType;
part1Ptr = arrayPtr;
+ }
}
}
@@ -607,8 +612,6 @@ TclObjLookupVarEx(
* the cached types if possible.
*/
- TclFreeIntRep(part1Ptr);
-
varPtr = TclLookupSimpleVar(interp, part1Ptr, flags, createPart1,
&errMsg, &index);
if (varPtr == NULL) {
@@ -624,11 +627,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);
part1Ptr->typePtr = &localVarNameType;
if (part1Ptr != cachedNamePtr) {