summaryrefslogtreecommitdiffstats
path: root/generic/tclVar.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2016-03-02 09:06:08 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2016-03-02 09:06:08 (GMT)
commitd0aa04bdb0fbf47e5564be76ef196934474f7fe1 (patch)
treebcceb6ef5832e9250aa7728e24957e2a16ddb41a /generic/tclVar.c
parent56b912b40ad10b788e76b9f3dad2cf9599beabda (diff)
parent8815f9f3c32c06e9f2d1d2b8ea69e1810988c5a4 (diff)
downloadtcl-d0aa04bdb0fbf47e5564be76ef196934474f7fe1.zip
tcl-d0aa04bdb0fbf47e5564be76ef196934474f7fe1.tar.gz
tcl-d0aa04bdb0fbf47e5564be76ef196934474f7fe1.tar.bz2
Merge trunk
Diffstat (limited to 'generic/tclVar.c')
-rw-r--r--generic/tclVar.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/generic/tclVar.c b/generic/tclVar.c
index 1048917..7139114 100644
--- a/generic/tclVar.c
+++ b/generic/tclVar.c
@@ -697,13 +697,16 @@ TclObjLookupVarEx(
/*
* An indexed local variable.
*/
+ Tcl_Obj *cachedNamePtr = localName(iPtr->varFramePtr, index);
part1Ptr->typePtr = &localVarNameType;
- if (part1Ptr != localName(iPtr->varFramePtr, index)) {
- part1Ptr->internalRep.twoPtrValue.ptr1 =
- localName(iPtr->varFramePtr, index);
- Tcl_IncrRefCount((Tcl_Obj *)
- part1Ptr->internalRep.twoPtrValue.ptr1);
+ if (part1Ptr != cachedNamePtr) {
+ part1Ptr->internalRep.twoPtrValue.ptr1 = cachedNamePtr;
+ Tcl_IncrRefCount(cachedNamePtr);
+ if (cachedNamePtr->typePtr != &localVarNameType
+ || cachedNamePtr->internalRep.twoPtrValue.ptr1 != NULL) {
+ TclFreeIntRep(cachedNamePtr);
+ }
} else {
part1Ptr->internalRep.twoPtrValue.ptr1 = NULL;
}