summaryrefslogtreecommitdiffstats
path: root/Python/bltinmodule.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-05-07 00:12:39 (GMT)
committerGitHub <noreply@github.com>2024-05-07 00:12:39 (GMT)
commit723d4d2fe8e77b398f0ccffcfa541149caaac6a1 (patch)
tree8d213981ac3bc060c5046acdc256015d2c821476 /Python/bltinmodule.c
parent8d8275b0cf43f0e20c72a9641cbddc5044cdae04 (diff)
downloadcpython-723d4d2fe8e77b398f0ccffcfa541149caaac6a1.zip
cpython-723d4d2fe8e77b398f0ccffcfa541149caaac6a1.tar.gz
cpython-723d4d2fe8e77b398f0ccffcfa541149caaac6a1.tar.bz2
gh-118527: Intern code consts in free-threaded build (#118667)
We already intern and immortalize most string constants. In the free-threaded build, other constants can be a source of reference count contention because they are shared by all threads running the same code objects.
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r--Python/bltinmodule.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index e7b60eb..d192d5b 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -866,8 +866,21 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename,
if (str == NULL)
goto error;
+#ifdef Py_GIL_DISABLED
+ // gh-118527: Disable immortalization of code constants for explicit
+ // compile() calls to get consistent frozen outputs between the default
+ // and free-threaded builds.
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ int old_value = interp->gc.immortalize.enable_on_thread_created;
+ interp->gc.immortalize.enable_on_thread_created = 0;
+#endif
+
result = Py_CompileStringObject(str, filename, start[compile_mode], &cf, optimize);
+#ifdef Py_GIL_DISABLED
+ interp->gc.immortalize.enable_on_thread_created = old_value;
+#endif
+
Py_XDECREF(source_copy);
goto finally;