Skip to content

Commit dd693d6

Browse files
authored
gh-105481: simplify definition of pseudo ops in Lib/opcode.py (#107561)
1 parent b9c9a36 commit dd693d6

File tree

5 files changed

+23
-40
lines changed

5 files changed

+23
-40
lines changed

Doc/whatsnew/3.13.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ opcode
124124
This field was added in 3.12, it was never documented and is not intended for
125125
external usage. (Contributed by Irit Katriel in :gh:`105481`.)
126126

127+
* Removed ``opcode.is_pseudo``, ``opcode.MIN_PSEUDO_OPCODE`` and
128+
``opcode.MAX_PSEUDO_OPCODE``, which were added in 3.12, were never
129+
documented or exposed through ``dis``, and were not intended to be
130+
used externally.
131+
127132
pathlib
128133
-------
129134

Include/opcode.h

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Lib/opcode.py

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,11 @@
1919

2020
cmp_op = ('<', '<=', '==', '!=', '>', '>=')
2121

22-
def is_pseudo(op):
23-
return op >= MIN_PSEUDO_OPCODE and op <= MAX_PSEUDO_OPCODE
24-
2522
opmap = {}
2623

27-
# pseudo opcodes (used in the compiler) mapped to the values
28-
# they can become in the actual code.
29-
_pseudo_ops = {}
30-
3124
def def_op(name, op):
3225
opmap[name] = op
3326

34-
def pseudo_op(name, op, real_ops):
35-
def_op(name, op)
36-
_pseudo_ops[name] = real_ops
37-
38-
3927
# Instruction opcodes for compiled code
4028
# Blank lines correspond to available opcodes
4129

@@ -212,29 +200,27 @@ def pseudo_op(name, op, real_ops):
212200
# 255 is reserved
213201

214202

215-
MIN_PSEUDO_OPCODE = 256
216-
217-
pseudo_op('SETUP_FINALLY', 256, ['NOP'])
218-
pseudo_op('SETUP_CLEANUP', 257, ['NOP'])
219-
pseudo_op('SETUP_WITH', 258, ['NOP'])
220-
pseudo_op('POP_BLOCK', 259, ['NOP'])
203+
# Pseudo ops are above 255:
221204

222-
pseudo_op('JUMP', 260, ['JUMP_FORWARD', 'JUMP_BACKWARD'])
223-
pseudo_op('JUMP_NO_INTERRUPT', 261, ['JUMP_FORWARD', 'JUMP_BACKWARD_NO_INTERRUPT'])
205+
def_op('SETUP_FINALLY', 256)
206+
def_op('SETUP_CLEANUP', 257)
207+
def_op('SETUP_WITH', 258)
208+
def_op('POP_BLOCK', 259)
224209

225-
pseudo_op('LOAD_METHOD', 262, ['LOAD_ATTR'])
226-
pseudo_op('LOAD_SUPER_METHOD', 263, ['LOAD_SUPER_ATTR'])
227-
pseudo_op('LOAD_ZERO_SUPER_METHOD', 264, ['LOAD_SUPER_ATTR'])
228-
pseudo_op('LOAD_ZERO_SUPER_ATTR', 265, ['LOAD_SUPER_ATTR'])
210+
def_op('JUMP', 260)
211+
def_op('JUMP_NO_INTERRUPT', 261)
229212

230-
pseudo_op('STORE_FAST_MAYBE_NULL', 266, ['STORE_FAST'])
231-
pseudo_op('LOAD_CLOSURE', 267, ['LOAD_FAST'])
213+
def_op('LOAD_METHOD', 262)
214+
def_op('LOAD_SUPER_METHOD', 263)
215+
def_op('LOAD_ZERO_SUPER_METHOD', 264)
216+
def_op('LOAD_ZERO_SUPER_ATTR', 265)
232217

233-
MAX_PSEUDO_OPCODE = MIN_PSEUDO_OPCODE + len(_pseudo_ops) - 1
218+
def_op('STORE_FAST_MAYBE_NULL', 266)
219+
def_op('LOAD_CLOSURE', 267)
234220

235-
del def_op, pseudo_op
221+
del def_op
236222

237-
opname = ['<%r>' % (op,) for op in range(MAX_PSEUDO_OPCODE + 1)]
223+
opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)]
238224
for op, i in opmap.items():
239225
opname[i] = op
240226

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Remove ``opcode.is_pseudo``, ``opcode.MIN_PSEUDO_OPCODE`` and ``opcode.MAX_PSEUDO_OPCODE``,
2+
which were added in 3.12, were never documented and were not intended to be used externally.

Tools/build/generate_opcode_h.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,7 @@ def main(opcode_py,
7272
opcode = get_python_module_dict(opcode_py)
7373
opmap = opcode['opmap']
7474
opname = opcode['opname']
75-
is_pseudo = opcode['is_pseudo']
7675

77-
MIN_PSEUDO_OPCODE = opcode["MIN_PSEUDO_OPCODE"]
78-
MAX_PSEUDO_OPCODE = opcode["MAX_PSEUDO_OPCODE"]
7976
MIN_INSTRUMENTED_OPCODE = opcode["MIN_INSTRUMENTED_OPCODE"]
8077

8178
NUM_OPCODES = len(opname)
@@ -101,16 +98,11 @@ def main(opcode_py,
10198
for name in opname:
10299
if name in opmap:
103100
op = opmap[name]
104-
if op == MIN_PSEUDO_OPCODE:
105-
fobj.write(DEFINE.format("MIN_PSEUDO_OPCODE", MIN_PSEUDO_OPCODE))
106101
if op == MIN_INSTRUMENTED_OPCODE:
107102
fobj.write(DEFINE.format("MIN_INSTRUMENTED_OPCODE", MIN_INSTRUMENTED_OPCODE))
108103

109104
fobj.write(DEFINE.format(name, op))
110105

111-
if op == MAX_PSEUDO_OPCODE:
112-
fobj.write(DEFINE.format("MAX_PSEUDO_OPCODE", MAX_PSEUDO_OPCODE))
113-
114106

115107
for name, op in specialized_opmap.items():
116108
fobj.write(DEFINE.format(name, op))
@@ -126,7 +118,7 @@ def main(opcode_py,
126118

127119
deoptcodes = {}
128120
for basic, op in opmap.items():
129-
if not is_pseudo(op):
121+
if op < 256:
130122
deoptcodes[basic] = basic
131123
for basic, family in _opcode_metadata["_specializations"].items():
132124
for specialized in family:

0 commit comments

Comments
 (0)