opcode_312.py 7.6 KB

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