| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- """
- CPython 3.12 bytecode opcodes
- This is like Python 3.12's opcode.py with some classification
- of stack usage and information for formatting instructions.
- """
- import xdis.opcodes.opcode_311 as opcode_311
- from xdis.opcodes.base import (
- binary_op,
- def_op,
- finalize_opcodes,
- init_opdata,
- jrel_op,
- local_op,
- name_op,
- rm_op,
- update_pj3,
- )
- from xdis.opcodes.opcode_311 import opcode_arg_fmt311, opcode_extended_fmt311
- version_tuple = (3, 12)
- python_implementation = "CPython"
- loc = locals()
- init_opdata(loc, opcode_311, version_tuple)
- # extend opcodes to cover pseudo ops
- loc["opname"].extend([f"<{i}>" for i in range(256, 267)])
- loc["oppop"].extend([0] * 11)
- loc["oppush"].extend([0] * 11)
- # fmt: off
- ## These are removed / replaced since 3.11...
- # OP NAME OPCODE
- #----------------------------------------------
- rm_op(loc, "UNARY_POSITIVE" , 10)
- rm_op(loc, "PRINT_EXPR" , 70)
- rm_op(loc, "LIST_TO_TUPLE" , 82)
- rm_op(loc, "IMPORT_STAR" , 84)
- rm_op(loc, "ASYNC_GEN_WRAP" , 87)
- rm_op(loc, "PREP_RERAISE_STAR" , 88)
- rm_op(loc, "JUMP_IF_FALSE_OR_POP" , 111)
- rm_op(loc, "JUMP_IF_TRUE_OR_POP" , 112)
- rm_op(loc, "POP_JUMP_FORWARD_IF_FALSE" , 114)
- rm_op(loc, "POP_JUMP_FORWARD_IF_TRUE" , 115)
- rm_op(loc, "POP_JUMP_FORWARD_IF_NONE" , 129)
- rm_op(loc, "POP_JUMP_FORWARD_IF_NOT_NONE" , 128)
- rm_op(loc, "LOAD_CLASSDEREF" , 148)
- rm_op(loc, "PRECALL" , 166)
- rm_op(loc, "POP_JUMP_BACKWARD_IF_NOT_NONE", 173)
- rm_op(loc, "POP_JUMP_BACKWARD_IF_NONE" , 174)
- rm_op(loc, "POP_JUMP_BACKWARD_IF_FALSE" , 175)
- rm_op(loc, "POP_JUMP_BACKWARD_IF_TRUE" , 176)
- rm_op(loc, "YIELD_VALUE" , 86)
- rm_op(loc, "LOAD_METHOD" , 160)
- ## These are new since 3.11...
- # OP NAME OPCODE POP PUSH
- #---------------------------------------------------------------
- def_op(loc , "INTERPRETER_EXIT" , 3 , 1, 0)
- def_op(loc , "END_FOR" , 4 , 2, 0)
- def_op(loc , "END_SEND" , 5 , 1, 0)
- def_op(loc , "RESERVED" , 17 , 0, 0)
- binary_op(loc , "BINARY_SLICE" , 26 , 2, 0)
- binary_op(loc , "STORE_SLICE" , 27 , 4, 0)
- def_op(loc , "CLEANUP_THROW" , 55 , 2, 1)
- def_op(loc , "LOAD_LOCALS" , 87 , 0, 1)
- def_op(loc , "RETURN_CONST" , 121, 0, 0)
- local_op(loc , "LOAD_FAST_CHECK" , 127, 0, 1)
- jrel_op(loc , "POP_JUMP_IF_FALSE" , 114, 1, 0)
- jrel_op(loc , "POP_JUMP_IF_TRUE" , 115, 1, 0)
- jrel_op(loc , "POP_JUMP_IF_NOT_NONE" , 128, 1, 0)
- jrel_op(loc , "POP_JUMP_IF_NONE" , 129, 1, 0)
- def_op(loc , "LOAD_SUPER_ATTR" , 141, 3, 1)
- def_op(loc , "LOAD_FAST_AND_CLEAR" , 143, 0, 1)
- def_op(loc , "YIELD_VALUE" , 150, 1, 1)
- def_op(loc , "CALL_INTRINSIC_1" , 173, 1, 1)
- def_op(loc , "CALL_INTRINSIC_2" , 174, 2, 1)
- def_op(loc , "LOAD_FROM_DICT_OR_GLOBALS" , 175, 1, 1)
- def_op(loc , "LOAD_FROM_DICT_OR_DEREF" , 176, 1, 1)
- # OP NAME OPCODE POP PUSH
- def_op(loc , "INSTRUMENTED_LOAD_SUPER_ATTR" , 237, 2, 0)
- def_op(loc , "INSTRUMENTED_POP_JUMP_IF_NONE" , 238, 1, 1)
- def_op(loc , "INSTRUMENTED_POP_JUMP_IF_NOT_NONE", 239, 1, 1)
- def_op(loc , "INSTRUMENTED_RESUME" , 240, 1, 1)
- def_op(loc , "INSTRUMENTED_CALL" , 241, 1, 1)
- def_op(loc , "INSTRUMENTED_RETURN_VALUE" , 242, 1, 0)
- def_op(loc , "INSTRUMENTED_YIELD_VALUE" , 243, 1, 1)
- def_op(loc , "INSTRUMENTED_CALL_FUNCTION_EX" , 244, 1, 1)
- def_op(loc , "INSTRUMENTED_JUMP_FORWARD" , 245, 1, 1)
- def_op(loc , "INSTRUMENTED_JUMP_BACKWARD" , 246, 1, 1)
- def_op(loc , "INSTRUMENTED_RETURN_CONST" , 247, 1, 1)
- def_op(loc , "INSTRUMENTED_FOR_ITER" , 248, 1, 1)
- def_op(loc , "INSTRUMENTED_POP_JUMP_IF_FALSE" , 249, 1, 1)
- def_op(loc , "INSTRUMENTED_POP_JUMP_IF_TRUE" , 250, 1, 1)
- def_op(loc , "INSTRUMENTED_END_FOR" , 251, 2, 0)
- def_op(loc , "INSTRUMENTED_END_SEND" , 252, 1, 0)
- def_op(loc , "INSTRUMENTED_INSTRUCTION" , 253, 1, 1)
- def_op(loc , "INSTRUMENTED_LINE" , 254, 1, 1)
- # OP NAME OPCODE POP PUSH
- def_op(loc , "SETUP_FINALLY" , 256, 0, 1)
- def_op(loc , "SETUP_CLEANUP" , 257, 0, 1)
- def_op(loc , "SETUP_WITH" , 258, 0, 1)
- def_op(loc , "POP_BLOCK" , 259, 0, 1)
- jrel_op(loc , "JUMP" , 260, 0, 0)
- jrel_op(loc , "JUMP_NO_INTERRUPT" , 261, 0, 0)
- name_op(loc , "LOAD_METHOD" , 262, 0, 1)
- def_op(loc , "LOAD_SUPER_METHOD" , 263, 1, 0)
- def_op(loc , "LOAD_ZERO_SUPER_METHOD" , 264, 1, 0)
- def_op(loc , "LOAD_ZERO_SUPER_ATTR" , 265, 1, 0)
- def_op(loc , "STORE_FAST_MAYBE_NULL" , 266, 1, 0)
- ### update opinfo tables
- loc["hasnargs"] = []
- loc["hasstore"] = []
- loc["hasvargs"] = []
- loc["hasconst"].append(121)
- loc["hasfree"].extend([148, 176])
- # hasjrel removed 111 112 173 174 175 176 and added 260 261
- loc["hasjrel"] = [93, 110, 114, 115, 123, 128, 129, 134, 140, 260, 261]
- loc["haslocal"].extend([127, 143, 266])
- # hasname removed 160 and added 141 175 262 234 264 265
- loc["hasname"] = [90, 91, 95, 96, 97, 98, 101, 106, 108, 109, 116, 141, 175, 262, 263, 264, 265]
- # new hasarg table
- loc.update({"hasarg": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,\
- 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
- 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 150, 151, 152,
- 155, 156, 157, 162, 163, 164, 165, 171, 172, 173, 174, 175, 176, 237, 238, 239, 240, 241, 242,
- 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 260, 261, 262, 263, 264, 265, 266]})
- # new hasexc table
- loc.update({"hasexc":[264, 265, 266]})
- ### add new arg formats
- _intrinsic_1_descs = [
- "INTRINSIC_1_INVALID",
- "INTRINSIC_PRINT",
- "INTRINSIC_IMPORT_STAR",
- "INTRINSIC_STOPITERATION_ERROR",
- "INTRINSIC_ASYNC_GEN_WRAP",
- "INTRINSIC_UNARY_POSITIVE",
- "INTRINSIC_LIST_TO_TUPLE",
- "INTRINSIC_TYPEVAR",
- "INTRINSIC_PARAMSPEC",
- "INTRINSIC_TYPEVARTUPLE",
- "INTRINSIC_SUBSCRIPT_GENERIC",
- "INTRINSIC_TYPEALIAS",
- ]
- _intrinsic_2_descs = [
- "INTRINSIC_2_INVALID",
- "INTRINSIC_PREP_RERAISE_STAR",
- "INTRINSIC_TYPEVAR_WITH_BOUND",
- "INTRINSIC_TYPEVAR_WITH_CONSTRAINTS",
- "INTRINSIC_SET_FUNCTION_TYPE_PARAMS",
- ]
- def format_CALL_INTRINSIC_1(arg) -> str:
- return _intrinsic_1_descs[arg]
- def format_CALL_INTRINSIC_2(arg) -> str:
- return _intrinsic_2_descs[arg]
- opcode_extended_fmt = opcode_extended_fmt312 = opcode_extended_fmt311.copy()
- opcode_arg_fmt = opcode_arg_fmt12 = opcode_arg_fmt311.copy()
- ### update arg formatting
- opcode_arg_fmt312 = {
- **opcode_arg_fmt311,
- **{
- "CALL_INTRINSIC_1": format_CALL_INTRINSIC_1,
- "CALL_INTRINSIC_2": format_CALL_INTRINSIC_2,
- },
- }
- from xdis.opcodes.opcode_311 import findlinestarts
- update_pj3(globals(), loc)
- finalize_opcodes(loc)
|