[Python-checkins] gh-105481: the ENABLE_SPECIALIZATION flag does not need to be generated by the build script, or exposed in opcode.py (#107534)

iritkatriel webhook-mailer at python.org
Tue Aug 1 13:05:04 EDT 2023


https://github.com/python/cpython/commit/6ef8f8ca88b925685c6af83a9f0a899e565e1e33
commit: 6ef8f8ca88b925685c6af83a9f0a899e565e1e33
branch: main
author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com>
committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com>
date: 2023-08-01T17:05:00Z
summary:

gh-105481: the ENABLE_SPECIALIZATION flag does not need to be generated by the build script, or exposed in opcode.py (#107534)

files:
A Misc/NEWS.d/next/Library/2023-08-01-15-17-20.gh-issue-105481.vMbmj_.rst
M Doc/whatsnew/3.13.rst
M Include/internal/pycore_code.h
M Include/opcode.h
M Lib/opcode.py
M Lib/test/support/__init__.py
M Modules/_opcode.c
M Tools/build/generate_opcode_h.py

diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 8fb4e6cfdf14c..22c1e03470f5d 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -117,6 +117,13 @@ and only logged in :ref:`Python Development Mode <devmode>` or on :ref:`Python
 built on debug mode <debug-build>`.
 (Contributed by Victor Stinner in :gh:`62948`.)
 
+opcode
+------
+
+* Move ``opcode.ENABLE_SPECIALIZATION`` to ``_opcode.ENABLE_SPECIALIZATION``.
+  This field was added in 3.12, it was never documented and is not intended for
+  external usage. (Contributed by Irit Katriel in :gh:`105481`.)
+
 pathlib
 -------
 
diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h
index bcdf8645c8557..ee1b85187cbab 100644
--- a/Include/internal/pycore_code.h
+++ b/Include/internal/pycore_code.h
@@ -229,6 +229,8 @@ extern void _PyLineTable_InitAddressRange(
 extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range);
 extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range);
 
+#define ENABLE_SPECIALIZATION 1
+
 /* Specialization functions */
 
 extern void _Py_Specialize_LoadSuperAttr(PyObject *global_super, PyObject *cls,
diff --git a/Include/opcode.h b/Include/opcode.h
index 697520937d905..eb4bb85e5b667 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -256,8 +256,6 @@ extern "C" {
 #define NB_INPLACE_TRUE_DIVIDE                  24
 #define NB_INPLACE_XOR                          25
 
-/* Defined in Lib/opcode.py */
-#define ENABLE_SPECIALIZATION 1
 
 #ifdef __cplusplus
 }
diff --git a/Lib/opcode.py b/Lib/opcode.py
index bed922399821a..51432ab1fab3f 100644
--- a/Lib/opcode.py
+++ b/Lib/opcode.py
@@ -19,9 +19,6 @@
 
 cmp_op = ('<', '<=', '==', '!=', '>', '>=')
 
-
-ENABLE_SPECIALIZATION = True
-
 def is_pseudo(op):
     return op >= MIN_PSEUDO_OPCODE and op <= MAX_PSEUDO_OPCODE
 
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index 3b332f49951f0..2a59911e54d6b 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -6,7 +6,7 @@
 import contextlib
 import functools
 import getpass
-import opcode
+import _opcode
 import os
 import re
 import stat
@@ -1092,7 +1092,7 @@ def requires_limited_api(test):
 
 def requires_specialization(test):
     return unittest.skipUnless(
-        opcode.ENABLE_SPECIALIZATION, "requires specialization")(test)
+        _opcode.ENABLE_SPECIALIZATION, "requires specialization")(test)
 
 def _filter_suite(suite, pred):
     """Recursively filter test cases in a suite based on a predicate."""
diff --git a/Misc/NEWS.d/next/Library/2023-08-01-15-17-20.gh-issue-105481.vMbmj_.rst b/Misc/NEWS.d/next/Library/2023-08-01-15-17-20.gh-issue-105481.vMbmj_.rst
new file mode 100644
index 0000000000000..153c18a6f0095
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-08-01-15-17-20.gh-issue-105481.vMbmj_.rst
@@ -0,0 +1 @@
+:data:`opcode.ENABLE_SPECIALIZATION` (which was added in 3.12 but never documented or intended for external usage) is moved to :data:`_opcode.ENABLE_SPECIALIZATION` where tests can access it.
diff --git a/Modules/_opcode.c b/Modules/_opcode.c
index b8d95a048ec2c..ad0fa736f8276 100644
--- a/Modules/_opcode.c
+++ b/Modules/_opcode.c
@@ -292,7 +292,16 @@ opcode_functions[] =  {
     {NULL, NULL, 0, NULL}
 };
 
+int
+_opcode_exec(PyObject *m) {
+    if (PyModule_AddIntMacro(m, ENABLE_SPECIALIZATION) < 0) {
+        return -1;
+    }
+    return 0;
+}
+
 static PyModuleDef_Slot module_slots[] = {
+    {Py_mod_exec, _opcode_exec},
     {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
     {0, NULL}
 };
diff --git a/Tools/build/generate_opcode_h.py b/Tools/build/generate_opcode_h.py
index 19e5eab822a23..2259dad77869f 100644
--- a/Tools/build/generate_opcode_h.py
+++ b/Tools/build/generate_opcode_h.py
@@ -73,7 +73,6 @@ def main(opcode_py,
     opname = opcode['opname']
     is_pseudo = opcode['is_pseudo']
 
-    ENABLE_SPECIALIZATION = opcode["ENABLE_SPECIALIZATION"]
     MIN_PSEUDO_OPCODE = opcode["MIN_PSEUDO_OPCODE"]
     MAX_PSEUDO_OPCODE = opcode["MAX_PSEUDO_OPCODE"]
     MIN_INSTRUMENTED_OPCODE = opcode["MIN_INSTRUMENTED_OPCODE"]
@@ -141,10 +140,6 @@ def main(opcode_py,
         for i, (op, _) in enumerate(opcode["_nb_ops"]):
             fobj.write(DEFINE.format(op, i))
 
-        fobj.write("\n")
-        fobj.write("/* Defined in Lib/opcode.py */\n")
-        fobj.write(f"#define ENABLE_SPECIALIZATION {int(ENABLE_SPECIALIZATION)}")
-
         iobj.write("\n")
         iobj.write(f"\nextern const char *const _PyOpcode_OpName[{NUM_OPCODES}];\n")
         iobj.write("\n#ifdef NEED_OPCODE_TABLES\n")



More information about the Python-checkins mailing list