diff options
author | dgp <dgp@users.sourceforge.net> | 2011-08-17 12:19:17 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2011-08-17 12:19:17 (GMT) |
commit | 1df484aa4e500a19662de2ddad6dcc4772ca71fa (patch) | |
tree | 47c34567a16b21be531baac5dc0e26ac3cbb79a9 /generic | |
parent | 5f6458590d2630066c197d4c91986c175c8820e3 (diff) | |
parent | 07e716801399c0843c58d8c3c6b43f183f1fd378 (diff) | |
download | tcl-1df484aa4e500a19662de2ddad6dcc4772ca71fa.zip tcl-1df484aa4e500a19662de2ddad6dcc4772ca71fa.tar.gz tcl-1df484aa4e500a19662de2ddad6dcc4772ca71fa.tar.bz2 |
3392070 More complete prevention of Tcl_Obj reference cycles
when producing an intrep of ByteCode.
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclCompile.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/generic/tclCompile.c b/generic/tclCompile.c index ae633ea..026503b 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -2449,8 +2449,16 @@ TclInitByteCodeObj( * a value contains a literal which is that same value. * If this is allowed to happen, refcount decrements may not * reach zero, and memory may leak. Bugs 467523, 3357771 + * + * NOTE: [Bugs 3392070, 3389764] We make a copy based completely + * on the string value, and do not call Tcl_DuplicateObj() so we + * can be sure we do not have any lingering cycles hiding in + * the intrep. */ - codePtr->objArrayPtr[i] = Tcl_DuplicateObj(objPtr); + int numBytes; + const char *bytes = Tcl_GetStringFromObj(objPtr, &numBytes); + + codePtr->objArrayPtr[i] = Tcl_NewStringObj(bytes, numBytes); Tcl_IncrRefCount(codePtr->objArrayPtr[i]); Tcl_DecrRefCount(objPtr); } else { |