Tcl Source Code

Artifact [42e0032f5d]
Login

Artifact 42e0032f5d61e044f76a011d2a92e52607d8f7e3:

Attachment "unsharedLiteral.patch" to ticket [c7d0bc9a54] added by mr_calvin 2016-09-15 10:42:12. (unpublished)
Index: generic/tclLiteral.c
==================================================================
--- generic/tclLiteral.c
+++ generic/tclLiteral.c
@@ -227,42 +227,50 @@
 	}
 	return NULL;
     }
 
     /*
-     * The literal is new to the interpreter. Add it to the global literal
-     * table.
+     * The literal is new to the interpreter.
      */
 
     TclNewObj(objPtr);
-    Tcl_IncrRefCount(objPtr);
     if ((flags & LITERAL_ON_HEAP)) {
 	objPtr->bytes = bytes;
 	objPtr->length = length;
     } else {
 	TclInitStringRep(objPtr, bytes, length);
     }
 
+    /* Should the new literal be shared globally? */
+    
     if ((flags & LITERAL_UNSHARED)) {
 	/*
-	 * Make clear, that no global value is returned
+	 * No, do *not* add it the global literal table. 
+         * Make clear, that no global value is returned
 	 */
 	if (globalPtrPtr != NULL) {
 	    *globalPtrPtr = NULL;
 	}
 	return objPtr;
     }
+
+    /* 
+     * Yes, add it to the global literal table.                                                                                                                                                                          
+     */
 
 #ifdef TCL_COMPILE_DEBUG
     if (LookupLiteralEntry((Tcl_Interp *) iPtr, objPtr) != NULL) {
 	Tcl_Panic("%s: literal \"%.*s\" found globally but shouldn't be",
 		"TclRegisterLiteral", (length>60? 60 : length), bytes);
     }
 #endif
 
     globalPtr = ckalloc(sizeof(LiteralEntry));
+
     globalPtr->objPtr = objPtr;
+    Tcl_IncrRefCount(objPtr);
+
     globalPtr->refCount = 1;
     globalPtr->nsPtr = nsPtr;
     globalPtr->nextPtr = globalTablePtr->buckets[globalHash];
     globalTablePtr->buckets[globalHash] = globalPtr;
     globalTablePtr->numEntries++;