]> granicus.if.org Git - python/commitdiff
marshal: optimize parsing of empty Unicode strings
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 21 Jun 2013 17:08:06 +0000 (19:08 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 21 Jun 2013 17:08:06 +0000 (19:08 +0200)
Don't create a temporary buffer of zeroy byte nor call r_string() if the length
is zero, create directly the empty string.

Python/marshal.c

index 3e13851704801efa08c1b0b2a1f5350589ed1ffb..e519fc9bfa89b3df9a7c8fba397dd923abd14775 100644 (file)
@@ -979,20 +979,25 @@ r_object(RFILE *p)
             retval = NULL;
             break;
         }
-        buffer = PyMem_NEW(char, n);
-        if (buffer == NULL) {
-            retval = PyErr_NoMemory();
-            break;
-        }
-        if (r_string(buffer, n, p) != n) {
+        if (n != 0) {
+            buffer = PyMem_NEW(char, n);
+            if (buffer == NULL) {
+                retval = PyErr_NoMemory();
+                break;
+            }
+            if (r_string(buffer, n, p) != n) {
+                PyMem_DEL(buffer);
+                PyErr_SetString(PyExc_EOFError,
+                    "EOF read where object expected");
+                retval = NULL;
+                break;
+            }
+            v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
             PyMem_DEL(buffer);
-            PyErr_SetString(PyExc_EOFError,
-                "EOF read where object expected");
-            retval = NULL;
-            break;
         }
-        v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
-        PyMem_DEL(buffer);
+        else {
+            v = PyUnicode_New(0, 0);
+        }
         if (type == TYPE_INTERNED)
             PyUnicode_InternInPlace(&v);
         retval = v;