comparison Python/sysmodule.c @ 86974:954167ce92a3

Issue #19512: add some common identifiers to only create common strings once, instead of creating temporary Unicode string objects Add also more identifiers in pythonrun.c to avoid temporary Unicode string objets for the interactive interpreter.
author Victor Stinner <victor.stinner@gmail.com>
date Wed, 06 Nov 2013 22:41:44 +0100
parents 5e402c16a74c
children 01c4a0af73cf
comparison
equal deleted inserted replaced
86973:6348764bacdd 86974:954167ce92a3
181 Py_INCREF(Py_None); 181 Py_INCREF(Py_None);
182 return Py_None; 182 return Py_None;
183 } 183 }
184 if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0) 184 if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)
185 return NULL; 185 return NULL;
186 outf = PySys_GetObject("stdout"); 186 outf = _PySys_GetObjectId(&_PyId_stdout);
187 if (outf == NULL || outf == Py_None) { 187 if (outf == NULL || outf == Py_None) {
188 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); 188 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
189 return NULL; 189 return NULL;
190 } 190 }
191 if (PyFile_WriteObject(o, outf, 0) != 0) { 191 if (PyFile_WriteObject(o, outf, 0) != 0) {
1823 PySys_SetPath(const wchar_t *path) 1823 PySys_SetPath(const wchar_t *path)
1824 { 1824 {
1825 PyObject *v; 1825 PyObject *v;
1826 if ((v = makepathobject(path, DELIM)) == NULL) 1826 if ((v = makepathobject(path, DELIM)) == NULL)
1827 Py_FatalError("can't create sys.path"); 1827 Py_FatalError("can't create sys.path");
1828 if (PySys_SetObject("path", v) != 0) 1828 if (_PySys_SetObjectId(&_PyId_path, v) != 0)
1829 Py_FatalError("can't assign sys.path"); 1829 Py_FatalError("can't assign sys.path");
1830 Py_DECREF(v); 1830 Py_DECREF(v);
1831 } 1831 }
1832 1832
1833 static PyObject * 1833 static PyObject *
1892 wchar_t fullpath[MAXPATHLEN]; 1892 wchar_t fullpath[MAXPATHLEN];
1893 #elif defined(MS_WINDOWS) && !defined(MS_WINCE) 1893 #elif defined(MS_WINDOWS) && !defined(MS_WINCE)
1894 wchar_t fullpath[MAX_PATH]; 1894 wchar_t fullpath[MAX_PATH];
1895 #endif 1895 #endif
1896 1896
1897 path = PySys_GetObject("path"); 1897 path = _PySys_GetObjectId(&_PyId_path);
1898 if (path == NULL) 1898 if (path == NULL)
1899 return; 1899 return;
1900 1900
1901 argv0 = argv[0]; 1901 argv0 = argv[0];
1902 1902
2079 which can print hundreds of digits for very large numbers. 2079 which can print hundreds of digits for very large numbers.
2080 2080
2081 */ 2081 */
2082 2082
2083 static void 2083 static void
2084 sys_write(char *name, FILE *fp, const char *format, va_list va) 2084 sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
2085 { 2085 {
2086 PyObject *file; 2086 PyObject *file;
2087 PyObject *error_type, *error_value, *error_traceback; 2087 PyObject *error_type, *error_value, *error_traceback;
2088 char buffer[1001]; 2088 char buffer[1001];
2089 int written; 2089 int written;
2090 2090
2091 PyErr_Fetch(&error_type, &error_value, &error_traceback); 2091 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2092 file = PySys_GetObject(name); 2092 file = _PySys_GetObjectId(key);
2093 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va); 2093 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
2094 if (sys_pyfile_write(buffer, file) != 0) { 2094 if (sys_pyfile_write(buffer, file) != 0) {
2095 PyErr_Clear(); 2095 PyErr_Clear();
2096 fputs(buffer, fp); 2096 fputs(buffer, fp);
2097 } 2097 }
2107 PySys_WriteStdout(const char *format, ...) 2107 PySys_WriteStdout(const char *format, ...)
2108 { 2108 {
2109 va_list va; 2109 va_list va;
2110 2110
2111 va_start(va, format); 2111 va_start(va, format);
2112 sys_write("stdout", stdout, format, va); 2112 sys_write(&_PyId_stdout, stdout, format, va);
2113 va_end(va); 2113 va_end(va);
2114 } 2114 }
2115 2115
2116 void 2116 void
2117 PySys_WriteStderr(const char *format, ...) 2117 PySys_WriteStderr(const char *format, ...)
2118 { 2118 {
2119 va_list va; 2119 va_list va;
2120 2120
2121 va_start(va, format); 2121 va_start(va, format);
2122 sys_write("stderr", stderr, format, va); 2122 sys_write(&_PyId_stderr, stderr, format, va);
2123 va_end(va); 2123 va_end(va);
2124 } 2124 }
2125 2125
2126 static void 2126 static void
2127 sys_format(char *name, FILE *fp, const char *format, va_list va) 2127 sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
2128 { 2128 {
2129 PyObject *file, *message; 2129 PyObject *file, *message;
2130 PyObject *error_type, *error_value, *error_traceback; 2130 PyObject *error_type, *error_value, *error_traceback;
2131 char *utf8; 2131 char *utf8;
2132 2132
2133 PyErr_Fetch(&error_type, &error_value, &error_traceback); 2133 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2134 file = PySys_GetObject(name); 2134 file = _PySys_GetObjectId(key);
2135 message = PyUnicode_FromFormatV(format, va); 2135 message = PyUnicode_FromFormatV(format, va);
2136 if (message != NULL) { 2136 if (message != NULL) {
2137 if (sys_pyfile_write_unicode(message, file) != 0) { 2137 if (sys_pyfile_write_unicode(message, file) != 0) {
2138 PyErr_Clear(); 2138 PyErr_Clear();
2139 utf8 = _PyUnicode_AsString(message); 2139 utf8 = _PyUnicode_AsString(message);
2149 PySys_FormatStdout(const char *format, ...) 2149 PySys_FormatStdout(const char *format, ...)
2150 { 2150 {
2151 va_list va; 2151 va_list va;
2152 2152
2153 va_start(va, format); 2153 va_start(va, format);
2154 sys_format("stdout", stdout, format, va); 2154 sys_format(&_PyId_stdout, stdout, format, va);
2155 va_end(va); 2155 va_end(va);
2156 } 2156 }
2157 2157
2158 void 2158 void
2159 PySys_FormatStderr(const char *format, ...) 2159 PySys_FormatStderr(const char *format, ...)
2160 { 2160 {
2161 va_list va; 2161 va_list va;
2162 2162
2163 va_start(va, format); 2163 va_start(va, format);
2164 sys_format("stderr", stderr, format, va); 2164 sys_format(&_PyId_stderr, stderr, format, va);
2165 va_end(va); 2165 va_end(va);
2166 } 2166 }