summaryrefslogtreecommitdiffstats
path: root/generic
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)
commit545f0cffe802c26b1779eb2f9ca6c4ade8c8c654 (patch)
treee1834a55260ec88ece1ed1bbf04863a7e66c9640 /generic
parentfe0b615064efb673ddf7e8d4f1d934aaabda0cd1 (diff)
downloadtcl-545f0cffe802c26b1779eb2f9ca6c4ade8c8c654.zip
tcl-545f0cffe802c26b1779eb2f9ca6c4ade8c8c654.tar.gz
tcl-545f0cffe802c26b1779eb2f9ca6c4ade8c8c654.tar.bz2
[Enh 3396731] Follow-up: special case for Pure-unicode representation
Diffstat (limited to 'generic')
-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();