mirror of https://github.com/python/cpython
gh-105481: simplify definition of pseudo ops in Lib/opcode.py (#107561)
This commit is contained in:
parent
b9c9a36c2f
commit
dd693d6320
|
@ -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
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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.
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue