diff options
| author | dgp <dgp@users.sourceforge.net> | 2016-10-31 18:10:21 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2016-10-31 18:10:21 (GMT) |
| commit | 04432d4dd19b1e69f2a31b053279a94096d43b16 (patch) | |
| tree | 8df14686aed1001cc9aaf678afbbf7ca533f503e | |
| parent | 3e4f5907b62cfe292153b06c333dcfcd25a5e9fe (diff) | |
| download | tcl-04432d4dd19b1e69f2a31b053279a94096d43b16.zip tcl-04432d4dd19b1e69f2a31b053279a94096d43b16.tar.gz tcl-04432d4dd19b1e69f2a31b053279a94096d43b16.tar.bz2 | |
Reduce copies in the pure binary implementation of [string cat].
| -rw-r--r-- | generic/tclStringObj.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index c0d85a0..1723804 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -2688,18 +2688,21 @@ TclStringCatObjv( } objv += first; objc -= first; - objResultPtr = *objv++; objc--; - if (!inPlace || Tcl_IsShared(objResultPtr)) { - objResultPtr = Tcl_DuplicateObj(objResultPtr); - } if (binary) { /* Efficiently produce a pure binary result */ unsigned char *dst; - int start; - Tcl_GetByteArrayFromObj(objResultPtr, &start); - dst = Tcl_SetByteArrayLength(objResultPtr, length) + start; + if (inPlace && !Tcl_IsShared(*objv)) { + int start; + + objResultPtr = *objv++; objc--; + Tcl_GetByteArrayFromObj(objResultPtr, &start); + dst = Tcl_SetByteArrayLength(objResultPtr, length) + start; + } else { + objResultPtr = Tcl_NewByteArrayObj(NULL, length); + dst = Tcl_SetByteArrayLength(objResultPtr, length); + } while (objc--) { Tcl_Obj *objPtr = *objv++; @@ -2711,6 +2714,15 @@ TclStringCatObjv( } } } else { + + + objResultPtr = *objv++; objc--; + if (!inPlace || Tcl_IsShared(objResultPtr)) { + objResultPtr = Tcl_DuplicateObj(objResultPtr); + } + + + while (objc--) { Tcl_AppendObjToObj(objResultPtr, *objv++); } |
