diff -r 0741add59487 Objects/unicodeobject.c --- a/Objects/unicodeobject.c Mon Mar 19 13:17:24 2012 +0100 +++ b/Objects/unicodeobject.c Tue Mar 20 15:46:45 2012 +0200 @@ -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,16 @@ } 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, (Py_UCS2)(block >> 16)); #if SIZEOF_LONG == 8 - maxch = Py_MAX(maxch, Py_MAX(pblock[2], pblock[3])); + maxch = Py_MAX(maxch, + Py_MAX((Py_UCS2)(block >> 32), + (Py_UCS2)(block >> 48))); #endif if (maxch > PyUnicode_MAX_CHAR_VALUE(unicode)) { if (unicode_widen(&unicode, maxch) < 0) @@ -5530,11 +5524,11 @@ kind = PyUnicode_KIND(unicode); data = PyUnicode_DATA(unicode); } - PyUnicode_WRITE(kind, data, outpos++, pblock[0]); - PyUnicode_WRITE(kind, data, outpos++, pblock[1]); + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)block); + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)(block >> 16)); #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)); + PyUnicode_WRITE(kind, data, outpos++, (Py_UCS2)(block >> 48)); #endif _q += SIZEOF_LONG; }