summaryrefslogtreecommitdiffstats
path: root/Objects/unicodeobject.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-04-09 20:13:33 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-04-09 20:13:33 (GMT)
commit63d5c1a14a644a794bff8d7f9ebc789a85925def (patch)
tree44e215686fbdb5c81c8e8fe312b13720e1583046 /Objects/unicodeobject.c
parenta85af502a4e11d910701f5b7fe16b44c400bf57b (diff)
downloadcpython-63d5c1a14a644a794bff8d7f9ebc789a85925def.zip
cpython-63d5c1a14a644a794bff8d7f9ebc789a85925def.tar.gz
cpython-63d5c1a14a644a794bff8d7f9ebc789a85925def.tar.bz2
Optimize PyUnicode_DecodeCharmap()
Avoid expensive PyUnicode_READ() and PyUnicode_WRITE(), manipulate pointers instead.
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r--Objects/unicodeobject.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index e0b507f..bf49ce5 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -7351,27 +7351,29 @@ PyUnicode_DecodeCharmap(const char *s,
while (s < e) {
if (mapkind == PyUnicode_2BYTE_KIND && maplen >= 256) {
enum PyUnicode_Kind outkind = writer.kind;
- void *outdata = writer.data;
+ Py_UCS2 *mapdata_ucs2 = (Py_UCS2 *)mapdata;
if (outkind == PyUnicode_1BYTE_KIND) {
+ Py_UCS1 *outdata = (Py_UCS1 *)writer.data;
Py_UCS4 maxchar = writer.maxchar;
while (s < e) {
- unsigned char ch = *s;
- x = PyUnicode_READ(PyUnicode_2BYTE_KIND, mapdata, ch);
+ ch = *s;
+ x = mapdata_ucs2[ch];
if (x > maxchar)
goto Error;
- PyUnicode_WRITE(PyUnicode_1BYTE_KIND, outdata, writer.pos, x);
+ outdata[writer.pos] = x;
writer.pos++;
++s;
}
break;
}
else if (outkind == PyUnicode_2BYTE_KIND) {
+ Py_UCS2 *outdata = (Py_UCS2 *)writer.data;
while (s < e) {
- unsigned char ch = *s;
- x = PyUnicode_READ(PyUnicode_2BYTE_KIND, mapdata, ch);
+ ch = *s;
+ x = mapdata_ucs2[ch];
if (x == 0xFFFE)
goto Error;
- PyUnicode_WRITE(PyUnicode_2BYTE_KIND, outdata, writer.pos, x);
+ outdata[writer.pos] = x;
writer.pos++;
++s;
}