summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/_opcode_metadata.py94
-rw-r--r--Lib/importlib/_bootstrap_external.py3
-rw-r--r--Lib/opcode.py96
3 files changed, 102 insertions, 91 deletions
diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py
new file mode 100644
index 0000000..92ed403
--- /dev/null
+++ b/Lib/_opcode_metadata.py
@@ -0,0 +1,94 @@
+# This file is generated by Tools/cases_generator/generate_cases.py
+# from:
+# Python/bytecodes.c
+# Do not edit!
+
+_specializations = {
+ "BINARY_OP": [
+ "BINARY_OP_MULTIPLY_INT",
+ "BINARY_OP_ADD_INT",
+ "BINARY_OP_SUBTRACT_INT",
+ "BINARY_OP_MULTIPLY_FLOAT",
+ "BINARY_OP_ADD_FLOAT",
+ "BINARY_OP_SUBTRACT_FLOAT",
+ "BINARY_OP_ADD_UNICODE",
+ ],
+ "BINARY_SUBSCR": [
+ "BINARY_SUBSCR_DICT",
+ "BINARY_SUBSCR_GETITEM",
+ "BINARY_SUBSCR_LIST_INT",
+ "BINARY_SUBSCR_TUPLE_INT",
+ ],
+ "STORE_SUBSCR": [
+ "STORE_SUBSCR_DICT",
+ "STORE_SUBSCR_LIST_INT",
+ ],
+ "SEND": [
+ "SEND_GEN",
+ ],
+ "UNPACK_SEQUENCE": [
+ "UNPACK_SEQUENCE_TWO_TUPLE",
+ "UNPACK_SEQUENCE_TUPLE",
+ "UNPACK_SEQUENCE_LIST",
+ ],
+ "STORE_ATTR": [
+ "STORE_ATTR_INSTANCE_VALUE",
+ "STORE_ATTR_SLOT",
+ "STORE_ATTR_WITH_HINT",
+ ],
+ "LOAD_GLOBAL": [
+ "LOAD_GLOBAL_MODULE",
+ "LOAD_GLOBAL_BUILTIN",
+ ],
+ "LOAD_SUPER_ATTR": [
+ "LOAD_SUPER_ATTR_ATTR",
+ "LOAD_SUPER_ATTR_METHOD",
+ ],
+ "LOAD_ATTR": [
+ "LOAD_ATTR_INSTANCE_VALUE",
+ "LOAD_ATTR_MODULE",
+ "LOAD_ATTR_WITH_HINT",
+ "LOAD_ATTR_SLOT",
+ "LOAD_ATTR_CLASS",
+ "LOAD_ATTR_PROPERTY",
+ "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
+ "LOAD_ATTR_METHOD_WITH_VALUES",
+ "LOAD_ATTR_METHOD_NO_DICT",
+ "LOAD_ATTR_METHOD_LAZY_DICT",
+ ],
+ "COMPARE_OP": [
+ "COMPARE_OP_FLOAT",
+ "COMPARE_OP_INT",
+ "COMPARE_OP_STR",
+ ],
+ "FOR_ITER": [
+ "FOR_ITER_LIST",
+ "FOR_ITER_TUPLE",
+ "FOR_ITER_RANGE",
+ "FOR_ITER_GEN",
+ ],
+ "CALL": [
+ "CALL_BOUND_METHOD_EXACT_ARGS",
+ "CALL_PY_EXACT_ARGS",
+ "CALL_PY_WITH_DEFAULTS",
+ "CALL_NO_KW_TYPE_1",
+ "CALL_NO_KW_STR_1",
+ "CALL_NO_KW_TUPLE_1",
+ "CALL_BUILTIN_CLASS",
+ "CALL_NO_KW_BUILTIN_O",
+ "CALL_NO_KW_BUILTIN_FAST",
+ "CALL_BUILTIN_FAST_WITH_KEYWORDS",
+ "CALL_NO_KW_LEN",
+ "CALL_NO_KW_ISINSTANCE",
+ "CALL_NO_KW_LIST_APPEND",
+ "CALL_NO_KW_METHOD_DESCRIPTOR_O",
+ "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
+ "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS",
+ "CALL_NO_KW_METHOD_DESCRIPTOR_FAST",
+ ],
+}
+
+# An irregular case:
+_specializations["BINARY_OP"].append("BINARY_OP_INPLACE_ADD_UNICODE")
+
+_specialized_instructions = [opcode for family in _specializations.values() for opcode in family]
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
index cf68c44..6a3eabe 100644
--- a/Lib/importlib/_bootstrap_external.py
+++ b/Lib/importlib/_bootstrap_external.py
@@ -450,6 +450,7 @@ _code_type = type(_write_atomic.__code__)
# Python 3.13a1 3552 (Remove LOAD_FAST__LOAD_CONST and LOAD_CONST__LOAD_FAST)
# Python 3.13a1 3553 (Add SET_FUNCTION_ATTRIBUTE)
# Python 3.13a1 3554 (more efficient bytecodes for f-strings)
+# Python 3.13a1 3555 (generate specialized opcodes metadata from bytecodes.c)
# Python 3.14 will start with 3600
@@ -466,7 +467,7 @@ _code_type = type(_write_atomic.__code__)
# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array
# in PC/launcher.c must also be updated.
-MAGIC_NUMBER = (3554).to_bytes(2, 'little') + b'\r\n'
+MAGIC_NUMBER = (3555).to_bytes(2, 'little') + b'\r\n'
_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c
diff --git a/Lib/opcode.py b/Lib/opcode.py
index 71a8afa..ed01d2c 100644
--- a/Lib/opcode.py
+++ b/Lib/opcode.py
@@ -21,6 +21,12 @@ try:
except ImportError:
pass
+# _opcode_metadata may not be ready during early stages of the build
+try:
+ from _opcode_metadata import _specializations, _specialized_instructions
+except ModuleNotFoundError:
+ pass
+
cmp_op = ('<', '<=', '==', '!=', '>', '>=')
hasarg = []
@@ -348,96 +354,6 @@ _intrinsic_2_descs = [
"INTRINSIC_SET_FUNCTION_TYPE_PARAMS",
]
-_specializations = {
- "BINARY_OP": [
- "BINARY_OP_ADD_FLOAT",
- "BINARY_OP_ADD_INT",
- "BINARY_OP_ADD_UNICODE",
- "BINARY_OP_INPLACE_ADD_UNICODE",
- "BINARY_OP_MULTIPLY_FLOAT",
- "BINARY_OP_MULTIPLY_INT",
- "BINARY_OP_SUBTRACT_FLOAT",
- "BINARY_OP_SUBTRACT_INT",
- ],
- "BINARY_SUBSCR": [
- "BINARY_SUBSCR_DICT",
- "BINARY_SUBSCR_GETITEM",
- "BINARY_SUBSCR_LIST_INT",
- "BINARY_SUBSCR_TUPLE_INT",
- ],
- "CALL": [
- "CALL_PY_EXACT_ARGS",
- "CALL_PY_WITH_DEFAULTS",
- "CALL_BOUND_METHOD_EXACT_ARGS",
- "CALL_BUILTIN_CLASS",
- "CALL_BUILTIN_FAST_WITH_KEYWORDS",
- "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
- "CALL_NO_KW_BUILTIN_FAST",
- "CALL_NO_KW_BUILTIN_O",
- "CALL_NO_KW_ISINSTANCE",
- "CALL_NO_KW_LEN",
- "CALL_NO_KW_LIST_APPEND",
- "CALL_NO_KW_METHOD_DESCRIPTOR_FAST",
- "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS",
- "CALL_NO_KW_METHOD_DESCRIPTOR_O",
- "CALL_NO_KW_STR_1",
- "CALL_NO_KW_TUPLE_1",
- "CALL_NO_KW_TYPE_1",
- ],
- "COMPARE_OP": [
- "COMPARE_OP_FLOAT",
- "COMPARE_OP_INT",
- "COMPARE_OP_STR",
- ],
- "FOR_ITER": [
- "FOR_ITER_LIST",
- "FOR_ITER_TUPLE",
- "FOR_ITER_RANGE",
- "FOR_ITER_GEN",
- ],
- "LOAD_SUPER_ATTR": [
- "LOAD_SUPER_ATTR_ATTR",
- "LOAD_SUPER_ATTR_METHOD",
- ],
- "LOAD_ATTR": [
- # These potentially push [NULL, bound method] onto the stack.
- "LOAD_ATTR_CLASS",
- "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
- "LOAD_ATTR_INSTANCE_VALUE",
- "LOAD_ATTR_MODULE",
- "LOAD_ATTR_PROPERTY",
- "LOAD_ATTR_SLOT",
- "LOAD_ATTR_WITH_HINT",
- # These will always push [unbound method, self] onto the stack.
- "LOAD_ATTR_METHOD_LAZY_DICT",
- "LOAD_ATTR_METHOD_NO_DICT",
- "LOAD_ATTR_METHOD_WITH_VALUES",
- ],
- "LOAD_GLOBAL": [
- "LOAD_GLOBAL_BUILTIN",
- "LOAD_GLOBAL_MODULE",
- ],
- "STORE_ATTR": [
- "STORE_ATTR_INSTANCE_VALUE",
- "STORE_ATTR_SLOT",
- "STORE_ATTR_WITH_HINT",
- ],
- "STORE_SUBSCR": [
- "STORE_SUBSCR_DICT",
- "STORE_SUBSCR_LIST_INT",
- ],
- "UNPACK_SEQUENCE": [
- "UNPACK_SEQUENCE_LIST",
- "UNPACK_SEQUENCE_TUPLE",
- "UNPACK_SEQUENCE_TWO_TUPLE",
- ],
- "SEND": [
- "SEND_GEN",
- ],
-}
-_specialized_instructions = [
- opcode for family in _specializations.values() for opcode in family
-]
_cache_format = {
"LOAD_GLOBAL": {