]> granicus.if.org Git - python/commitdiff
Optimize PyUnicode_DecodeCharmap()
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 9 Apr 2013 20:13:33 +0000 (22:13 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 9 Apr 2013 20:13:33 +0000 (22:13 +0200)
Avoid expensive PyUnicode_READ() and PyUnicode_WRITE(), manipulate pointers
instead.

Objects/unicodeobject.c

index e0b507f3f080b0bb49cb0307b061e3f3a21eea5e..bf49ce5962c6ef29b280f0dc1d361086d461b1b7 100644 (file)
@@ -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;
                     }