diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2011-08-25 12:00:14 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2011-08-25 12:00:14 (GMT) |
commit | 545f0cffe802c26b1779eb2f9ca6c4ade8c8c654 (patch) | |
tree | e1834a55260ec88ece1ed1bbf04863a7e66c9640 /generic | |
parent | fe0b615064efb673ddf7e8d4f1d934aaabda0cd1 (diff) | |
download | tcl-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.c | 25 |
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(); |