https://github.com/python/cpython/commit/c8aa8de9a5ad4df58ac0ffeae897e1258728b7eb
commit: c8aa8de9a5ad4df58ac0ffeae897e1258728b7eb
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-03-05T12:33:13+01:00
summary:

gh-141510: Use frozendict in the _opcode_metadata (#144910)

Enhance py_metadata_generator.py to skip duplicates.

Co-authored-by: Donghee Na <[email protected]>

files:
M Lib/_opcode_metadata.py
M Tools/cases_generator/py_metadata_generator.py

diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py
index 8f14d81a43ee75..6e37288c32dd9a 100644
--- a/Lib/_opcode_metadata.py
+++ b/Lib/_opcode_metadata.py
@@ -2,375 +2,373 @@
 # from:
 #   Python/bytecodes.c
 # Do not edit!
-_specializations = {
-    "RESUME": [
-        "RESUME_CHECK",
-    ],
-    "TO_BOOL": [
-        "TO_BOOL_ALWAYS_TRUE",
-        "TO_BOOL_BOOL",
-        "TO_BOOL_INT",
-        "TO_BOOL_LIST",
-        "TO_BOOL_NONE",
-        "TO_BOOL_STR",
-    ],
-    "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_OP_SUBSCR_LIST_INT",
-        "BINARY_OP_SUBSCR_LIST_SLICE",
-        "BINARY_OP_SUBSCR_TUPLE_INT",
-        "BINARY_OP_SUBSCR_STR_INT",
-        "BINARY_OP_SUBSCR_USTR_INT",
-        "BINARY_OP_SUBSCR_DICT",
-        "BINARY_OP_SUBSCR_GETITEM",
-        "BINARY_OP_INPLACE_ADD_UNICODE",
-        "BINARY_OP_EXTEND",
-        "BINARY_OP_INPLACE_ADD_UNICODE",
-    ],
-    "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_CLASS_WITH_METACLASS_CHECK",
-        "LOAD_ATTR_PROPERTY",
-        "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
-        "LOAD_ATTR_METHOD_WITH_VALUES",
-        "LOAD_ATTR_METHOD_NO_DICT",
-        "LOAD_ATTR_METHOD_LAZY_DICT",
-        "LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES",
-        "LOAD_ATTR_NONDESCRIPTOR_NO_DICT",
-    ],
-    "COMPARE_OP": [
-        "COMPARE_OP_FLOAT",
-        "COMPARE_OP_INT",
-        "COMPARE_OP_STR",
-    ],
-    "CONTAINS_OP": [
-        "CONTAINS_OP_SET",
-        "CONTAINS_OP_DICT",
-    ],
-    "JUMP_BACKWARD": [
-        "JUMP_BACKWARD_NO_JIT",
-        "JUMP_BACKWARD_JIT",
-    ],
-    "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_TYPE_1",
-        "CALL_STR_1",
-        "CALL_TUPLE_1",
-        "CALL_BUILTIN_CLASS",
-        "CALL_BUILTIN_O",
-        "CALL_BUILTIN_FAST",
-        "CALL_BUILTIN_FAST_WITH_KEYWORDS",
-        "CALL_LEN",
-        "CALL_ISINSTANCE",
-        "CALL_LIST_APPEND",
-        "CALL_METHOD_DESCRIPTOR_O",
-        "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
-        "CALL_METHOD_DESCRIPTOR_NOARGS",
-        "CALL_METHOD_DESCRIPTOR_FAST",
-        "CALL_ALLOC_AND_ENTER_INIT",
-        "CALL_PY_GENERAL",
-        "CALL_BOUND_METHOD_GENERAL",
-        "CALL_NON_PY_GENERAL",
-    ],
-    "CALL_KW": [
-        "CALL_KW_BOUND_METHOD",
-        "CALL_KW_PY",
-        "CALL_KW_NON_PY",
-    ],
-    "CALL_FUNCTION_EX": [
-        "CALL_EX_PY",
-        "CALL_EX_NON_PY_GENERAL",
-    ],
-}
+_specializations = frozendict(
+    RESUME=(
+            "RESUME_CHECK",
+    ),
+    TO_BOOL=(
+            "TO_BOOL_ALWAYS_TRUE",
+            "TO_BOOL_BOOL",
+            "TO_BOOL_INT",
+            "TO_BOOL_LIST",
+            "TO_BOOL_NONE",
+            "TO_BOOL_STR",
+    ),
+    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_OP_SUBSCR_LIST_INT",
+            "BINARY_OP_SUBSCR_LIST_SLICE",
+            "BINARY_OP_SUBSCR_TUPLE_INT",
+            "BINARY_OP_SUBSCR_STR_INT",
+            "BINARY_OP_SUBSCR_USTR_INT",
+            "BINARY_OP_SUBSCR_DICT",
+            "BINARY_OP_SUBSCR_GETITEM",
+            "BINARY_OP_INPLACE_ADD_UNICODE",
+            "BINARY_OP_EXTEND",
+    ),
+    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_CLASS_WITH_METACLASS_CHECK",
+            "LOAD_ATTR_PROPERTY",
+            "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
+            "LOAD_ATTR_METHOD_WITH_VALUES",
+            "LOAD_ATTR_METHOD_NO_DICT",
+            "LOAD_ATTR_METHOD_LAZY_DICT",
+            "LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES",
+            "LOAD_ATTR_NONDESCRIPTOR_NO_DICT",
+    ),
+    COMPARE_OP=(
+            "COMPARE_OP_FLOAT",
+            "COMPARE_OP_INT",
+            "COMPARE_OP_STR",
+    ),
+    CONTAINS_OP=(
+            "CONTAINS_OP_SET",
+            "CONTAINS_OP_DICT",
+    ),
+    JUMP_BACKWARD=(
+            "JUMP_BACKWARD_NO_JIT",
+            "JUMP_BACKWARD_JIT",
+    ),
+    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_TYPE_1",
+            "CALL_STR_1",
+            "CALL_TUPLE_1",
+            "CALL_BUILTIN_CLASS",
+            "CALL_BUILTIN_O",
+            "CALL_BUILTIN_FAST",
+            "CALL_BUILTIN_FAST_WITH_KEYWORDS",
+            "CALL_LEN",
+            "CALL_ISINSTANCE",
+            "CALL_LIST_APPEND",
+            "CALL_METHOD_DESCRIPTOR_O",
+            "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
+            "CALL_METHOD_DESCRIPTOR_NOARGS",
+            "CALL_METHOD_DESCRIPTOR_FAST",
+            "CALL_ALLOC_AND_ENTER_INIT",
+            "CALL_PY_GENERAL",
+            "CALL_BOUND_METHOD_GENERAL",
+            "CALL_NON_PY_GENERAL",
+    ),
+    CALL_KW=(
+            "CALL_KW_BOUND_METHOD",
+            "CALL_KW_PY",
+            "CALL_KW_NON_PY",
+    ),
+    CALL_FUNCTION_EX=(
+            "CALL_EX_PY",
+            "CALL_EX_NON_PY_GENERAL",
+    ),
+)
 
-_specialized_opmap = {
-    'BINARY_OP_ADD_FLOAT': 129,
-    'BINARY_OP_ADD_INT': 130,
-    'BINARY_OP_ADD_UNICODE': 131,
-    'BINARY_OP_EXTEND': 132,
-    'BINARY_OP_INPLACE_ADD_UNICODE': 3,
-    'BINARY_OP_INPLACE_ADD_UNICODE': 3,
-    'BINARY_OP_MULTIPLY_FLOAT': 133,
-    'BINARY_OP_MULTIPLY_INT': 134,
-    'BINARY_OP_SUBSCR_DICT': 135,
-    'BINARY_OP_SUBSCR_GETITEM': 136,
-    'BINARY_OP_SUBSCR_LIST_INT': 137,
-    'BINARY_OP_SUBSCR_LIST_SLICE': 138,
-    'BINARY_OP_SUBSCR_STR_INT': 139,
-    'BINARY_OP_SUBSCR_TUPLE_INT': 140,
-    'BINARY_OP_SUBSCR_USTR_INT': 141,
-    'BINARY_OP_SUBTRACT_FLOAT': 142,
-    'BINARY_OP_SUBTRACT_INT': 143,
-    'CALL_ALLOC_AND_ENTER_INIT': 144,
-    'CALL_BOUND_METHOD_EXACT_ARGS': 145,
-    'CALL_BOUND_METHOD_GENERAL': 146,
-    'CALL_BUILTIN_CLASS': 147,
-    'CALL_BUILTIN_FAST': 148,
-    'CALL_BUILTIN_FAST_WITH_KEYWORDS': 149,
-    'CALL_BUILTIN_O': 150,
-    'CALL_EX_NON_PY_GENERAL': 151,
-    'CALL_EX_PY': 152,
-    'CALL_ISINSTANCE': 153,
-    'CALL_KW_BOUND_METHOD': 154,
-    'CALL_KW_NON_PY': 155,
-    'CALL_KW_PY': 156,
-    'CALL_LEN': 157,
-    'CALL_LIST_APPEND': 158,
-    'CALL_METHOD_DESCRIPTOR_FAST': 159,
-    'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 160,
-    'CALL_METHOD_DESCRIPTOR_NOARGS': 161,
-    'CALL_METHOD_DESCRIPTOR_O': 162,
-    'CALL_NON_PY_GENERAL': 163,
-    'CALL_PY_EXACT_ARGS': 164,
-    'CALL_PY_GENERAL': 165,
-    'CALL_STR_1': 166,
-    'CALL_TUPLE_1': 167,
-    'CALL_TYPE_1': 168,
-    'COMPARE_OP_FLOAT': 169,
-    'COMPARE_OP_INT': 170,
-    'COMPARE_OP_STR': 171,
-    'CONTAINS_OP_DICT': 172,
-    'CONTAINS_OP_SET': 173,
-    'FOR_ITER_GEN': 174,
-    'FOR_ITER_LIST': 175,
-    'FOR_ITER_RANGE': 176,
-    'FOR_ITER_TUPLE': 177,
-    'JUMP_BACKWARD_JIT': 178,
-    'JUMP_BACKWARD_NO_JIT': 179,
-    'LOAD_ATTR_CLASS': 180,
-    'LOAD_ATTR_CLASS_WITH_METACLASS_CHECK': 181,
-    'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 182,
-    'LOAD_ATTR_INSTANCE_VALUE': 183,
-    'LOAD_ATTR_METHOD_LAZY_DICT': 184,
-    'LOAD_ATTR_METHOD_NO_DICT': 185,
-    'LOAD_ATTR_METHOD_WITH_VALUES': 186,
-    'LOAD_ATTR_MODULE': 187,
-    'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 188,
-    'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 189,
-    'LOAD_ATTR_PROPERTY': 190,
-    'LOAD_ATTR_SLOT': 191,
-    'LOAD_ATTR_WITH_HINT': 192,
-    'LOAD_GLOBAL_BUILTIN': 193,
-    'LOAD_GLOBAL_MODULE': 194,
-    'LOAD_SUPER_ATTR_ATTR': 195,
-    'LOAD_SUPER_ATTR_METHOD': 196,
-    'RESUME_CHECK': 197,
-    'SEND_GEN': 198,
-    'STORE_ATTR_INSTANCE_VALUE': 199,
-    'STORE_ATTR_SLOT': 200,
-    'STORE_ATTR_WITH_HINT': 201,
-    'STORE_SUBSCR_DICT': 202,
-    'STORE_SUBSCR_LIST_INT': 203,
-    'TO_BOOL_ALWAYS_TRUE': 204,
-    'TO_BOOL_BOOL': 205,
-    'TO_BOOL_INT': 206,
-    'TO_BOOL_LIST': 207,
-    'TO_BOOL_NONE': 208,
-    'TO_BOOL_STR': 209,
-    'UNPACK_SEQUENCE_LIST': 210,
-    'UNPACK_SEQUENCE_TUPLE': 211,
-    'UNPACK_SEQUENCE_TWO_TUPLE': 212,
-}
+_specialized_opmap = frozendict(
+    BINARY_OP_ADD_FLOAT=129,
+    BINARY_OP_ADD_INT=130,
+    BINARY_OP_ADD_UNICODE=131,
+    BINARY_OP_EXTEND=132,
+    BINARY_OP_INPLACE_ADD_UNICODE=3,
+    BINARY_OP_MULTIPLY_FLOAT=133,
+    BINARY_OP_MULTIPLY_INT=134,
+    BINARY_OP_SUBSCR_DICT=135,
+    BINARY_OP_SUBSCR_GETITEM=136,
+    BINARY_OP_SUBSCR_LIST_INT=137,
+    BINARY_OP_SUBSCR_LIST_SLICE=138,
+    BINARY_OP_SUBSCR_STR_INT=139,
+    BINARY_OP_SUBSCR_TUPLE_INT=140,
+    BINARY_OP_SUBSCR_USTR_INT=141,
+    BINARY_OP_SUBTRACT_FLOAT=142,
+    BINARY_OP_SUBTRACT_INT=143,
+    CALL_ALLOC_AND_ENTER_INIT=144,
+    CALL_BOUND_METHOD_EXACT_ARGS=145,
+    CALL_BOUND_METHOD_GENERAL=146,
+    CALL_BUILTIN_CLASS=147,
+    CALL_BUILTIN_FAST=148,
+    CALL_BUILTIN_FAST_WITH_KEYWORDS=149,
+    CALL_BUILTIN_O=150,
+    CALL_EX_NON_PY_GENERAL=151,
+    CALL_EX_PY=152,
+    CALL_ISINSTANCE=153,
+    CALL_KW_BOUND_METHOD=154,
+    CALL_KW_NON_PY=155,
+    CALL_KW_PY=156,
+    CALL_LEN=157,
+    CALL_LIST_APPEND=158,
+    CALL_METHOD_DESCRIPTOR_FAST=159,
+    CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS=160,
+    CALL_METHOD_DESCRIPTOR_NOARGS=161,
+    CALL_METHOD_DESCRIPTOR_O=162,
+    CALL_NON_PY_GENERAL=163,
+    CALL_PY_EXACT_ARGS=164,
+    CALL_PY_GENERAL=165,
+    CALL_STR_1=166,
+    CALL_TUPLE_1=167,
+    CALL_TYPE_1=168,
+    COMPARE_OP_FLOAT=169,
+    COMPARE_OP_INT=170,
+    COMPARE_OP_STR=171,
+    CONTAINS_OP_DICT=172,
+    CONTAINS_OP_SET=173,
+    FOR_ITER_GEN=174,
+    FOR_ITER_LIST=175,
+    FOR_ITER_RANGE=176,
+    FOR_ITER_TUPLE=177,
+    JUMP_BACKWARD_JIT=178,
+    JUMP_BACKWARD_NO_JIT=179,
+    LOAD_ATTR_CLASS=180,
+    LOAD_ATTR_CLASS_WITH_METACLASS_CHECK=181,
+    LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN=182,
+    LOAD_ATTR_INSTANCE_VALUE=183,
+    LOAD_ATTR_METHOD_LAZY_DICT=184,
+    LOAD_ATTR_METHOD_NO_DICT=185,
+    LOAD_ATTR_METHOD_WITH_VALUES=186,
+    LOAD_ATTR_MODULE=187,
+    LOAD_ATTR_NONDESCRIPTOR_NO_DICT=188,
+    LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES=189,
+    LOAD_ATTR_PROPERTY=190,
+    LOAD_ATTR_SLOT=191,
+    LOAD_ATTR_WITH_HINT=192,
+    LOAD_GLOBAL_BUILTIN=193,
+    LOAD_GLOBAL_MODULE=194,
+    LOAD_SUPER_ATTR_ATTR=195,
+    LOAD_SUPER_ATTR_METHOD=196,
+    RESUME_CHECK=197,
+    SEND_GEN=198,
+    STORE_ATTR_INSTANCE_VALUE=199,
+    STORE_ATTR_SLOT=200,
+    STORE_ATTR_WITH_HINT=201,
+    STORE_SUBSCR_DICT=202,
+    STORE_SUBSCR_LIST_INT=203,
+    TO_BOOL_ALWAYS_TRUE=204,
+    TO_BOOL_BOOL=205,
+    TO_BOOL_INT=206,
+    TO_BOOL_LIST=207,
+    TO_BOOL_NONE=208,
+    TO_BOOL_STR=209,
+    UNPACK_SEQUENCE_LIST=210,
+    UNPACK_SEQUENCE_TUPLE=211,
+    UNPACK_SEQUENCE_TWO_TUPLE=212,
+)
 
-opmap = {
-    'CACHE': 0,
-    'RESERVED': 17,
-    'RESUME': 128,
-    'INSTRUMENTED_LINE': 253,
-    'ENTER_EXECUTOR': 254,
-    'TRACE_RECORD': 255,
-    'BINARY_SLICE': 1,
-    'BUILD_TEMPLATE': 2,
-    'CALL_FUNCTION_EX': 4,
-    'CHECK_EG_MATCH': 5,
-    'CHECK_EXC_MATCH': 6,
-    'CLEANUP_THROW': 7,
-    'DELETE_SUBSCR': 8,
-    'END_FOR': 9,
-    'END_SEND': 10,
-    'EXIT_INIT_CHECK': 11,
-    'FORMAT_SIMPLE': 12,
-    'FORMAT_WITH_SPEC': 13,
-    'GET_AITER': 14,
-    'GET_ANEXT': 15,
-    'GET_ITER': 16,
-    'GET_LEN': 18,
-    'GET_YIELD_FROM_ITER': 19,
-    'INTERPRETER_EXIT': 20,
-    'LOAD_BUILD_CLASS': 21,
-    'LOAD_LOCALS': 22,
-    'MAKE_FUNCTION': 23,
-    'MATCH_KEYS': 24,
-    'MATCH_MAPPING': 25,
-    'MATCH_SEQUENCE': 26,
-    'NOP': 27,
-    'NOT_TAKEN': 28,
-    'POP_EXCEPT': 29,
-    'POP_ITER': 30,
-    'POP_TOP': 31,
-    'PUSH_EXC_INFO': 32,
-    'PUSH_NULL': 33,
-    'RETURN_GENERATOR': 34,
-    'RETURN_VALUE': 35,
-    'SETUP_ANNOTATIONS': 36,
-    'STORE_SLICE': 37,
-    'STORE_SUBSCR': 38,
-    'TO_BOOL': 39,
-    'UNARY_INVERT': 40,
-    'UNARY_NEGATIVE': 41,
-    'UNARY_NOT': 42,
-    'WITH_EXCEPT_START': 43,
-    'BINARY_OP': 44,
-    'BUILD_INTERPOLATION': 45,
-    'BUILD_LIST': 46,
-    'BUILD_MAP': 47,
-    'BUILD_SET': 48,
-    'BUILD_SLICE': 49,
-    'BUILD_STRING': 50,
-    'BUILD_TUPLE': 51,
-    'CALL': 52,
-    'CALL_INTRINSIC_1': 53,
-    'CALL_INTRINSIC_2': 54,
-    'CALL_KW': 55,
-    'COMPARE_OP': 56,
-    'CONTAINS_OP': 57,
-    'CONVERT_VALUE': 58,
-    'COPY': 59,
-    'COPY_FREE_VARS': 60,
-    'DELETE_ATTR': 61,
-    'DELETE_DEREF': 62,
-    'DELETE_FAST': 63,
-    'DELETE_GLOBAL': 64,
-    'DELETE_NAME': 65,
-    'DICT_MERGE': 66,
-    'DICT_UPDATE': 67,
-    'END_ASYNC_FOR': 68,
-    'EXTENDED_ARG': 69,
-    'FOR_ITER': 70,
-    'GET_AWAITABLE': 71,
-    'IMPORT_FROM': 72,
-    'IMPORT_NAME': 73,
-    'IS_OP': 74,
-    'JUMP_BACKWARD': 75,
-    'JUMP_BACKWARD_NO_INTERRUPT': 76,
-    'JUMP_FORWARD': 77,
-    'LIST_APPEND': 78,
-    'LIST_EXTEND': 79,
-    'LOAD_ATTR': 80,
-    'LOAD_COMMON_CONSTANT': 81,
-    'LOAD_CONST': 82,
-    'LOAD_DEREF': 83,
-    'LOAD_FAST': 84,
-    'LOAD_FAST_AND_CLEAR': 85,
-    'LOAD_FAST_BORROW': 86,
-    'LOAD_FAST_BORROW_LOAD_FAST_BORROW': 87,
-    'LOAD_FAST_CHECK': 88,
-    'LOAD_FAST_LOAD_FAST': 89,
-    'LOAD_FROM_DICT_OR_DEREF': 90,
-    'LOAD_FROM_DICT_OR_GLOBALS': 91,
-    'LOAD_GLOBAL': 92,
-    'LOAD_NAME': 93,
-    'LOAD_SMALL_INT': 94,
-    'LOAD_SPECIAL': 95,
-    'LOAD_SUPER_ATTR': 96,
-    'MAKE_CELL': 97,
-    'MAP_ADD': 98,
-    'MATCH_CLASS': 99,
-    'POP_JUMP_IF_FALSE': 100,
-    'POP_JUMP_IF_NONE': 101,
-    'POP_JUMP_IF_NOT_NONE': 102,
-    'POP_JUMP_IF_TRUE': 103,
-    'RAISE_VARARGS': 104,
-    'RERAISE': 105,
-    'SEND': 106,
-    'SET_ADD': 107,
-    'SET_FUNCTION_ATTRIBUTE': 108,
-    'SET_UPDATE': 109,
-    'STORE_ATTR': 110,
-    'STORE_DEREF': 111,
-    'STORE_FAST': 112,
-    'STORE_FAST_LOAD_FAST': 113,
-    'STORE_FAST_STORE_FAST': 114,
-    'STORE_GLOBAL': 115,
-    'STORE_NAME': 116,
-    'SWAP': 117,
-    'UNPACK_EX': 118,
-    'UNPACK_SEQUENCE': 119,
-    'YIELD_VALUE': 120,
-    'INSTRUMENTED_END_FOR': 233,
-    'INSTRUMENTED_POP_ITER': 234,
-    'INSTRUMENTED_END_SEND': 235,
-    'INSTRUMENTED_FOR_ITER': 236,
-    'INSTRUMENTED_INSTRUCTION': 237,
-    'INSTRUMENTED_JUMP_FORWARD': 238,
-    'INSTRUMENTED_NOT_TAKEN': 239,
-    'INSTRUMENTED_POP_JUMP_IF_TRUE': 240,
-    'INSTRUMENTED_POP_JUMP_IF_FALSE': 241,
-    'INSTRUMENTED_POP_JUMP_IF_NONE': 242,
-    'INSTRUMENTED_POP_JUMP_IF_NOT_NONE': 243,
-    'INSTRUMENTED_RESUME': 244,
-    'INSTRUMENTED_RETURN_VALUE': 245,
-    'INSTRUMENTED_YIELD_VALUE': 246,
-    'INSTRUMENTED_END_ASYNC_FOR': 247,
-    'INSTRUMENTED_LOAD_SUPER_ATTR': 248,
-    'INSTRUMENTED_CALL': 249,
-    'INSTRUMENTED_CALL_KW': 250,
-    'INSTRUMENTED_CALL_FUNCTION_EX': 251,
-    'INSTRUMENTED_JUMP_BACKWARD': 252,
-    'ANNOTATIONS_PLACEHOLDER': 256,
-    'JUMP': 257,
-    'JUMP_IF_FALSE': 258,
-    'JUMP_IF_TRUE': 259,
-    'JUMP_NO_INTERRUPT': 260,
-    'LOAD_CLOSURE': 261,
-    'POP_BLOCK': 262,
-    'SETUP_CLEANUP': 263,
-    'SETUP_FINALLY': 264,
-    'SETUP_WITH': 265,
-    'STORE_FAST_MAYBE_NULL': 266,
-}
+opmap = frozendict(
+    CACHE=0,
+    RESERVED=17,
+    RESUME=128,
+    INSTRUMENTED_LINE=253,
+    ENTER_EXECUTOR=254,
+    TRACE_RECORD=255,
+    BINARY_SLICE=1,
+    BUILD_TEMPLATE=2,
+    CALL_FUNCTION_EX=4,
+    CHECK_EG_MATCH=5,
+    CHECK_EXC_MATCH=6,
+    CLEANUP_THROW=7,
+    DELETE_SUBSCR=8,
+    END_FOR=9,
+    END_SEND=10,
+    EXIT_INIT_CHECK=11,
+    FORMAT_SIMPLE=12,
+    FORMAT_WITH_SPEC=13,
+    GET_AITER=14,
+    GET_ANEXT=15,
+    GET_ITER=16,
+    GET_LEN=18,
+    GET_YIELD_FROM_ITER=19,
+    INTERPRETER_EXIT=20,
+    LOAD_BUILD_CLASS=21,
+    LOAD_LOCALS=22,
+    MAKE_FUNCTION=23,
+    MATCH_KEYS=24,
+    MATCH_MAPPING=25,
+    MATCH_SEQUENCE=26,
+    NOP=27,
+    NOT_TAKEN=28,
+    POP_EXCEPT=29,
+    POP_ITER=30,
+    POP_TOP=31,
+    PUSH_EXC_INFO=32,
+    PUSH_NULL=33,
+    RETURN_GENERATOR=34,
+    RETURN_VALUE=35,
+    SETUP_ANNOTATIONS=36,
+    STORE_SLICE=37,
+    STORE_SUBSCR=38,
+    TO_BOOL=39,
+    UNARY_INVERT=40,
+    UNARY_NEGATIVE=41,
+    UNARY_NOT=42,
+    WITH_EXCEPT_START=43,
+    BINARY_OP=44,
+    BUILD_INTERPOLATION=45,
+    BUILD_LIST=46,
+    BUILD_MAP=47,
+    BUILD_SET=48,
+    BUILD_SLICE=49,
+    BUILD_STRING=50,
+    BUILD_TUPLE=51,
+    CALL=52,
+    CALL_INTRINSIC_1=53,
+    CALL_INTRINSIC_2=54,
+    CALL_KW=55,
+    COMPARE_OP=56,
+    CONTAINS_OP=57,
+    CONVERT_VALUE=58,
+    COPY=59,
+    COPY_FREE_VARS=60,
+    DELETE_ATTR=61,
+    DELETE_DEREF=62,
+    DELETE_FAST=63,
+    DELETE_GLOBAL=64,
+    DELETE_NAME=65,
+    DICT_MERGE=66,
+    DICT_UPDATE=67,
+    END_ASYNC_FOR=68,
+    EXTENDED_ARG=69,
+    FOR_ITER=70,
+    GET_AWAITABLE=71,
+    IMPORT_FROM=72,
+    IMPORT_NAME=73,
+    IS_OP=74,
+    JUMP_BACKWARD=75,
+    JUMP_BACKWARD_NO_INTERRUPT=76,
+    JUMP_FORWARD=77,
+    LIST_APPEND=78,
+    LIST_EXTEND=79,
+    LOAD_ATTR=80,
+    LOAD_COMMON_CONSTANT=81,
+    LOAD_CONST=82,
+    LOAD_DEREF=83,
+    LOAD_FAST=84,
+    LOAD_FAST_AND_CLEAR=85,
+    LOAD_FAST_BORROW=86,
+    LOAD_FAST_BORROW_LOAD_FAST_BORROW=87,
+    LOAD_FAST_CHECK=88,
+    LOAD_FAST_LOAD_FAST=89,
+    LOAD_FROM_DICT_OR_DEREF=90,
+    LOAD_FROM_DICT_OR_GLOBALS=91,
+    LOAD_GLOBAL=92,
+    LOAD_NAME=93,
+    LOAD_SMALL_INT=94,
+    LOAD_SPECIAL=95,
+    LOAD_SUPER_ATTR=96,
+    MAKE_CELL=97,
+    MAP_ADD=98,
+    MATCH_CLASS=99,
+    POP_JUMP_IF_FALSE=100,
+    POP_JUMP_IF_NONE=101,
+    POP_JUMP_IF_NOT_NONE=102,
+    POP_JUMP_IF_TRUE=103,
+    RAISE_VARARGS=104,
+    RERAISE=105,
+    SEND=106,
+    SET_ADD=107,
+    SET_FUNCTION_ATTRIBUTE=108,
+    SET_UPDATE=109,
+    STORE_ATTR=110,
+    STORE_DEREF=111,
+    STORE_FAST=112,
+    STORE_FAST_LOAD_FAST=113,
+    STORE_FAST_STORE_FAST=114,
+    STORE_GLOBAL=115,
+    STORE_NAME=116,
+    SWAP=117,
+    UNPACK_EX=118,
+    UNPACK_SEQUENCE=119,
+    YIELD_VALUE=120,
+    INSTRUMENTED_END_FOR=233,
+    INSTRUMENTED_POP_ITER=234,
+    INSTRUMENTED_END_SEND=235,
+    INSTRUMENTED_FOR_ITER=236,
+    INSTRUMENTED_INSTRUCTION=237,
+    INSTRUMENTED_JUMP_FORWARD=238,
+    INSTRUMENTED_NOT_TAKEN=239,
+    INSTRUMENTED_POP_JUMP_IF_TRUE=240,
+    INSTRUMENTED_POP_JUMP_IF_FALSE=241,
+    INSTRUMENTED_POP_JUMP_IF_NONE=242,
+    INSTRUMENTED_POP_JUMP_IF_NOT_NONE=243,
+    INSTRUMENTED_RESUME=244,
+    INSTRUMENTED_RETURN_VALUE=245,
+    INSTRUMENTED_YIELD_VALUE=246,
+    INSTRUMENTED_END_ASYNC_FOR=247,
+    INSTRUMENTED_LOAD_SUPER_ATTR=248,
+    INSTRUMENTED_CALL=249,
+    INSTRUMENTED_CALL_KW=250,
+    INSTRUMENTED_CALL_FUNCTION_EX=251,
+    INSTRUMENTED_JUMP_BACKWARD=252,
+    ANNOTATIONS_PLACEHOLDER=256,
+    JUMP=257,
+    JUMP_IF_FALSE=258,
+    JUMP_IF_TRUE=259,
+    JUMP_NO_INTERRUPT=260,
+    LOAD_CLOSURE=261,
+    POP_BLOCK=262,
+    SETUP_CLEANUP=263,
+    SETUP_FINALLY=264,
+    SETUP_WITH=265,
+    STORE_FAST_MAYBE_NULL=266,
+)
 
 HAVE_ARGUMENT = 43
 MIN_INSTRUMENTED_OPCODE = 233
diff --git a/Tools/cases_generator/py_metadata_generator.py 
b/Tools/cases_generator/py_metadata_generator.py
index 3ec06faf338488..6df72de44e78cb 100644
--- a/Tools/cases_generator/py_metadata_generator.py
+++ b/Tools/cases_generator/py_metadata_generator.py
@@ -30,35 +30,43 @@ def get_specialized(analysis: Analysis) -> set[str]:
 
 
 def generate_specializations(analysis: Analysis, out: CWriter) -> None:
-    out.emit("_specializations = {\n")
+    out.emit("_specializations = frozendict(\n")
     for family in analysis.families.values():
-        out.emit(f'"{family.name}": [\n')
+        out.emit(f'{family.name}=(\n')
+        seen = set()
         for member in family.members:
+            if member.name in seen:
+                continue
+            seen.add(member.name)
             out.emit(f'    "{member.name}",\n')
-        out.emit("],\n")
-    out.emit("}\n\n")
+        out.emit("),\n")
+    out.emit(")\n\n")
 
 
 def generate_specialized_opmap(analysis: Analysis, out: CWriter) -> None:
-    out.emit("_specialized_opmap = {\n")
+    out.emit("_specialized_opmap = frozendict(\n")
     names = []
+    seen = set()
     for family in analysis.families.values():
         for member in family.members:
             if member.name == family.name:
                 continue
+            if member.name in seen:
+                continue
+            seen.add(member.name)
             names.append(member.name)
     for name in sorted(names):
-        out.emit(f"'{name}': {analysis.opmap[name]},\n")
-    out.emit("}\n\n")
+        out.emit(f"{name}={analysis.opmap[name]},\n")
+    out.emit(")\n\n")
 
 
 def generate_opmap(analysis: Analysis, out: CWriter) -> None:
     specialized = get_specialized(analysis)
-    out.emit("opmap = {\n")
+    out.emit("opmap = frozendict(\n")
     for inst, op in analysis.opmap.items():
         if inst not in specialized:
-            out.emit(f"'{inst}': {analysis.opmap[inst]},\n")
-    out.emit("}\n\n")
+            out.emit(f"{inst}={analysis.opmap[inst]},\n")
+    out.emit(")\n\n")
 
 
 def generate_py_metadata(

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to