summaryrefslogtreecommitdiffstats
path: root/generic/tclUtil.c
diff options
context:
space:
mode:
authorhobbs <hobbs>1999-12-12 02:26:40 (GMT)
committerhobbs <hobbs>1999-12-12 02:26:40 (GMT)
commit9d5c1c3ab0220165e8761184bf18b03a0018c0e8 (patch)
treea0669e049fc8824bf3b37835e2244bac6c56a8d8 /generic/tclUtil.c
parent5f809539e37de57ab0461f54c17db348eac6e0dd (diff)
downloadtcl-9d5c1c3ab0220165e8761184bf18b03a0018c0e8.zip
tcl-9d5c1c3ab0220165e8761184bf18b03a0018c0e8.tar.gz
tcl-9d5c1c3ab0220165e8761184bf18b03a0018c0e8.tar.bz2
* tests/var.test:
* generic/tclCompile.c: fixed problem where setting to {} array would intermittently not work. (Fontaine) [Bug: 3339] * generic/tclCmdMZ.c: * generic/tclExecute.c: optimized INST_TRY_CVT_TO_NUMERIC to recognize boolean objects. (Spjuth) [Bug: 2815] * tests/info.test: * tests/parseOld.test: * generic/tclCmdAH.c: * generic/tclProc.c: changed Tcl_UplevelObjCmd (uplevel) and Tcl_EvalObjCmd (eval) to use TCL_EVAL_DIRECT in the single arg case as well, to take advantage of potential pure list input optimization. This means that it won't get byte compiled though, which should be acceptable. * generic/tclBasic.c: made Tcl_EvalObjEx pure list object aware in the TCL_EVAL_DIRECT case for efficiency. * generic/tclUtil.c: made Tcl_ConcatObj pure list object aware, and return a list object in that case [Bug: 2098 2257] * generic/tclMain.c: changed Tcl_Main to not constantly reuse the commandPtr object (interactive case) as it could be shared. (Fellows)
Diffstat (limited to 'generic/tclUtil.c')
-rw-r--r--generic/tclUtil.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/generic/tclUtil.c b/generic/tclUtil.c
index da38b97..6e99f32 100644
--- a/generic/tclUtil.c
+++ b/generic/tclUtil.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclUtil.c,v 1.16 1999/12/08 03:49:52 hobbs Exp $
+ * RCS: @(#) $Id: tclUtil.c,v 1.17 1999/12/12 02:26:43 hobbs Exp $
*/
#include "tclInt.h"
@@ -1005,6 +1005,38 @@ Tcl_ConcatObj(objc, objv)
char *concatStr;
Tcl_Obj *objPtr;
+ /*
+ * Check first to see if all the items are of list type. If so,
+ * we will concat them together as lists, and return a list object.
+ * This is only valid when the lists have no current string
+ * representation, since we don't know what the original type was.
+ * An original string rep may have lost some whitespace info when
+ * converted which could be important.
+ */
+ for (i = 0; i < objc; i++) {
+ objPtr = objv[i];
+ if ((objPtr->typePtr != &tclListType) || (objPtr->bytes != NULL)) {
+ break;
+ }
+ }
+ if (i == objc) {
+ Tcl_Obj **listv;
+ int listc;
+
+ objPtr = Tcl_NewListObj(0, NULL);
+ for (i = 0; i < objc; i++) {
+ /*
+ * Tcl_ListObjAppendList could be used here, but this saves
+ * us a bit of type checking (since we've already done it)
+ * Use of INT_MAX tells us to always put the new stuff on
+ * the end. It will be set right in Tcl_ListObjReplace.
+ */
+ Tcl_ListObjGetElements(NULL, objv[i], &listc, &listv);
+ Tcl_ListObjReplace(NULL, objPtr, INT_MAX, 0, listc, listv);
+ }
+ return objPtr;
+ }
+
allocSize = 0;
for (i = 0; i < objc; i++) {
objPtr = objv[i];