summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2013-02-28 17:08:43 (GMT)
committerdgp <dgp@users.sourceforge.net>2013-02-28 17:08:43 (GMT)
commita91df0f94f811c1780d6248b0ef4b3cf9133b74f (patch)
tree5194f377c644e8dde41bf11a2b5f0c7387f1e569 /generic
parentf64e191a21656662cf0198592bf14af07fe7de0e (diff)
downloadtcl-a91df0f94f811c1780d6248b0ef4b3cf9133b74f.zip
tcl-a91df0f94f811c1780d6248b0ef4b3cf9133b74f.tar.gz
tcl-a91df0f94f811c1780d6248b0ef4b3cf9133b74f.tar.bz2
Revise TclReleaseLiteral() to tolerate a NULL interp argument.
Update callers and revise mistaken comments.
Diffstat (limited to 'generic')
-rw-r--r--generic/tclCompile.c16
-rw-r--r--generic/tclLiteral.c8
-rw-r--r--generic/tclProc.c12
3 files changed, 13 insertions, 23 deletions
diff --git a/generic/tclCompile.c b/generic/tclCompile.c
index 91eab6e..cf165f6 100644
--- a/generic/tclCompile.c
+++ b/generic/tclCompile.c
@@ -918,7 +918,7 @@ TclCleanupByteCode(
* released.
*/
- if ((codePtr->flags & TCL_BYTECODE_PRECOMPILED) || (interp == NULL)) {
+ if (codePtr->flags & TCL_BYTECODE_PRECOMPILED) {
objArrayPtr = codePtr->objArrayPtr;
for (i = 0; i < numLitObjects; i++) {
@@ -931,17 +931,9 @@ TclCleanupByteCode(
codePtr->numLitObjects = 0;
} else {
objArrayPtr = codePtr->objArrayPtr;
- for (i = 0; i < numLitObjects; i++) {
- /*
- * TclReleaseLiteral sets a ByteCode's object array entry NULL to
- * indicate that it has already freed the literal.
- */
-
- objPtr = *objArrayPtr;
- if (objPtr != NULL) {
- TclReleaseLiteral(interp, objPtr);
- }
- objArrayPtr++;
+ while (numLitObjects--) {
+ /* TclReleaseLiteral calls Tcl_DecrRefCount() for us */
+ TclReleaseLiteral(interp, *objArrayPtr++);
}
}
diff --git a/generic/tclLiteral.c b/generic/tclLiteral.c
index 441ea91..2cba18d 100644
--- a/generic/tclLiteral.c
+++ b/generic/tclLiteral.c
@@ -750,11 +750,16 @@ TclReleaseLiteral(
* TclRegisterLiteral. */
{
Interp *iPtr = (Interp *) interp;
- LiteralTable *globalTablePtr = &iPtr->literalTable;
+ LiteralTable *globalTablePtr;
register LiteralEntry *entryPtr, *prevPtr;
const char *bytes;
int length, index;
+ if (iPtr == NULL) {
+ goto done;
+ }
+
+ globalTablePtr = &iPtr->literalTable;
bytes = TclGetStringFromObj(objPtr, &length);
index = (HashString(bytes, length) & globalTablePtr->mask);
@@ -798,6 +803,7 @@ TclReleaseLiteral(
* Remove the reference corresponding to the local literal table entry.
*/
+ done:
Tcl_DecrRefCount(objPtr);
}
diff --git a/generic/tclProc.c b/generic/tclProc.c
index e66b8ea..13f6f8a 100644
--- a/generic/tclProc.c
+++ b/generic/tclProc.c
@@ -1347,17 +1347,9 @@ TclFreeLocalCache(
for (i = 0; i < localCachePtr->numVars; i++, namePtrPtr++) {
register Tcl_Obj *objPtr = *namePtrPtr;
- /*
- * Note that this can be called with interp==NULL, on interp deletion.
- * In that case, the literal table and objects go away on their own.
- */
-
if (objPtr) {
- if (interp) {
- TclReleaseLiteral(interp, objPtr);
- } else {
- Tcl_DecrRefCount(objPtr);
- }
+ /* TclReleaseLiteral calls Tcl_DecrRefCount for us */
+ TclReleaseLiteral(interp, objPtr);
}
}
ckfree(localCachePtr);