summaryrefslogtreecommitdiffstats
path: root/generic/tclStringObj.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2011-08-25 12:00:14 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2011-08-25 12:00:14 (GMT)
commitab8c4f09c25d4d42430f23d8657e1e839ad9d77b (patch)
treee1834a55260ec88ece1ed1bbf04863a7e66c9640 /generic/tclStringObj.c
parent2bf96586b6f4eb4b029f4f02bf0aadea39c3bbb2 (diff)
downloadtcl-ab8c4f09c25d4d42430f23d8657e1e839ad9d77b.zip
tcl-ab8c4f09c25d4d42430f23d8657e1e839ad9d77b.tar.gz
tcl-ab8c4f09c25d4d42430f23d8657e1e839ad9d77b.tar.bz2
[Enh 3396731] Follow-up: special case for Pure-unicode representation
Diffstat (limited to 'generic/tclStringObj.c')
-rw-r--r--generic/tclStringObj.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index 993a694..9cb973e 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -2661,6 +2661,31 @@ TclStringObjReverse(
Tcl_Obj *resultPtr = objPtr;
char c;
+ /* Special case: Pure Unicode array */
+ if ((objPtr->typePtr == &tclStringType) && !objPtr->bytes) {
+ String *strPtr = GET_STRING(objPtr);
+ if (strPtr->hasUnicode) {
+ String *dstStrPtr = stringAlloc(strPtr->numChars);
+ Tcl_UniChar *chars = strPtr->unicode;
+ Tcl_UniChar *dstChars = dstStrPtr->unicode + strPtr->numChars;
+
+ resultPtr = Tcl_NewObj();
+ resultPtr->bytes = NULL;
+ SET_STRING(resultPtr, dstStrPtr);
+ resultPtr->typePtr = &tclStringType;
+ dstStrPtr->maxChars = strPtr->numChars;
+ dstStrPtr->unicode[strPtr->numChars] = 0;
+ dstStrPtr->numChars = strPtr->numChars;
+ dstStrPtr->hasUnicode = 1;
+ dstStrPtr->allocated = 0;
+
+ while (--dstChars >= dstStrPtr->unicode) {
+ *dstChars = *chars++;
+ }
+ return resultPtr;
+ }
+ }
+
src = TclGetString(objPtr);
if (Tcl_IsShared(objPtr)) {
resultPtr = Tcl_NewObj();