aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2017-04-07 09:49:01 +1000
committerSteve Bennett <steveb@workware.net.au>2017-04-07 11:10:46 +1000
commitfdeb3a6c507680181a41e1f24cae711357819c4c (patch)
treeaf01c74d875bc8e083fdbd441c6eb5cd6c144f35
parentcc83b696b6b5e4cef4e312782a3fff23d5cdb8ad (diff)
downloadjimtcl-fdeb3a6c507680181a41e1f24cae711357819c4c.zip
jimtcl-fdeb3a6c507680181a41e1f24cae711357819c4c.tar.gz
jimtcl-fdeb3a6c507680181a41e1f24cae711357819c4c.tar.bz2
Fix ref count for interpolation/expression
Ref count may be wrong when an expression is used in interpolation. Reported-by: Ryan Whitworth <me@ryanwhitworth.com> Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c3
-rw-r--r--regtest.tcl6
2 files changed, 8 insertions, 1 deletions
diff --git a/jim.c b/jim.c
index 71c5d55..1f76630 100644
--- a/jim.c
+++ b/jim.c
@@ -10557,7 +10557,8 @@ static Jim_Obj *JimInterpolateTokens(Jim_Interp *interp, const ScriptToken * tok
/* Fast path return for a single token */
if (tokens == 1 && intv[0] && intv == sintv) {
- Jim_DecrRefCount(interp, intv[0]);
+ /* Reverse the Jim_IncrRefCount() above, but don't free the object */
+ intv[0]->refCount--;
return intv[0];
}
diff --git a/regtest.tcl b/regtest.tcl
index 8bc6962..682255b 100644
--- a/regtest.tcl
+++ b/regtest.tcl
@@ -277,6 +277,12 @@ puts "TEST 36 PASSED"
catch {expr {1 : 2 ? 3}}
puts "TEST 37 PASSED"
+# REGTEST 38
+# refcount with interpolation and expr
+set b(-1) 5
+set a $b($(-1))
+puts "TEST 38 PASSED"
+
# TAKE THE FOLLOWING puts AS LAST LINE
puts "--- ALL TESTS PASSED ---"