summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2011-03-05 05:13:07 (GMT)
committerdgp <dgp@users.sourceforge.net>2011-03-05 05:13:07 (GMT)
commitb1c4bf1eb83182e5953b4bb630eb336b0702a8db (patch)
tree0dde11b9b637bf20f7d7c2f7689581a0e61926cc /generic
parent91f3302e5805d69ba4f6cffed08c27bebdf595fa (diff)
parentf595ffe4efedb45e7d6fcbe462650eedb89de1b6 (diff)
downloadtcl-b1c4bf1eb83182e5953b4bb630eb336b0702a8db.zip
tcl-b1c4bf1eb83182e5953b4bb630eb336b0702a8db.tar.gz
tcl-b1c4bf1eb83182e5953b4bb630eb336b0702a8db.tar.bz2
One trunk to rule them all...
Diffstat (limited to 'generic')
-rw-r--r--generic/tclOOMethod.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/generic/tclOOMethod.c b/generic/tclOOMethod.c
index 44eb083..4f29337 100644
--- a/generic/tclOOMethod.c
+++ b/generic/tclOOMethod.c
@@ -1055,6 +1055,14 @@ ProcedureMethodCompiledVarConnect(
}
if (cacheIt) {
infoPtr->cachedObjectVar = TclVarHashGetValue(hPtr);
+
+ /*
+ * We must keep a reference to the variable so everything will
+ * continue to work correctly even if it is unset; being unset does
+ * not end the life of the variable at this level. [Bug 3185009]
+ */
+
+ VarHashRefCount(infoPtr->cachedObjectVar)++;
}
return TclVarHashGetValue(hPtr);
}
@@ -1065,6 +1073,14 @@ ProcedureMethodCompiledVarDelete(
{
OOResVarInfo *infoPtr = (OOResVarInfo *) rPtr;
+ /*
+ * Release the reference to the variable if we were holding it.
+ */
+
+ if (infoPtr->cachedObjectVar) {
+ VarHashRefCount(infoPtr->cachedObjectVar)--;
+ TclCleanupVar((Var *) infoPtr->cachedObjectVar, NULL);
+ }
Tcl_DecrRefCount(infoPtr->variableObj);
ckfree((char *) infoPtr);
}