cpython: 2c514c382a2a (original) (raw)
--- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5496,33 +5496,39 @@ PyUnicode_DecodeUTF16Stateful(const char int kind = PyUnicode_KIND(unicode); void *data = PyUnicode_DATA(unicode); while (_q < aligned_end) {
unsigned long block = * (unsigned long *) _q;[](#l1.7)
unsigned short *pblock = (unsigned short*)█[](#l1.8)
union {[](#l1.9)
unsigned long as_long;[](#l1.10)
unsigned short units[sizeof(long) / sizeof(short)];[](#l1.11)
unsigned char bytes[sizeof(long)];[](#l1.12)
} block, block_copy;[](#l1.13) Py_UCS4 maxch;[](#l1.14)
block.as_long = *(unsigned long *) _q;[](#l1.16) if (native_ordering) {[](#l1.17) /* Can use buffer directly */[](#l1.18)
if (block & FAST_CHAR_MASK)[](#l1.19)
if (block.as_long & FAST_CHAR_MASK)[](#l1.20) break;[](#l1.21) }[](#l1.22) else {[](#l1.23) /* Need to byte-swap */[](#l1.24)
unsigned char *_p = (unsigned char*)pblock;[](#l1.25)
if (block & SWAPPED_FAST_CHAR_MASK)[](#l1.26)
block_copy = block;[](#l1.27)
if (block.as_long & SWAPPED_FAST_CHAR_MASK)[](#l1.29) break;[](#l1.30)
_p[0] = _q[1];[](#l1.31)
_p[1] = _q[0];[](#l1.32)
_p[2] = _q[3];[](#l1.33)
_p[3] = _q[2];[](#l1.34)
block.bytes[0] = block_copy.bytes[1];[](#l1.35)
block.bytes[1] = block_copy.bytes[0];[](#l1.36)
block.bytes[2] = block_copy.bytes[3];[](#l1.37)
block.bytes[3] = block_copy.bytes[2];[](#l1.38)
_p[4] = _q[5];[](#l1.40)
_p[5] = _q[4];[](#l1.41)
_p[6] = _q[7];[](#l1.42)
_p[7] = _q[6];[](#l1.43)
}[](#l1.45)
maxch = Py_MAX(pblock[0], pblock[1]);[](#l1.46)
block.bytes[4] = block_copy.bytes[5];[](#l1.47)
block.bytes[5] = block_copy.bytes[4];[](#l1.48)
block.bytes[6] = block_copy.bytes[7];[](#l1.49)
block.bytes[7] = block_copy.bytes[6];[](#l1.50)
}[](#l1.52)
maxch = Py_MAX(block.units[0], block.units[1]);[](#l1.53)
maxch = Py_MAX(maxch, Py_MAX(pblock[2], pblock[3]));[](#l1.55)
maxch = Py_MAX(maxch, Py_MAX(block.units[2], block.units[3]));[](#l1.56)
#endif if (maxch > PyUnicode_MAX_CHAR_VALUE(unicode)) { if (unicode_widen(&unicode, maxch) < 0) @@ -5530,11 +5536,11 @@ PyUnicode_DecodeUTF16Stateful(const char kind = PyUnicode_KIND(unicode); data = PyUnicode_DATA(unicode); }
PyUnicode_WRITE(kind, data, outpos++, pblock[0]);[](#l1.64)
PyUnicode_WRITE(kind, data, outpos++, pblock[1]);[](#l1.65)
PyUnicode_WRITE(kind, data, outpos++, block.units[0]);[](#l1.66)
PyUnicode_WRITE(kind, data, outpos++, block.units[1]);[](#l1.67)
PyUnicode_WRITE(kind, data, outpos++, pblock[2]);[](#l1.69)
PyUnicode_WRITE(kind, data, outpos++, pblock[3]);[](#l1.70)
PyUnicode_WRITE(kind, data, outpos++, block.units[2]);[](#l1.71)
PyUnicode_WRITE(kind, data, outpos++, block.units[3]);[](#l1.72)