aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-12-16 12:58:50 +1000
committerSteve Bennett <steveb@workware.net.au>2011-12-16 13:10:13 +1000
commit535ce8fed169767e1bc834660e3088f5bccb603c (patch)
tree9b43c2be94d6ebce4f98f742f66c2705cb5ff268
parent939bd44269795aa634528875fec1f363ebd99b1b (diff)
downloadjimtcl-535ce8fed169767e1bc834660e3088f5bccb603c.zip
jimtcl-535ce8fed169767e1bc834660e3088f5bccb603c.tar.gz
jimtcl-535ce8fed169767e1bc834660e3088f5bccb603c.tar.bz2
Fix bug when calling ref finalizers
Commit 21d7fc318 introduced a bug where the finalizer was freed too early Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c4
-rw-r--r--regtest.tcl8
2 files changed, 12 insertions, 0 deletions
diff --git a/jim.c b/jim.c
index 95f4c5f..88bf0c2 100644
--- a/jim.c
+++ b/jim.c
@@ -5173,6 +5173,8 @@ int Jim_Collect(Jim_Interp *interp)
objv[2] = refPtr->objPtr;
/* Drop the reference itself */
+ /* Avoid the finaliser being freed here */
+ Jim_IncrRefCount(objv[0]);
Jim_DeleteHashEntry(&interp->references, refId);
/* Call the finalizer. Errors ignored. */
@@ -5181,6 +5183,8 @@ int Jim_Collect(Jim_Interp *interp)
Jim_EvalObjVector(interp, 3, objv);
Jim_SetResult(interp, oldResult);
Jim_DecrRefCount(interp, oldResult);
+
+ Jim_DecrRefCount(interp, objv[0]);
}
else {
Jim_DeleteHashEntry(&interp->references, refId);
diff --git a/regtest.tcl b/regtest.tcl
index 0be3830..d144152 100644
--- a/regtest.tcl
+++ b/regtest.tcl
@@ -196,6 +196,14 @@ catch {
} msg
puts "TEST 27 PASSED"
+# REGTEST 28
+# 16 Dec 2011 - ref count problem with finalizers
+catch {
+ ref x x [list dummy]
+ collect
+}
+puts "TEST 28 PASSED"
+
# TAKE THE FOLLOWING puts AS LAST LINE
puts "--- ALL TESTS PASSED ---"