summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--generic/tclCmdIL.c31
2 files changed, 14 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 365cff4..911f166 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2007-03-02 Don Porter <dgp@users.sourceforge.net>
+ * generic/tclCmdIL.c (Tcl_JoinObjCmd): Revised [join] implementation
+ to append Tcl_Obj's instead of strings. [RFE 1669420]
+
* generic/tclCmdIL.c (Info*Cmd): Code simplifications and
optimizations.
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index 9464151..734c1dd 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -16,7 +16,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclCmdIL.c,v 1.103 2007/03/02 14:54:52 dgp Exp $
+ * RCS: @(#) $Id: tclCmdIL.c,v 1.104 2007/03/02 15:11:20 dgp Exp $
*/
#include "tclInt.h"
@@ -2451,17 +2451,10 @@ Tcl_JoinObjCmd(
int objc, /* Number of arguments. */
Tcl_Obj *CONST objv[]) /* The argument objects. */
{
- char *joinString, *bytes;
- int joinLength, listLen, length, i, result;
- Tcl_Obj **elemPtrs;
- Tcl_Obj *resObjPtr;
+ int listLen, i;
+ Tcl_Obj *resObjPtr, *joinObjPtr, **elemPtrs;
- if (objc == 2) {
- joinString = " ";
- joinLength = 1;
- } else if (objc == 3) {
- joinString = Tcl_GetStringFromObj(objv[2], &joinLength);
- } else {
+ if ((objc < 2) || (objc > 3)) {
Tcl_WrongNumArgs(interp, 1, objv, "list ?joinString?");
return TCL_ERROR;
}
@@ -2471,23 +2464,21 @@ Tcl_JoinObjCmd(
* pointer to its array of element pointers.
*/
- result = Tcl_ListObjGetElements(interp, objv[1], &listLen, &elemPtrs);
- if (result != TCL_OK) {
- return result;
+ if (TCL_OK != Tcl_ListObjGetElements(interp, objv[1], &listLen, &elemPtrs)) {
+ return TCL_ERROR;
}
- /*
- * Now concatenate strings to form the "joined" result.
- */
+ joinObjPtr = (objc == 2) ? Tcl_NewStringObj(" ", 1) : objv[2];
+ Tcl_IncrRefCount(joinObjPtr);
resObjPtr = Tcl_NewObj();
for (i = 0; i < listLen; i++) {
- bytes = Tcl_GetStringFromObj(elemPtrs[i], &length);
if (i > 0) {
- Tcl_AppendToObj(resObjPtr, joinString, joinLength);
+ Tcl_AppendObjToObj(resObjPtr, joinObjPtr);
}
- Tcl_AppendToObj(resObjPtr, bytes, length);
+ Tcl_AppendObjToObj(resObjPtr, elemPtrs[i]);
}
+ Tcl_DecrRefCount(joinObjPtr);
Tcl_SetObjResult(interp, resObjPtr);
return TCL_OK;
}