gh-105481: simplify definition of pseudo ops in Lib/opcode.py (#107561)

This commit is contained in:
Irit Katriel 2023-08-02 18:16:57 +01:00 committed by GitHub
parent b9c9a36c2f
commit dd693d6320
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 40 deletions

View File

@ -124,6 +124,11 @@ opcode
This field was added in 3.12, it was never documented and is not intended for This field was added in 3.12, it was never documented and is not intended for
external usage. (Contributed by Irit Katriel in :gh:`105481`.) external usage. (Contributed by Irit Katriel in :gh:`105481`.)
* Removed ``opcode.is_pseudo``, ``opcode.MIN_PSEUDO_OPCODE`` and
``opcode.MAX_PSEUDO_OPCODE``, which were added in 3.12, were never
documented or exposed through ``dis``, and were not intended to be
used externally.
pathlib pathlib
------- -------

2
Include/opcode.h generated
View File

@ -146,7 +146,6 @@ extern "C" {
#define INSTRUMENTED_END_SEND 252 #define INSTRUMENTED_END_SEND 252
#define INSTRUMENTED_INSTRUCTION 253 #define INSTRUMENTED_INSTRUCTION 253
#define INSTRUMENTED_LINE 254 #define INSTRUMENTED_LINE 254
#define MIN_PSEUDO_OPCODE 256
#define SETUP_FINALLY 256 #define SETUP_FINALLY 256
#define SETUP_CLEANUP 257 #define SETUP_CLEANUP 257
#define SETUP_WITH 258 #define SETUP_WITH 258
@ -159,7 +158,6 @@ extern "C" {
#define LOAD_ZERO_SUPER_ATTR 265 #define LOAD_ZERO_SUPER_ATTR 265
#define STORE_FAST_MAYBE_NULL 266 #define STORE_FAST_MAYBE_NULL 266
#define LOAD_CLOSURE 267 #define LOAD_CLOSURE 267
#define MAX_PSEUDO_OPCODE 267
#define TO_BOOL_ALWAYS_TRUE 7 #define TO_BOOL_ALWAYS_TRUE 7
#define TO_BOOL_BOOL 8 #define TO_BOOL_BOOL 8
#define TO_BOOL_INT 10 #define TO_BOOL_INT 10

View File

@ -19,23 +19,11 @@ if sys.version_info[:2] >= (3, 13):
cmp_op = ('<', '<=', '==', '!=', '>', '>=') cmp_op = ('<', '<=', '==', '!=', '>', '>=')
def is_pseudo(op):
return op >= MIN_PSEUDO_OPCODE and op <= MAX_PSEUDO_OPCODE
opmap = {} opmap = {}
# pseudo opcodes (used in the compiler) mapped to the values
# they can become in the actual code.
_pseudo_ops = {}
def def_op(name, op): def def_op(name, op):
opmap[name] = op opmap[name] = op
def pseudo_op(name, op, real_ops):
def_op(name, op)
_pseudo_ops[name] = real_ops
# Instruction opcodes for compiled code # Instruction opcodes for compiled code
# Blank lines correspond to available opcodes # Blank lines correspond to available opcodes
@ -212,29 +200,27 @@ def_op('INSTRUMENTED_LINE', 254)
# 255 is reserved # 255 is reserved
MIN_PSEUDO_OPCODE = 256 # Pseudo ops are above 255:
pseudo_op('SETUP_FINALLY', 256, ['NOP']) def_op('SETUP_FINALLY', 256)
pseudo_op('SETUP_CLEANUP', 257, ['NOP']) def_op('SETUP_CLEANUP', 257)
pseudo_op('SETUP_WITH', 258, ['NOP']) def_op('SETUP_WITH', 258)
pseudo_op('POP_BLOCK', 259, ['NOP']) def_op('POP_BLOCK', 259)
pseudo_op('JUMP', 260, ['JUMP_FORWARD', 'JUMP_BACKWARD']) def_op('JUMP', 260)
pseudo_op('JUMP_NO_INTERRUPT', 261, ['JUMP_FORWARD', 'JUMP_BACKWARD_NO_INTERRUPT']) def_op('JUMP_NO_INTERRUPT', 261)
pseudo_op('LOAD_METHOD', 262, ['LOAD_ATTR']) def_op('LOAD_METHOD', 262)
pseudo_op('LOAD_SUPER_METHOD', 263, ['LOAD_SUPER_ATTR']) def_op('LOAD_SUPER_METHOD', 263)
pseudo_op('LOAD_ZERO_SUPER_METHOD', 264, ['LOAD_SUPER_ATTR']) def_op('LOAD_ZERO_SUPER_METHOD', 264)
pseudo_op('LOAD_ZERO_SUPER_ATTR', 265, ['LOAD_SUPER_ATTR']) def_op('LOAD_ZERO_SUPER_ATTR', 265)
pseudo_op('STORE_FAST_MAYBE_NULL', 266, ['STORE_FAST']) def_op('STORE_FAST_MAYBE_NULL', 266)
pseudo_op('LOAD_CLOSURE', 267, ['LOAD_FAST']) def_op('LOAD_CLOSURE', 267)
MAX_PSEUDO_OPCODE = MIN_PSEUDO_OPCODE + len(_pseudo_ops) - 1 del def_op
del def_op, pseudo_op opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)]
opname = ['<%r>' % (op,) for op in range(MAX_PSEUDO_OPCODE + 1)]
for op, i in opmap.items(): for op, i in opmap.items():
opname[i] = op opname[i] = op

View File

@ -0,0 +1,2 @@
Remove ``opcode.is_pseudo``, ``opcode.MIN_PSEUDO_OPCODE`` and ``opcode.MAX_PSEUDO_OPCODE``,
which were added in 3.12, were never documented and were not intended to be used externally.

View File

@ -72,10 +72,7 @@ def main(opcode_py,
opcode = get_python_module_dict(opcode_py) opcode = get_python_module_dict(opcode_py)
opmap = opcode['opmap'] opmap = opcode['opmap']
opname = opcode['opname'] opname = opcode['opname']
is_pseudo = opcode['is_pseudo']
MIN_PSEUDO_OPCODE = opcode["MIN_PSEUDO_OPCODE"]
MAX_PSEUDO_OPCODE = opcode["MAX_PSEUDO_OPCODE"]
MIN_INSTRUMENTED_OPCODE = opcode["MIN_INSTRUMENTED_OPCODE"] MIN_INSTRUMENTED_OPCODE = opcode["MIN_INSTRUMENTED_OPCODE"]
NUM_OPCODES = len(opname) NUM_OPCODES = len(opname)
@ -101,16 +98,11 @@ def main(opcode_py,
for name in opname: for name in opname:
if name in opmap: if name in opmap:
op = opmap[name] op = opmap[name]
if op == MIN_PSEUDO_OPCODE:
fobj.write(DEFINE.format("MIN_PSEUDO_OPCODE", MIN_PSEUDO_OPCODE))
if op == MIN_INSTRUMENTED_OPCODE: if op == MIN_INSTRUMENTED_OPCODE:
fobj.write(DEFINE.format("MIN_INSTRUMENTED_OPCODE", MIN_INSTRUMENTED_OPCODE)) fobj.write(DEFINE.format("MIN_INSTRUMENTED_OPCODE", MIN_INSTRUMENTED_OPCODE))
fobj.write(DEFINE.format(name, op)) fobj.write(DEFINE.format(name, op))
if op == MAX_PSEUDO_OPCODE:
fobj.write(DEFINE.format("MAX_PSEUDO_OPCODE", MAX_PSEUDO_OPCODE))
for name, op in specialized_opmap.items(): for name, op in specialized_opmap.items():
fobj.write(DEFINE.format(name, op)) fobj.write(DEFINE.format(name, op))
@ -126,7 +118,7 @@ def main(opcode_py,
deoptcodes = {} deoptcodes = {}
for basic, op in opmap.items(): for basic, op in opmap.items():
if not is_pseudo(op): if op < 256:
deoptcodes[basic] = basic deoptcodes[basic] = basic
for basic, family in _opcode_metadata["_specializations"].items(): for basic, family in _opcode_metadata["_specializations"].items():
for specialized in family: for specialized in family: