Tcl Source Code

Artifact [fff4b5fc6b]
Login

Artifact fff4b5fc6b62baa6e1ecd16ae6dba744d3249a2d:

Attachment "leak.patch" to ticket [467523ffff] added by msofer 2001-10-11 20:13:14.
Index: generic/tclLiteral.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclLiteral.c,v
retrieving revision 1.10
diff -u -r1.10 tclLiteral.c
--- generic/tclLiteral.c	2001/10/09 17:18:56	1.10
+++ generic/tclLiteral.c	2001/10/11 12:51:21
@@ -696,31 +696,10 @@
 	    entryPtr->refCount--;
 
 	    /*
-	     * We found the matching LiteralEntry. Check if it's only being
-	     * kept alive only by a circular reference from a ByteCode
-	     * stored as its internal rep.
-	     */
-	    
-	    if ((entryPtr->refCount == 1)
-		    && (objPtr->typePtr == &tclByteCodeType)) {
-		codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
-		if ((codePtr->numLitObjects == 1)
-		        && (codePtr->objArrayPtr[0] == objPtr)) {
-		    entryPtr->refCount = 0;
-
-		    /*
-		     * Set the ByteCode object array entry NULL to signal
-		     * to TclCleanupByteCode to not try to release this
-		     * about to be freed literal again.
-		     */
-
-		    codePtr->objArrayPtr[0] = NULL;
-		}
-	    }
-
-	    /*
 	     * If the literal is no longer being used by any ByteCode,
-	     * delete the entry then decrement the ref count of its object.
+	     * delete the entry then remove the reference corresponding 
+	     * to the global literal table entry (decrement the ref count 
+	     * of the object).
 	     */
 		
 	    if (entryPtr->refCount == 0) {
@@ -729,27 +708,40 @@
 		} else {
 		    prevPtr->nextPtr = entryPtr->nextPtr;
 		}
-#ifdef TCL_COMPILE_STATS
-		iPtr->stats.currentLitStringBytes -= (double) (length + 1);
-#endif /*TCL_COMPILE_STATS*/
 		ckfree((char *) entryPtr);
 		globalTablePtr->numEntries--;
 
+		TclDecrRefCount(objPtr);
+
 		/*
-		 * Remove the reference corresponding to the global 
-		 * literal table entry.
+		 * Check if the LiteralEntry is only being kept alive by 
+		 * a circular reference from a ByteCode stored as its 
+		 * internal rep. In that case, set the ByteCode object array 
+		 * entry NULL to signal to TclCleanupByteCode to not try to 
+		 * release this about to be freed literal again.
 		 */
+	    
+		if (objPtr->typePtr == &tclByteCodeType) {
+		    codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
+		    if ((codePtr->numLitObjects == 1)
+		            && (codePtr->objArrayPtr[0] == objPtr)) {			
+			codePtr->objArrayPtr[0] = NULL;
+		    }
+		}
 
-		TclDecrRefCount(objPtr);
+#ifdef TCL_COMPILE_STATS
+		iPtr->stats.currentLitStringBytes -= (double) (length + 1);
+#endif /*TCL_COMPILE_STATS*/
 	    }
 	    break;
 	}
     }
-
+    
     /*
      * Remove the reference corresponding to the local literal table
      * entry.
      */
+
     Tcl_DecrRefCount(objPtr);
 }