]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #19512: sys_displayhook() now uses an identifier for "builtins"
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 6 Nov 2013 17:27:13 +0000 (18:27 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 6 Nov 2013 17:27:13 +0000 (18:27 +0100)
dictionary key and only decodes "\n" string once to write a newline.

So "builtins" and "\n" are only decoded once from UTF-8, at the first call.

Python/sysmodule.c

index 97ce0594b55e0e8abc4ba80949ad6a3a0366af12..b8cf31d435134f0ed39850407b2ecd6859d4e4b9 100644 (file)
@@ -137,10 +137,13 @@ sys_displayhook(PyObject *self, PyObject *o)
     PyObject *outf;
     PyInterpreterState *interp = PyThreadState_GET()->interp;
     PyObject *modules = interp->modules;
-    PyObject *builtins = PyDict_GetItemString(modules, "builtins");
+    PyObject *builtins;
+    static PyObject *newline = NULL;
     int err;
     _Py_IDENTIFIER(_);
+    _Py_IDENTIFIER(builtins);
 
+    builtins = _PyDict_GetItemId(modules, &PyId_builtins);
     if (builtins == NULL) {
         PyErr_SetString(PyExc_RuntimeError, "lost builtins module");
         return NULL;
@@ -173,7 +176,12 @@ sys_displayhook(PyObject *self, PyObject *o)
             return NULL;
         }
     }
-    if (PyFile_WriteString("\n", outf) != 0)
+    if (newline == NULL) {
+        newline = PyUnicode_FromString("\n");
+        if (newline == NULL)
+            return NULL;
+    }
+    if (PyFile_WriteObject(newline, outf, Py_PRINT_RAW) != 0)
         return NULL;
     if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0)
         return NULL;