diff -r 9304172ee5eb Objects/unicodeobject.c --- a/Objects/unicodeobject.c Thu Mar 29 09:18:14 2012 +0200 +++ b/Objects/unicodeobject.c Fri Mar 30 11:42:18 2012 +0300 @@ -5393,9 +5393,11 @@ #if (SIZEOF_LONG == 8) # define FAST_CHAR_MASK 0x8000800080008000L # define SWAPPED_FAST_CHAR_MASK 0x0080008000800080L +# define STRIPPED_MASK 0x00FF00FF00FF00FFL #elif (SIZEOF_LONG == 4) # define FAST_CHAR_MASK 0x80008000L # define SWAPPED_FAST_CHAR_MASK 0x00800080L +# define STRIPPED_MASK 0x00FF00FFL #else # error C 'long' size should be either 4 or 8! #endif @@ -5497,7 +5499,6 @@ void *data = PyUnicode_DATA(unicode); while (_q < aligned_end) { unsigned long block = * (unsigned long *) _q; - unsigned short *pblock = (unsigned short*)█ Py_UCS4 maxch; if (native_ordering) { /* Can use buffer directly */ @@ -5506,23 +5507,17 @@ } else { /* Need to byte-swap */ - unsigned char *_p = (unsigned char*)pblock; if (block & SWAPPED_FAST_CHAR_MASK) break; - _p[0] = _q[1]; - _p[1] = _q[0]; - _p[2] = _q[3]; - _p[3] = _q[2]; -#if (SIZEOF_LONG == 8) - _p[4] = _q[5]; - _p[5] = _q[4]; - _p[6] = _q[7]; - _p[7] = _q[6]; -#endif - } - maxch = Py_MAX(pblock[0], pblock[1]); + block = ((block >> 8) & STRIPPED_MASK) | + ((block & STRIPPED_MASK) << 8); + } + maxch = Py_MAX((Py_UCS2)(block & 0xFFFFu), + (Py_UCS2)((block >> 16) & 0xFFFFu)); #if SIZEOF_LONG == 8 - maxch = Py_MAX(maxch, Py_MAX(pblock[2], pblock[3])); + maxch = Py_MAX(maxch, + Py_MAX((Py_UCS2)((block >> 32) & 0xFFFFu), + (Py_UCS2)((block >> 48) & 0xFFFFu))); #endif if (maxch > PyUnicode_MAX_CHAR_VALUE(unicode)) { if (unicode_widen(&unicode, maxch) < 0) @@ -5530,11 +5525,20 @@ kind = PyUnicode_KIND(unicode); data = PyUnicode_DATA(unicode); } - PyUnicode_WRITE(kind, data, outpos++, pblock[0]); - PyUnicode_WRITE(kind, data, outpos++, pblock[1]); +#ifdef BYTEORDER_IS_LITTLE_ENDIAN + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)(block & 0xFFFFu)); + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)((block >> 16) & 0xFFFFu)); #if SIZEOF_LONG == 8 - PyUnicode_WRITE(kind, data, outpos++, pblock[2]); - PyUnicode_WRITE(kind, data, outpos++, pblock[3]); + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)((block >> 32) & 0xFFFFu)); + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)((block >> 48) & 0xFFFFu)); +#endif +#else +#if SIZEOF_LONG == 8 + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)((block >> 48) & 0xFFFFu)); + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)((block >> 32) & 0xFFFFu)); +#endif + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)((block >> 16) & 0xFFFFu)); + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)(block & 0xFFFFu)); #endif _q += SIZEOF_LONG; }