aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2023-08-02 18:16:57 +0100
committerGitHub <noreply@github.com>2023-08-02 18:16:57 +0100
commitdd693d6320feeca887174fa592537669d017ca9b (patch)
tree488cbb4232bf30180f2a6bf316c15356ada77935
parentb9c9a36c2f2edc11b9c27eb7c5810919d9da9767 (diff)
downloadcpython-dd693d6320feeca887174fa592537669d017ca9b.tar.gz
cpython-dd693d6320feeca887174fa592537669d017ca9b.zip
gh-105481: simplify definition of pseudo ops in Lib/opcode.py (#107561)
-rw-r--r--Doc/whatsnew/3.13.rst5
-rw-r--r--Include/opcode.h2
-rw-r--r--Lib/opcode.py44
-rw-r--r--Misc/NEWS.d/next/Library/2023-08-01-21-43-58.gh-issue-105481.cl2ajS.rst2
-rw-r--r--Tools/build/generate_opcode_h.py10
5 files changed, 23 insertions, 40 deletions
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 22c1e03470f..63cdee6cf1a 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -124,6 +124,11 @@ opcode
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`.)
+* 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
-------
diff --git a/Include/opcode.h b/Include/opcode.h
index eb4bb85e5b6..ede1518b6fd 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -146,7 +146,6 @@ extern "C" {
#define INSTRUMENTED_END_SEND 252
#define INSTRUMENTED_INSTRUCTION 253
#define INSTRUMENTED_LINE 254
-#define MIN_PSEUDO_OPCODE 256
#define SETUP_FINALLY 256
#define SETUP_CLEANUP 257
#define SETUP_WITH 258
@@ -159,7 +158,6 @@ extern "C" {
#define LOAD_ZERO_SUPER_ATTR 265
#define STORE_FAST_MAYBE_NULL 266
#define LOAD_CLOSURE 267
-#define MAX_PSEUDO_OPCODE 267
#define TO_BOOL_ALWAYS_TRUE 7
#define TO_BOOL_BOOL 8
#define TO_BOOL_INT 10
diff --git a/Lib/opcode.py b/Lib/opcode.py
index 51432ab1fab..5a9f8ddd073 100644
--- a/Lib/opcode.py
+++ b/Lib/opcode.py
@@ -19,23 +19,11 @@ if sys.version_info[:2] >= (3, 13):
cmp_op = ('<', '<=', '==', '!=', '>', '>=')
-def is_pseudo(op):
- return op >= MIN_PSEUDO_OPCODE and op <= MAX_PSEUDO_OPCODE
-
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):
opmap[name] = op
-def pseudo_op(name, op, real_ops):
- def_op(name, op)
- _pseudo_ops[name] = real_ops
-
-
# Instruction opcodes for compiled code
# Blank lines correspond to available opcodes
@@ -212,29 +200,27 @@ def_op('INSTRUMENTED_LINE', 254)
# 255 is reserved
-MIN_PSEUDO_OPCODE = 256
-
-pseudo_op('SETUP_FINALLY', 256, ['NOP'])
-pseudo_op('SETUP_CLEANUP', 257, ['NOP'])
-pseudo_op('SETUP_WITH', 258, ['NOP'])
-pseudo_op('POP_BLOCK', 259, ['NOP'])
+# Pseudo ops are above 255:
-pseudo_op('JUMP', 260, ['JUMP_FORWARD', 'JUMP_BACKWARD'])
-pseudo_op('JUMP_NO_INTERRUPT', 261, ['JUMP_FORWARD', 'JUMP_BACKWARD_NO_INTERRUPT'])
+def_op('SETUP_FINALLY', 256)
+def_op('SETUP_CLEANUP', 257)
+def_op('SETUP_WITH', 258)
+def_op('POP_BLOCK', 259)
-pseudo_op('LOAD_METHOD', 262, ['LOAD_ATTR'])
-pseudo_op('LOAD_SUPER_METHOD', 263, ['LOAD_SUPER_ATTR'])
-pseudo_op('LOAD_ZERO_SUPER_METHOD', 264, ['LOAD_SUPER_ATTR'])
-pseudo_op('LOAD_ZERO_SUPER_ATTR', 265, ['LOAD_SUPER_ATTR'])
+def_op('JUMP', 260)
+def_op('JUMP_NO_INTERRUPT', 261)
-pseudo_op('STORE_FAST_MAYBE_NULL', 266, ['STORE_FAST'])
-pseudo_op('LOAD_CLOSURE', 267, ['LOAD_FAST'])
+def_op('LOAD_METHOD', 262)
+def_op('LOAD_SUPER_METHOD', 263)
+def_op('LOAD_ZERO_SUPER_METHOD', 264)
+def_op('LOAD_ZERO_SUPER_ATTR', 265)
-MAX_PSEUDO_OPCODE = MIN_PSEUDO_OPCODE + len(_pseudo_ops) - 1
+def_op('STORE_FAST_MAYBE_NULL', 266)
+def_op('LOAD_CLOSURE', 267)
-del def_op, pseudo_op
+del def_op
-opname = ['<%r>' % (op,) for op in range(MAX_PSEUDO_OPCODE + 1)]
+opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)]
for op, i in opmap.items():
opname[i] = op
diff --git a/Misc/NEWS.d/next/Library/2023-08-01-21-43-58.gh-issue-105481.cl2ajS.rst b/Misc/NEWS.d/next/Library/2023-08-01-21-43-58.gh-issue-105481.cl2ajS.rst
new file mode 100644
index 00000000000..d02f909e870
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-08-01-21-43-58.gh-issue-105481.cl2ajS.rst
@@ -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.
diff --git a/Tools/build/generate_opcode_h.py b/Tools/build/generate_opcode_h.py
index 16b028dc120..3a817326c94 100644
--- a/Tools/build/generate_opcode_h.py
+++ b/Tools/build/generate_opcode_h.py
@@ -72,10 +72,7 @@ def main(opcode_py,
opcode = get_python_module_dict(opcode_py)
opmap = opcode['opmap']
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"]
NUM_OPCODES = len(opname)
@@ -101,16 +98,11 @@ def main(opcode_py,
for name in opname:
if name in opmap:
op = opmap[name]
- if op == MIN_PSEUDO_OPCODE:
- fobj.write(DEFINE.format("MIN_PSEUDO_OPCODE", MIN_PSEUDO_OPCODE))
if op == MIN_INSTRUMENTED_OPCODE:
fobj.write(DEFINE.format("MIN_INSTRUMENTED_OPCODE", MIN_INSTRUMENTED_OPCODE))
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():
fobj.write(DEFINE.format(name, op))
@@ -126,7 +118,7 @@ def main(opcode_py,
deoptcodes = {}
for basic, op in opmap.items():
- if not is_pseudo(op):
+ if op < 256:
deoptcodes[basic] = basic
for basic, family in _opcode_metadata["_specializations"].items():
for specialized in family: