diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-12-16 12:58:50 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-12-16 13:10:13 +1000 |
commit | 535ce8fed169767e1bc834660e3088f5bccb603c (patch) | |
tree | 9b43c2be94d6ebce4f98f742f66c2705cb5ff268 | |
parent | 939bd44269795aa634528875fec1f363ebd99b1b (diff) | |
download | jimtcl-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.c | 4 | ||||
-rw-r--r-- | regtest.tcl | 8 |
2 files changed, 12 insertions, 0 deletions
@@ -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 ---" |