Tcl Source Code

Artifact [b984ce2583]
Login

Artifact b984ce2583b99cccfc2ab9f27f2a85514dc3b327:

Attachment "shimmer-alex.patch" to ticket [738900ffff] added by ferrieux 2016-08-19 21:35:42.
Index: generic/tclListObj.c
==================================================================
--- generic/tclListObj.c
+++ generic/tclListObj.c
@@ -1795,10 +1795,36 @@
 {
     List *listRepPtr = ListRepPtr(srcPtr);
 
     ListSetIntRep(copyPtr, listRepPtr);
 }
+
+
+static Tcl_Obj *
+TclDupShaved(
+	     Tcl_Obj *objPtr)		/* The object to duplicate. */
+{
+    Tcl_Obj *dupPtr;
+    const Tcl_ObjType *typePtr = objPtr->typePtr;
+    
+    TclNewObj(dupPtr);
+    dupPtr->bytes = NULL;
+    if (typePtr) {						       
+	if (typePtr->dupIntRepProc) {
+	    typePtr->dupIntRepProc((objPtr), (dupPtr));
+	} else {
+	    (dupPtr)->internalRep = (objPtr)->internalRep;
+	    (dupPtr)->typePtr = typePtr;
+	}
+    } else {
+	Tcl_Panic("Attempting to shave a pure string: %p", objPtr);
+    }
+    
+    return dupPtr;
+}
+			      
+
 
 /*
  *----------------------------------------------------------------------
  *
  * SetListFromAny --
@@ -1865,10 +1891,38 @@
 	    *elemPtrs++ = valuePtr;
 	    Tcl_IncrRefCount(keyPtr);
 	    Tcl_IncrRefCount(valuePtr);
 	    Tcl_DictObjNext(&search, &keyPtr, &valuePtr, &done);
 	}
+
+    } else if ((objPtr->typePtr == &tclIntType)
+#ifndef TCL_WIDE_INT_IS_LONG
+	    || (objPtr->typePtr == &tclWideIntType)
+#endif
+	    || (objPtr->typePtr == &tclBooleanType)
+	    || (objPtr->typePtr == &tclDoubleType)
+	    || (objPtr->typePtr == &tclBignumType)
+	    || (objPtr->typePtr == &tclEndOffsetType)
+/*	    || (objPtr->typePtr == &tclOneWordHashKeyType)	?? */
+	    ) {
+
+	Tcl_Obj *newElem;
+	/*
+	 * create a new list consisting of only one element,
+	 * which is the original object
+	 */
+
+	listRepPtr = AttemptNewList(interp, 1, NULL);
+	if (listRepPtr == NULL) {
+	    return TCL_ERROR;
+	}
+	listRepPtr->elemCount = 1;
+	newElem = TclDupShaved(objPtr);
+	elemPtrs = &listRepPtr->elements;
+	elemPtrs[0] = newElem;
+	Tcl_IncrRefCount(newElem);
+
     } else {
 	int estCount, length;
 	const char *limit, *nextElem = TclGetStringFromObj(objPtr, &length);
 
 	/*