aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2012-08-18 17:02:59 +1000
committerSteve Bennett <steveb@workware.net.au>2012-08-18 17:02:59 +1000
commitcc366598cfbf40266d700c9e554fe21ece78dc78 (patch)
tree5d1410f9ff657a7a1beef87c0cde0e5041d70823
parentb225e36dd50337cde65fd1acfb0fe11a69ffcb71 (diff)
downloadjimtcl-cc366598cfbf40266d700c9e554fe21ece78dc78.zip
jimtcl-cc366598cfbf40266d700c9e554fe21ece78dc78.tar.gz
jimtcl-cc366598cfbf40266d700c9e554fe21ece78dc78.tar.bz2
Fix a dict/list shimmering bug
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c4
-rw-r--r--tests/dict.test3
2 files changed, 5 insertions, 2 deletions
diff --git a/jim.c b/jim.c
index 7964b8d..aa17e1e 100644
--- a/jim.c
+++ b/jim.c
@@ -6185,11 +6185,11 @@ static int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
return JIM_OK;
}
- /* Optimise dict -> list. Note that this may only save a little time, but
+ /* Optimise dict -> list for unshared object. Note that this may only save a little time, but
* it also preserves any source location of the dict elements
* which can be very useful
*/
- if (Jim_IsDict(objPtr)) {
+ if (Jim_IsDict(objPtr) && !Jim_IsShared(objPtr)) {
Jim_Obj **listObjPtrPtr;
int len;
int i;
diff --git a/tests/dict.test b/tests/dict.test
index 1b3f5a5..e5e3d60 100644
--- a/tests/dict.test
+++ b/tests/dict.test
@@ -227,4 +227,7 @@ test dict-23.4 {dict unset command: write failure} -setup {
unset dictVar
} -result {missing value to go with key}
+test dict-24.1 {dict/list shimmering - Bug 3004007} {set l [list p 1 p 2 q 3];dict get $l q;set l} {p 1 p 2 q 3}
+test dict-24.2 {dict/list shimmering - Bug 3004007} {set l [list p 1 p 2 q 3];dict get $l q;llength $l} 6
+
testreport