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.
diff --git a/Include/object.h b/Include/object.h
index ef45838..a36c5be 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -143,9 +143,17 @@
PyObject *object;
} _Py_Identifier;
-#define _Py_static_string(varname, value) static _Py_Identifier varname = { 0, value, 0 }
+#define _Py_static_string_init(value) { 0, value, 0 }
+#define _Py_static_string(varname, value) static _Py_Identifier varname = _Py_static_string_init(value)
#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname)
+/* Common identifiers */
+PyAPI_DATA(_Py_Identifier) _PyId_path;
+PyAPI_DATA(_Py_Identifier) _PyId_argv;
+PyAPI_DATA(_Py_Identifier) _PyId_stdin;
+PyAPI_DATA(_Py_Identifier) _PyId_stdout;
+PyAPI_DATA(_Py_Identifier) _PyId_stderr;
+
/*
Type objects contain a string containing the type name (to help somewhat
in debugging), the allocation parameters (see PyObject_New() and
@@ -829,7 +837,7 @@
PyObject *_py_xincref_tmp = (PyObject *)(op); \
if (_py_xincref_tmp != NULL) \
Py_INCREF(_py_xincref_tmp); \
- } while (0)
+ } while (0)
#define Py_XDECREF(op) \
do { \
diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c
index ec8fd12..756f4ef 100644
--- a/Modules/_ctypes/callbacks.c
+++ b/Modules/_ctypes/callbacks.c
@@ -80,7 +80,7 @@
PrintError(char *msg, ...)
{
char buf[512];
- PyObject *f = PySys_GetObject("stderr");
+ PyObject *f = _PySys_GetObjectId(&_PyId_stderr);
va_list marker;
va_start(marker, msg);
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index 1f192dc..5cdd926 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -2578,7 +2578,7 @@
if (fd == -1) {
PyObject* sys_stdout;
- sys_stdout = PySys_GetObject("stdout");
+ sys_stdout = _PySys_GetObjectId(&_PyId_stdout);
if (sys_stdout == NULL || sys_stdout == Py_None) {
PyErr_SetString(
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index 32656c9..a7123b7 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -1005,7 +1005,7 @@
PySys_WriteStderr(
"Unhandled exception in thread started by ");
PyErr_Fetch(&exc, &value, &tb);
- file = PySys_GetObject("stderr");
+ file = _PySys_GetObjectId(&_PyId_stderr);
if (file != NULL && file != Py_None)
PyFile_WriteObject(boot->func, file, 0);
else
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index 47bc9e8..315b32d 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -136,7 +136,7 @@
int fd;
if (file == NULL || file == Py_None) {
- file = PySys_GetObject("stderr");
+ file = _PySys_GetObjectId(&_PyId_stderr);
if (file == NULL) {
PyErr_SetString(PyExc_RuntimeError, "unable to get sys.stderr");
return NULL;
diff --git a/Modules/main.c b/Modules/main.c
index 9171070..4b1a968 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -261,7 +261,7 @@
/* argv0 is usable as an import source, so put it in sys.path[0]
and import __main__ */
- sys_path = PySys_GetObject("path");
+ sys_path = _PySys_GetObjectId(&_PyId_path);
if (sys_path == NULL) {
PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
goto error;
diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c
index 9d79eec..edd12ab 100644
--- a/Modules/syslogmodule.c
+++ b/Modules/syslogmodule.c
@@ -71,7 +71,7 @@
Py_ssize_t argv_len, scriptlen;
PyObject *scriptobj;
Py_ssize_t slash;
- PyObject *argv = PySys_GetObject("argv");
+ PyObject *argv = _PySys_GetObjectId(&_PyId_argv);
if (argv == NULL) {
return(NULL);
diff --git a/Python/_warnings.c b/Python/_warnings.c
index e88f646..de60128 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -265,7 +265,7 @@
if (name == NULL) /* XXX Can an object lack a '__name__' attribute? */
goto error;
- f_stderr = PySys_GetObject("stderr");
+ f_stderr = _PySys_GetObjectId(&_PyId_stderr);
if (f_stderr == NULL) {
fprintf(stderr, "lost sys.stderr\n");
goto error;
@@ -562,7 +562,7 @@
else {
*filename = NULL;
if (*module != Py_None && PyUnicode_CompareWithASCIIString(*module, "__main__") == 0) {
- PyObject *argv = PySys_GetObject("argv");
+ PyObject *argv = _PySys_GetObjectId(&_PyId_argv);
/* PyList_Check() is needed because sys.argv is set to None during
Python finalization */
if (argv != NULL && PyList_Check(argv) && PyList_Size(argv) > 0) {
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 6069e41..6eb0ee7 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1553,7 +1553,7 @@
kwlist, &sep, &end, &file, &flush))
return NULL;
if (file == NULL || file == Py_None) {
- file = PySys_GetObject("stdout");
+ file = _PySys_GetObjectId(&_PyId_stdout);
if (file == NULL) {
PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
return NULL;
@@ -1638,9 +1638,9 @@
builtin_input(PyObject *self, PyObject *args)
{
PyObject *promptarg = NULL;
- PyObject *fin = PySys_GetObject("stdin");
- PyObject *fout = PySys_GetObject("stdout");
- PyObject *ferr = PySys_GetObject("stderr");
+ PyObject *fin = _PySys_GetObjectId(&_PyId_stdin);
+ PyObject *fout = _PySys_GetObjectId(&_PyId_stdout);
+ PyObject *ferr = _PySys_GetObjectId(&_PyId_stderr);
PyObject *tmp;
long fd;
int tty;
diff --git a/Python/errors.c b/Python/errors.c
index 1832b5b..b92911a 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -844,7 +844,7 @@
PyErr_Fetch(&t, &v, &tb);
- f = PySys_GetObject("stderr");
+ f = _PySys_GetObjectId(&_PyId_stderr);
if (f == NULL || f == Py_None)
goto done;
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 61d0352..e510e6f 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -35,6 +35,21 @@
#define PATH_MAX MAXPATHLEN
#endif
+/* Common identifiers */
+_Py_Identifier _PyId_argv = _Py_static_string_init("argv");
+_Py_Identifier _PyId_path = _Py_static_string_init("path");
+_Py_Identifier _PyId_stdin = _Py_static_string_init("stdin");
+_Py_Identifier _PyId_stdout = _Py_static_string_init("stdout");
+_Py_Identifier _PyId_stderr = _Py_static_string_init("stderr");
+
+/* local identifiers */
+_Py_IDENTIFIER(excepthook);
+_Py_IDENTIFIER(ps1);
+_Py_IDENTIFIER(ps2);
+_Py_IDENTIFIER(last_type);
+_Py_IDENTIFIER(last_value);
+_Py_IDENTIFIER(last_traceback);
+
#ifdef Py_REF_DEBUG
static
void _print_total_refs(void) {
@@ -412,7 +427,7 @@
pstderr = PyFile_NewStdPrinter(fileno(stderr));
if (pstderr == NULL)
Py_FatalError("Py_Initialize: can't set preliminary stderr");
- PySys_SetObject("stderr", pstderr);
+ _PySys_SetObjectId(&_PyId_stderr, pstderr);
PySys_SetObject("__stderr__", pstderr);
Py_DECREF(pstderr);
@@ -497,8 +512,8 @@
static void
flush_std_files(void)
{
- PyObject *fout = PySys_GetObject("stdout");
- PyObject *ferr = PySys_GetObject("stderr");
+ PyObject *fout = _PySys_GetObjectId(&_PyId_stdout);
+ PyObject *ferr = _PySys_GetObjectId(&_PyId_stderr);
PyObject *tmp;
_Py_IDENTIFIER(flush);
@@ -776,7 +791,7 @@
pstderr = PyFile_NewStdPrinter(fileno(stderr));
if (pstderr == NULL)
Py_FatalError("Py_Initialize: can't set preliminary stderr");
- PySys_SetObject("stderr", pstderr);
+ _PySys_SetObjectId(&_PyId_stderr, pstderr);
PySys_SetObject("__stderr__", pstderr);
Py_DECREF(pstderr);
@@ -1170,7 +1185,7 @@
goto error;
} /* if (fd < 0) */
PySys_SetObject("__stdin__", std);
- PySys_SetObject("stdin", std);
+ _PySys_SetObjectId(&_PyId_stdin, std);
Py_DECREF(std);
/* Set sys.stdout */
@@ -1185,7 +1200,7 @@
goto error;
} /* if (fd < 0) */
PySys_SetObject("__stdout__", std);
- PySys_SetObject("stdout", std);
+ _PySys_SetObjectId(&_PyId_stdout, std);
Py_DECREF(std);
#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
@@ -1219,7 +1234,7 @@
Py_DECREF(std);
goto error;
}
- if (PySys_SetObject("stderr", std) < 0) {
+ if (_PySys_SetObjectId(&_PyId_stderr, std) < 0) {
Py_DECREF(std);
goto error;
}
@@ -1281,14 +1296,14 @@
flags = &local_flags;
local_flags.cf_flags = 0;
}
- v = PySys_GetObject("ps1");
+ v = _PySys_GetObjectId(&PyId_ps1);
if (v == NULL) {
- PySys_SetObject("ps1", v = PyUnicode_FromString(">>> "));
+ _PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromString(">>> "));
Py_XDECREF(v);
}
- v = PySys_GetObject("ps2");
+ v = _PySys_GetObjectId(&PyId_ps2);
if (v == NULL) {
- PySys_SetObject("ps2", v = PyUnicode_FromString("... "));
+ _PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromString("... "));
Py_XDECREF(v);
}
err = -1;
@@ -1351,7 +1366,7 @@
if (fp == stdin) {
/* Fetch encoding from sys.stdin if possible. */
- v = PySys_GetObject("stdin");
+ v = _PySys_GetObjectId(&_PyId_stdin);
if (v && v != Py_None) {
oenc = _PyObject_GetAttrId(v, &PyId_encoding);
if (oenc)
@@ -1360,7 +1375,7 @@
PyErr_Clear();
}
}
- v = PySys_GetObject("ps1");
+ v = _PySys_GetObjectId(&PyId_ps1);
if (v != NULL) {
v = PyObject_Str(v);
if (v == NULL)
@@ -1373,7 +1388,7 @@
}
}
}
- w = PySys_GetObject("ps2");
+ w = _PySys_GetObjectId(&PyId_ps2);
if (w != NULL) {
w = PyObject_Str(w);
if (w == NULL)
@@ -1752,7 +1767,7 @@
if (PyLong_Check(value))
exitcode = (int)PyLong_AsLong(value);
else {
- PyObject *sys_stderr = PySys_GetObject("stderr");
+ PyObject *sys_stderr = _PySys_GetObjectId(&_PyId_stderr);
if (sys_stderr != NULL && sys_stderr != Py_None) {
PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW);
} else {
@@ -1795,11 +1810,11 @@
return;
/* Now we know v != NULL too */
if (set_sys_last_vars) {
- PySys_SetObject("last_type", exception);
- PySys_SetObject("last_value", v);
- PySys_SetObject("last_traceback", tb);
+ _PySys_SetObjectId(&PyId_last_type, exception);
+ _PySys_SetObjectId(&PyId_last_value, v);
+ _PySys_SetObjectId(&PyId_last_traceback, tb);
}
- hook = PySys_GetObject("excepthook");
+ hook = _PySys_GetObjectId(&PyId_excepthook);
if (hook) {
PyObject *args = PyTuple_Pack(3, exception, v, tb);
PyObject *result = PyEval_CallObject(hook, args);
@@ -2009,7 +2024,7 @@
PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
{
PyObject *seen;
- PyObject *f = PySys_GetObject("stderr");
+ PyObject *f = _PySys_GetObjectId(&_PyId_stderr);
if (PyExceptionInstance_Check(value)
&& tb != NULL && PyTraceBack_Check(tb)) {
/* Put the traceback on the exception, otherwise it won't get
@@ -2107,7 +2122,7 @@
/* Save the current exception */
PyErr_Fetch(&type, &value, &traceback);
- f = PySys_GetObject("stderr");
+ f = _PySys_GetObjectId(&_PyId_stderr);
if (f != NULL) {
r = _PyObject_CallMethodId(f, &PyId_flush, "");
if (r)
@@ -2115,7 +2130,7 @@
else
PyErr_Clear();
}
- f = PySys_GetObject("stdout");
+ f = _PySys_GetObjectId(&_PyId_stdout);
if (f != NULL) {
r = _PyObject_CallMethodId(f, &PyId_flush, "");
if (r)
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 32136e8..de33d55 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -183,7 +183,7 @@
}
if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)
return NULL;
- outf = PySys_GetObject("stdout");
+ outf = _PySys_GetObjectId(&_PyId_stdout);
if (outf == NULL || outf == Py_None) {
PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
return NULL;
@@ -1825,7 +1825,7 @@
PyObject *v;
if ((v = makepathobject(path, DELIM)) == NULL)
Py_FatalError("can't create sys.path");
- if (PySys_SetObject("path", v) != 0)
+ if (_PySys_SetObjectId(&_PyId_path, v) != 0)
Py_FatalError("can't assign sys.path");
Py_DECREF(v);
}
@@ -1894,7 +1894,7 @@
wchar_t fullpath[MAX_PATH];
#endif
- path = PySys_GetObject("path");
+ path = _PySys_GetObjectId(&_PyId_path);
if (path == NULL)
return;
@@ -2081,7 +2081,7 @@
*/
static void
-sys_write(char *name, FILE *fp, const char *format, va_list va)
+sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
{
PyObject *file;
PyObject *error_type, *error_value, *error_traceback;
@@ -2089,7 +2089,7 @@
int written;
PyErr_Fetch(&error_type, &error_value, &error_traceback);
- file = PySys_GetObject(name);
+ file = _PySys_GetObjectId(key);
written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
if (sys_pyfile_write(buffer, file) != 0) {
PyErr_Clear();
@@ -2109,7 +2109,7 @@
va_list va;
va_start(va, format);
- sys_write("stdout", stdout, format, va);
+ sys_write(&_PyId_stdout, stdout, format, va);
va_end(va);
}
@@ -2119,19 +2119,19 @@
va_list va;
va_start(va, format);
- sys_write("stderr", stderr, format, va);
+ sys_write(&_PyId_stderr, stderr, format, va);
va_end(va);
}
static void
-sys_format(char *name, FILE *fp, const char *format, va_list va)
+sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
{
PyObject *file, *message;
PyObject *error_type, *error_value, *error_traceback;
char *utf8;
PyErr_Fetch(&error_type, &error_value, &error_traceback);
- file = PySys_GetObject(name);
+ file = _PySys_GetObjectId(key);
message = PyUnicode_FromFormatV(format, va);
if (message != NULL) {
if (sys_pyfile_write_unicode(message, file) != 0) {
@@ -2151,7 +2151,7 @@
va_list va;
va_start(va, format);
- sys_format("stdout", stdout, format, va);
+ sys_format(&_PyId_stdout, stdout, format, va);
va_end(va);
}
@@ -2161,6 +2161,6 @@
va_list va;
va_start(va, format);
- sys_format("stderr", stderr, format, va);
+ sys_format(&_PyId_stderr, stderr, format, va);
va_end(va);
}
diff --git a/Python/traceback.c b/Python/traceback.c
index 01e9473..b0bed5f 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -169,7 +169,7 @@
tail++;
taillen = strlen(tail);
- syspath = PySys_GetObject("path");
+ syspath = _PySys_GetObjectId(&_PyId_path);
if (syspath == NULL || !PyList_Check(syspath))
goto error;
npath = PyList_Size(syspath);