17db96d56Sopenharmony_ci
27db96d56Sopenharmony_ci"""
37db96d56Sopenharmony_ciopcode module - potentially shared between dis and other modules which
47db96d56Sopenharmony_cioperate on bytecodes (e.g. peephole optimizers).
57db96d56Sopenharmony_ci"""
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci__all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs",
87db96d56Sopenharmony_ci           "haslocal", "hascompare", "hasfree", "opname", "opmap",
97db96d56Sopenharmony_ci           "HAVE_ARGUMENT", "EXTENDED_ARG", "hasnargs"]
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci# It's a chicken-and-egg I'm afraid:
127db96d56Sopenharmony_ci# We're imported before _opcode's made.
137db96d56Sopenharmony_ci# With exception unheeded
147db96d56Sopenharmony_ci# (stack_effect is not needed)
157db96d56Sopenharmony_ci# Both our chickens and eggs are allayed.
167db96d56Sopenharmony_ci#     --Larry Hastings, 2013/11/23
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_citry:
197db96d56Sopenharmony_ci    from _opcode import stack_effect
207db96d56Sopenharmony_ci    __all__.append('stack_effect')
217db96d56Sopenharmony_ciexcept ImportError:
227db96d56Sopenharmony_ci    pass
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_cicmp_op = ('<', '<=', '==', '!=', '>', '>=')
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_cihasconst = []
277db96d56Sopenharmony_cihasname = []
287db96d56Sopenharmony_cihasjrel = []
297db96d56Sopenharmony_cihasjabs = []
307db96d56Sopenharmony_cihaslocal = []
317db96d56Sopenharmony_cihascompare = []
327db96d56Sopenharmony_cihasfree = []
337db96d56Sopenharmony_cihasnargs = [] # unused
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ciopmap = {}
367db96d56Sopenharmony_ciopname = ['<%r>' % (op,) for op in range(256)]
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_cidef def_op(name, op):
397db96d56Sopenharmony_ci    opname[op] = name
407db96d56Sopenharmony_ci    opmap[name] = op
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_cidef name_op(name, op):
437db96d56Sopenharmony_ci    def_op(name, op)
447db96d56Sopenharmony_ci    hasname.append(op)
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_cidef jrel_op(name, op):
477db96d56Sopenharmony_ci    def_op(name, op)
487db96d56Sopenharmony_ci    hasjrel.append(op)
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_cidef jabs_op(name, op):
517db96d56Sopenharmony_ci    def_op(name, op)
527db96d56Sopenharmony_ci    hasjabs.append(op)
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci# Instruction opcodes for compiled code
557db96d56Sopenharmony_ci# Blank lines correspond to available opcodes
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_cidef_op('CACHE', 0)
587db96d56Sopenharmony_cidef_op('POP_TOP', 1)
597db96d56Sopenharmony_cidef_op('PUSH_NULL', 2)
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_cidef_op('NOP', 9)
627db96d56Sopenharmony_cidef_op('UNARY_POSITIVE', 10)
637db96d56Sopenharmony_cidef_op('UNARY_NEGATIVE', 11)
647db96d56Sopenharmony_cidef_op('UNARY_NOT', 12)
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_cidef_op('UNARY_INVERT', 15)
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_cidef_op('BINARY_SUBSCR', 25)
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_cidef_op('GET_LEN', 30)
717db96d56Sopenharmony_cidef_op('MATCH_MAPPING', 31)
727db96d56Sopenharmony_cidef_op('MATCH_SEQUENCE', 32)
737db96d56Sopenharmony_cidef_op('MATCH_KEYS', 33)
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_cidef_op('PUSH_EXC_INFO', 35)
767db96d56Sopenharmony_cidef_op('CHECK_EXC_MATCH', 36)
777db96d56Sopenharmony_cidef_op('CHECK_EG_MATCH', 37)
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_cidef_op('WITH_EXCEPT_START', 49)
807db96d56Sopenharmony_cidef_op('GET_AITER', 50)
817db96d56Sopenharmony_cidef_op('GET_ANEXT', 51)
827db96d56Sopenharmony_cidef_op('BEFORE_ASYNC_WITH', 52)
837db96d56Sopenharmony_cidef_op('BEFORE_WITH', 53)
847db96d56Sopenharmony_cidef_op('END_ASYNC_FOR', 54)
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_cidef_op('STORE_SUBSCR', 60)
877db96d56Sopenharmony_cidef_op('DELETE_SUBSCR', 61)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_cidef_op('GET_ITER', 68)
907db96d56Sopenharmony_cidef_op('GET_YIELD_FROM_ITER', 69)
917db96d56Sopenharmony_cidef_op('PRINT_EXPR', 70)
927db96d56Sopenharmony_cidef_op('LOAD_BUILD_CLASS', 71)
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_cidef_op('LOAD_ASSERTION_ERROR', 74)
957db96d56Sopenharmony_cidef_op('RETURN_GENERATOR', 75)
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_cidef_op('LIST_TO_TUPLE', 82)
987db96d56Sopenharmony_cidef_op('RETURN_VALUE', 83)
997db96d56Sopenharmony_cidef_op('IMPORT_STAR', 84)
1007db96d56Sopenharmony_cidef_op('SETUP_ANNOTATIONS', 85)
1017db96d56Sopenharmony_cidef_op('YIELD_VALUE', 86)
1027db96d56Sopenharmony_cidef_op('ASYNC_GEN_WRAP', 87)
1037db96d56Sopenharmony_cidef_op('PREP_RERAISE_STAR', 88)
1047db96d56Sopenharmony_cidef_op('POP_EXCEPT', 89)
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ciHAVE_ARGUMENT = 90              # Opcodes from here have an argument:
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ciname_op('STORE_NAME', 90)       # Index in name list
1097db96d56Sopenharmony_ciname_op('DELETE_NAME', 91)      # ""
1107db96d56Sopenharmony_cidef_op('UNPACK_SEQUENCE', 92)   # Number of tuple items
1117db96d56Sopenharmony_cijrel_op('FOR_ITER', 93)
1127db96d56Sopenharmony_cidef_op('UNPACK_EX', 94)
1137db96d56Sopenharmony_ciname_op('STORE_ATTR', 95)       # Index in name list
1147db96d56Sopenharmony_ciname_op('DELETE_ATTR', 96)      # ""
1157db96d56Sopenharmony_ciname_op('STORE_GLOBAL', 97)     # ""
1167db96d56Sopenharmony_ciname_op('DELETE_GLOBAL', 98)    # ""
1177db96d56Sopenharmony_cidef_op('SWAP', 99)
1187db96d56Sopenharmony_cidef_op('LOAD_CONST', 100)       # Index in const list
1197db96d56Sopenharmony_cihasconst.append(100)
1207db96d56Sopenharmony_ciname_op('LOAD_NAME', 101)       # Index in name list
1217db96d56Sopenharmony_cidef_op('BUILD_TUPLE', 102)      # Number of tuple items
1227db96d56Sopenharmony_cidef_op('BUILD_LIST', 103)       # Number of list items
1237db96d56Sopenharmony_cidef_op('BUILD_SET', 104)        # Number of set items
1247db96d56Sopenharmony_cidef_op('BUILD_MAP', 105)        # Number of dict entries
1257db96d56Sopenharmony_ciname_op('LOAD_ATTR', 106)       # Index in name list
1267db96d56Sopenharmony_cidef_op('COMPARE_OP', 107)       # Comparison operator
1277db96d56Sopenharmony_cihascompare.append(107)
1287db96d56Sopenharmony_ciname_op('IMPORT_NAME', 108)     # Index in name list
1297db96d56Sopenharmony_ciname_op('IMPORT_FROM', 109)     # Index in name list
1307db96d56Sopenharmony_cijrel_op('JUMP_FORWARD', 110)    # Number of words to skip
1317db96d56Sopenharmony_cijrel_op('JUMP_IF_FALSE_OR_POP', 111) # Number of words to skip
1327db96d56Sopenharmony_cijrel_op('JUMP_IF_TRUE_OR_POP', 112)  # ""
1337db96d56Sopenharmony_cijrel_op('POP_JUMP_FORWARD_IF_FALSE', 114)
1347db96d56Sopenharmony_cijrel_op('POP_JUMP_FORWARD_IF_TRUE', 115)
1357db96d56Sopenharmony_ciname_op('LOAD_GLOBAL', 116)     # Index in name list
1367db96d56Sopenharmony_cidef_op('IS_OP', 117)
1377db96d56Sopenharmony_cidef_op('CONTAINS_OP', 118)
1387db96d56Sopenharmony_cidef_op('RERAISE', 119)
1397db96d56Sopenharmony_cidef_op('COPY', 120)
1407db96d56Sopenharmony_cidef_op('BINARY_OP', 122)
1417db96d56Sopenharmony_cijrel_op('SEND', 123) # Number of bytes to skip
1427db96d56Sopenharmony_cidef_op('LOAD_FAST', 124)        # Local variable number
1437db96d56Sopenharmony_cihaslocal.append(124)
1447db96d56Sopenharmony_cidef_op('STORE_FAST', 125)       # Local variable number
1457db96d56Sopenharmony_cihaslocal.append(125)
1467db96d56Sopenharmony_cidef_op('DELETE_FAST', 126)      # Local variable number
1477db96d56Sopenharmony_cihaslocal.append(126)
1487db96d56Sopenharmony_cijrel_op('POP_JUMP_FORWARD_IF_NOT_NONE', 128)
1497db96d56Sopenharmony_cijrel_op('POP_JUMP_FORWARD_IF_NONE', 129)
1507db96d56Sopenharmony_cidef_op('RAISE_VARARGS', 130)    # Number of raise arguments (1, 2, or 3)
1517db96d56Sopenharmony_cidef_op('GET_AWAITABLE', 131)
1527db96d56Sopenharmony_cidef_op('MAKE_FUNCTION', 132)    # Flags
1537db96d56Sopenharmony_cidef_op('BUILD_SLICE', 133)      # Number of items
1547db96d56Sopenharmony_cijrel_op('JUMP_BACKWARD_NO_INTERRUPT', 134) # Number of words to skip (backwards)
1557db96d56Sopenharmony_cidef_op('MAKE_CELL', 135)
1567db96d56Sopenharmony_cihasfree.append(135)
1577db96d56Sopenharmony_cidef_op('LOAD_CLOSURE', 136)
1587db96d56Sopenharmony_cihasfree.append(136)
1597db96d56Sopenharmony_cidef_op('LOAD_DEREF', 137)
1607db96d56Sopenharmony_cihasfree.append(137)
1617db96d56Sopenharmony_cidef_op('STORE_DEREF', 138)
1627db96d56Sopenharmony_cihasfree.append(138)
1637db96d56Sopenharmony_cidef_op('DELETE_DEREF', 139)
1647db96d56Sopenharmony_cihasfree.append(139)
1657db96d56Sopenharmony_cijrel_op('JUMP_BACKWARD', 140)    # Number of words to skip (backwards)
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_cidef_op('CALL_FUNCTION_EX', 142)  # Flags
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_cidef_op('EXTENDED_ARG', 144)
1707db96d56Sopenharmony_ciEXTENDED_ARG = 144
1717db96d56Sopenharmony_cidef_op('LIST_APPEND', 145)
1727db96d56Sopenharmony_cidef_op('SET_ADD', 146)
1737db96d56Sopenharmony_cidef_op('MAP_ADD', 147)
1747db96d56Sopenharmony_cidef_op('LOAD_CLASSDEREF', 148)
1757db96d56Sopenharmony_cihasfree.append(148)
1767db96d56Sopenharmony_cidef_op('COPY_FREE_VARS', 149)
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_cidef_op('RESUME', 151)   # This must be kept in sync with deepfreeze.py
1797db96d56Sopenharmony_cidef_op('MATCH_CLASS', 152)
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_cidef_op('FORMAT_VALUE', 155)
1827db96d56Sopenharmony_cidef_op('BUILD_CONST_KEY_MAP', 156)
1837db96d56Sopenharmony_cidef_op('BUILD_STRING', 157)
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ciname_op('LOAD_METHOD', 160)
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_cidef_op('LIST_EXTEND', 162)
1887db96d56Sopenharmony_cidef_op('SET_UPDATE', 163)
1897db96d56Sopenharmony_cidef_op('DICT_MERGE', 164)
1907db96d56Sopenharmony_cidef_op('DICT_UPDATE', 165)
1917db96d56Sopenharmony_cidef_op('PRECALL', 166)
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_cidef_op('CALL', 171)
1947db96d56Sopenharmony_cidef_op('KW_NAMES', 172)
1957db96d56Sopenharmony_cihasconst.append(172)
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_cijrel_op('POP_JUMP_BACKWARD_IF_NOT_NONE', 173)
1987db96d56Sopenharmony_cijrel_op('POP_JUMP_BACKWARD_IF_NONE', 174)
1997db96d56Sopenharmony_cijrel_op('POP_JUMP_BACKWARD_IF_FALSE', 175)
2007db96d56Sopenharmony_cijrel_op('POP_JUMP_BACKWARD_IF_TRUE', 176)
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_cidel def_op, name_op, jrel_op, jabs_op
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci_nb_ops = [
2067db96d56Sopenharmony_ci    ("NB_ADD", "+"),
2077db96d56Sopenharmony_ci    ("NB_AND", "&"),
2087db96d56Sopenharmony_ci    ("NB_FLOOR_DIVIDE", "//"),
2097db96d56Sopenharmony_ci    ("NB_LSHIFT", "<<"),
2107db96d56Sopenharmony_ci    ("NB_MATRIX_MULTIPLY", "@"),
2117db96d56Sopenharmony_ci    ("NB_MULTIPLY", "*"),
2127db96d56Sopenharmony_ci    ("NB_REMAINDER", "%"),
2137db96d56Sopenharmony_ci    ("NB_OR", "|"),
2147db96d56Sopenharmony_ci    ("NB_POWER", "**"),
2157db96d56Sopenharmony_ci    ("NB_RSHIFT", ">>"),
2167db96d56Sopenharmony_ci    ("NB_SUBTRACT", "-"),
2177db96d56Sopenharmony_ci    ("NB_TRUE_DIVIDE", "/"),
2187db96d56Sopenharmony_ci    ("NB_XOR", "^"),
2197db96d56Sopenharmony_ci    ("NB_INPLACE_ADD", "+="),
2207db96d56Sopenharmony_ci    ("NB_INPLACE_AND", "&="),
2217db96d56Sopenharmony_ci    ("NB_INPLACE_FLOOR_DIVIDE", "//="),
2227db96d56Sopenharmony_ci    ("NB_INPLACE_LSHIFT", "<<="),
2237db96d56Sopenharmony_ci    ("NB_INPLACE_MATRIX_MULTIPLY", "@="),
2247db96d56Sopenharmony_ci    ("NB_INPLACE_MULTIPLY", "*="),
2257db96d56Sopenharmony_ci    ("NB_INPLACE_REMAINDER", "%="),
2267db96d56Sopenharmony_ci    ("NB_INPLACE_OR", "|="),
2277db96d56Sopenharmony_ci    ("NB_INPLACE_POWER", "**="),
2287db96d56Sopenharmony_ci    ("NB_INPLACE_RSHIFT", ">>="),
2297db96d56Sopenharmony_ci    ("NB_INPLACE_SUBTRACT", "-="),
2307db96d56Sopenharmony_ci    ("NB_INPLACE_TRUE_DIVIDE", "/="),
2317db96d56Sopenharmony_ci    ("NB_INPLACE_XOR", "^="),
2327db96d56Sopenharmony_ci]
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci_specializations = {
2357db96d56Sopenharmony_ci    "BINARY_OP": [
2367db96d56Sopenharmony_ci        "BINARY_OP_ADAPTIVE",
2377db96d56Sopenharmony_ci        "BINARY_OP_ADD_FLOAT",
2387db96d56Sopenharmony_ci        "BINARY_OP_ADD_INT",
2397db96d56Sopenharmony_ci        "BINARY_OP_ADD_UNICODE",
2407db96d56Sopenharmony_ci        "BINARY_OP_INPLACE_ADD_UNICODE",
2417db96d56Sopenharmony_ci        "BINARY_OP_MULTIPLY_FLOAT",
2427db96d56Sopenharmony_ci        "BINARY_OP_MULTIPLY_INT",
2437db96d56Sopenharmony_ci        "BINARY_OP_SUBTRACT_FLOAT",
2447db96d56Sopenharmony_ci        "BINARY_OP_SUBTRACT_INT",
2457db96d56Sopenharmony_ci    ],
2467db96d56Sopenharmony_ci    "BINARY_SUBSCR": [
2477db96d56Sopenharmony_ci        "BINARY_SUBSCR_ADAPTIVE",
2487db96d56Sopenharmony_ci        "BINARY_SUBSCR_DICT",
2497db96d56Sopenharmony_ci        "BINARY_SUBSCR_GETITEM",
2507db96d56Sopenharmony_ci        "BINARY_SUBSCR_LIST_INT",
2517db96d56Sopenharmony_ci        "BINARY_SUBSCR_TUPLE_INT",
2527db96d56Sopenharmony_ci    ],
2537db96d56Sopenharmony_ci    "CALL": [
2547db96d56Sopenharmony_ci        "CALL_ADAPTIVE",
2557db96d56Sopenharmony_ci        "CALL_PY_EXACT_ARGS",
2567db96d56Sopenharmony_ci        "CALL_PY_WITH_DEFAULTS",
2577db96d56Sopenharmony_ci    ],
2587db96d56Sopenharmony_ci    "COMPARE_OP": [
2597db96d56Sopenharmony_ci        "COMPARE_OP_ADAPTIVE",
2607db96d56Sopenharmony_ci        "COMPARE_OP_FLOAT_JUMP",
2617db96d56Sopenharmony_ci        "COMPARE_OP_INT_JUMP",
2627db96d56Sopenharmony_ci        "COMPARE_OP_STR_JUMP",
2637db96d56Sopenharmony_ci    ],
2647db96d56Sopenharmony_ci    "EXTENDED_ARG": [
2657db96d56Sopenharmony_ci        "EXTENDED_ARG_QUICK",
2667db96d56Sopenharmony_ci    ],
2677db96d56Sopenharmony_ci    "JUMP_BACKWARD": [
2687db96d56Sopenharmony_ci        "JUMP_BACKWARD_QUICK",
2697db96d56Sopenharmony_ci    ],
2707db96d56Sopenharmony_ci    "LOAD_ATTR": [
2717db96d56Sopenharmony_ci        "LOAD_ATTR_ADAPTIVE",
2727db96d56Sopenharmony_ci        "LOAD_ATTR_INSTANCE_VALUE",
2737db96d56Sopenharmony_ci        "LOAD_ATTR_MODULE",
2747db96d56Sopenharmony_ci        "LOAD_ATTR_SLOT",
2757db96d56Sopenharmony_ci        "LOAD_ATTR_WITH_HINT",
2767db96d56Sopenharmony_ci    ],
2777db96d56Sopenharmony_ci    "LOAD_CONST": [
2787db96d56Sopenharmony_ci        "LOAD_CONST__LOAD_FAST",
2797db96d56Sopenharmony_ci    ],
2807db96d56Sopenharmony_ci    "LOAD_FAST": [
2817db96d56Sopenharmony_ci        "LOAD_FAST__LOAD_CONST",
2827db96d56Sopenharmony_ci        "LOAD_FAST__LOAD_FAST",
2837db96d56Sopenharmony_ci    ],
2847db96d56Sopenharmony_ci    "LOAD_GLOBAL": [
2857db96d56Sopenharmony_ci        "LOAD_GLOBAL_ADAPTIVE",
2867db96d56Sopenharmony_ci        "LOAD_GLOBAL_BUILTIN",
2877db96d56Sopenharmony_ci        "LOAD_GLOBAL_MODULE",
2887db96d56Sopenharmony_ci    ],
2897db96d56Sopenharmony_ci    "LOAD_METHOD": [
2907db96d56Sopenharmony_ci        "LOAD_METHOD_ADAPTIVE",
2917db96d56Sopenharmony_ci        "LOAD_METHOD_CLASS",
2927db96d56Sopenharmony_ci        "LOAD_METHOD_MODULE",
2937db96d56Sopenharmony_ci        "LOAD_METHOD_NO_DICT",
2947db96d56Sopenharmony_ci        "LOAD_METHOD_WITH_DICT",
2957db96d56Sopenharmony_ci        "LOAD_METHOD_WITH_VALUES",
2967db96d56Sopenharmony_ci    ],
2977db96d56Sopenharmony_ci    "PRECALL": [
2987db96d56Sopenharmony_ci        "PRECALL_ADAPTIVE",
2997db96d56Sopenharmony_ci        "PRECALL_BOUND_METHOD",
3007db96d56Sopenharmony_ci        "PRECALL_BUILTIN_CLASS",
3017db96d56Sopenharmony_ci        "PRECALL_BUILTIN_FAST_WITH_KEYWORDS",
3027db96d56Sopenharmony_ci        "PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
3037db96d56Sopenharmony_ci        "PRECALL_NO_KW_BUILTIN_FAST",
3047db96d56Sopenharmony_ci        "PRECALL_NO_KW_BUILTIN_O",
3057db96d56Sopenharmony_ci        "PRECALL_NO_KW_ISINSTANCE",
3067db96d56Sopenharmony_ci        "PRECALL_NO_KW_LEN",
3077db96d56Sopenharmony_ci        "PRECALL_NO_KW_LIST_APPEND",
3087db96d56Sopenharmony_ci        "PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST",
3097db96d56Sopenharmony_ci        "PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS",
3107db96d56Sopenharmony_ci        "PRECALL_NO_KW_METHOD_DESCRIPTOR_O",
3117db96d56Sopenharmony_ci        "PRECALL_NO_KW_STR_1",
3127db96d56Sopenharmony_ci        "PRECALL_NO_KW_TUPLE_1",
3137db96d56Sopenharmony_ci        "PRECALL_NO_KW_TYPE_1",
3147db96d56Sopenharmony_ci        "PRECALL_PYFUNC",
3157db96d56Sopenharmony_ci    ],
3167db96d56Sopenharmony_ci    "RESUME": [
3177db96d56Sopenharmony_ci        "RESUME_QUICK",
3187db96d56Sopenharmony_ci    ],
3197db96d56Sopenharmony_ci    "STORE_ATTR": [
3207db96d56Sopenharmony_ci        "STORE_ATTR_ADAPTIVE",
3217db96d56Sopenharmony_ci        "STORE_ATTR_INSTANCE_VALUE",
3227db96d56Sopenharmony_ci        "STORE_ATTR_SLOT",
3237db96d56Sopenharmony_ci        "STORE_ATTR_WITH_HINT",
3247db96d56Sopenharmony_ci    ],
3257db96d56Sopenharmony_ci    "STORE_FAST": [
3267db96d56Sopenharmony_ci        "STORE_FAST__LOAD_FAST",
3277db96d56Sopenharmony_ci        "STORE_FAST__STORE_FAST",
3287db96d56Sopenharmony_ci    ],
3297db96d56Sopenharmony_ci    "STORE_SUBSCR": [
3307db96d56Sopenharmony_ci        "STORE_SUBSCR_ADAPTIVE",
3317db96d56Sopenharmony_ci        "STORE_SUBSCR_DICT",
3327db96d56Sopenharmony_ci        "STORE_SUBSCR_LIST_INT",
3337db96d56Sopenharmony_ci    ],
3347db96d56Sopenharmony_ci    "UNPACK_SEQUENCE": [
3357db96d56Sopenharmony_ci        "UNPACK_SEQUENCE_ADAPTIVE",
3367db96d56Sopenharmony_ci        "UNPACK_SEQUENCE_LIST",
3377db96d56Sopenharmony_ci        "UNPACK_SEQUENCE_TUPLE",
3387db96d56Sopenharmony_ci        "UNPACK_SEQUENCE_TWO_TUPLE",
3397db96d56Sopenharmony_ci    ],
3407db96d56Sopenharmony_ci}
3417db96d56Sopenharmony_ci_specialized_instructions = [
3427db96d56Sopenharmony_ci    opcode for family in _specializations.values() for opcode in family
3437db96d56Sopenharmony_ci]
3447db96d56Sopenharmony_ci_specialization_stats = [
3457db96d56Sopenharmony_ci    "success",
3467db96d56Sopenharmony_ci    "failure",
3477db96d56Sopenharmony_ci    "hit",
3487db96d56Sopenharmony_ci    "deferred",
3497db96d56Sopenharmony_ci    "miss",
3507db96d56Sopenharmony_ci    "deopt",
3517db96d56Sopenharmony_ci]
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci_cache_format = {
3547db96d56Sopenharmony_ci    "LOAD_GLOBAL": {
3557db96d56Sopenharmony_ci        "counter": 1,
3567db96d56Sopenharmony_ci        "index": 1,
3577db96d56Sopenharmony_ci        "module_keys_version": 2,
3587db96d56Sopenharmony_ci        "builtin_keys_version": 1,
3597db96d56Sopenharmony_ci    },
3607db96d56Sopenharmony_ci    "BINARY_OP": {
3617db96d56Sopenharmony_ci        "counter": 1,
3627db96d56Sopenharmony_ci    },
3637db96d56Sopenharmony_ci    "UNPACK_SEQUENCE": {
3647db96d56Sopenharmony_ci        "counter": 1,
3657db96d56Sopenharmony_ci    },
3667db96d56Sopenharmony_ci    "COMPARE_OP": {
3677db96d56Sopenharmony_ci        "counter": 1,
3687db96d56Sopenharmony_ci        "mask": 1,
3697db96d56Sopenharmony_ci    },
3707db96d56Sopenharmony_ci    "BINARY_SUBSCR": {
3717db96d56Sopenharmony_ci        "counter": 1,
3727db96d56Sopenharmony_ci        "type_version": 2,
3737db96d56Sopenharmony_ci        "func_version": 1,
3747db96d56Sopenharmony_ci    },
3757db96d56Sopenharmony_ci    "LOAD_ATTR": {
3767db96d56Sopenharmony_ci        "counter": 1,
3777db96d56Sopenharmony_ci        "version": 2,
3787db96d56Sopenharmony_ci        "index": 1,
3797db96d56Sopenharmony_ci    },
3807db96d56Sopenharmony_ci    "STORE_ATTR": {
3817db96d56Sopenharmony_ci        "counter": 1,
3827db96d56Sopenharmony_ci        "version": 2,
3837db96d56Sopenharmony_ci        "index": 1,
3847db96d56Sopenharmony_ci    },
3857db96d56Sopenharmony_ci    "LOAD_METHOD": {
3867db96d56Sopenharmony_ci        "counter": 1,
3877db96d56Sopenharmony_ci        "type_version": 2,
3887db96d56Sopenharmony_ci        "dict_offset": 1,
3897db96d56Sopenharmony_ci        "keys_version": 2,
3907db96d56Sopenharmony_ci        "descr": 4,
3917db96d56Sopenharmony_ci    },
3927db96d56Sopenharmony_ci    "CALL": {
3937db96d56Sopenharmony_ci        "counter": 1,
3947db96d56Sopenharmony_ci        "func_version": 2,
3957db96d56Sopenharmony_ci        "min_args": 1,
3967db96d56Sopenharmony_ci    },
3977db96d56Sopenharmony_ci    "PRECALL": {
3987db96d56Sopenharmony_ci        "counter": 1,
3997db96d56Sopenharmony_ci    },
4007db96d56Sopenharmony_ci    "STORE_SUBSCR": {
4017db96d56Sopenharmony_ci        "counter": 1,
4027db96d56Sopenharmony_ci    },
4037db96d56Sopenharmony_ci}
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci_inline_cache_entries = [
4067db96d56Sopenharmony_ci    sum(_cache_format.get(opname[opcode], {}).values()) for opcode in range(256)
4077db96d56Sopenharmony_ci]
408