From fe9d7fee335ee7a46249c92faaa43cecb3f12116 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Tue, 1 Aug 2023 21:44:35 +0100 Subject: [PATCH 1/3] gh-105481: simplify definition of pseudo ops in Lib/opcode.py --- Lib/opcode.py | 43 ++++++++----------- ...-08-01-21-43-58.gh-issue-105481.cl2ajS.rst | 3 ++ Tools/build/generate_opcode_h.py | 3 +- 3 files changed, 22 insertions(+), 27 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-08-01-21-43-58.gh-issue-105481.cl2ajS.rst diff --git a/Lib/opcode.py b/Lib/opcode.py index 51432ab1fab3f1..24085eac3a12a0 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -19,23 +19,11 @@ 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 @@ -213,24 +201,29 @@ def pseudo_op(name, op, real_ops): MIN_PSEUDO_OPCODE = 256 +MAX_PSEUDO_OPCODE = -1 -pseudo_op('SETUP_FINALLY', 256, ['NOP']) -pseudo_op('SETUP_CLEANUP', 257, ['NOP']) -pseudo_op('SETUP_WITH', 258, ['NOP']) -pseudo_op('POP_BLOCK', 259, ['NOP']) +def pseudo_op(name, op): + global MAX_PSEUDO_OPCODE + if op > MAX_PSEUDO_OPCODE: + MAX_PSEUDO_OPCODE = op + def_op(name, op) -pseudo_op('JUMP', 260, ['JUMP_FORWARD', 'JUMP_BACKWARD']) -pseudo_op('JUMP_NO_INTERRUPT', 261, ['JUMP_FORWARD', 'JUMP_BACKWARD_NO_INTERRUPT']) +pseudo_op('SETUP_FINALLY', 256) +pseudo_op('SETUP_CLEANUP', 257) +pseudo_op('SETUP_WITH', 258) +pseudo_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']) +pseudo_op('JUMP', 260) +pseudo_op('JUMP_NO_INTERRUPT', 261) -pseudo_op('STORE_FAST_MAYBE_NULL', 266, ['STORE_FAST']) -pseudo_op('LOAD_CLOSURE', 267, ['LOAD_FAST']) +pseudo_op('LOAD_METHOD', 262) +pseudo_op('LOAD_SUPER_METHOD', 263) +pseudo_op('LOAD_ZERO_SUPER_METHOD', 264) +pseudo_op('LOAD_ZERO_SUPER_ATTR', 265) -MAX_PSEUDO_OPCODE = MIN_PSEUDO_OPCODE + len(_pseudo_ops) - 1 +pseudo_op('STORE_FAST_MAYBE_NULL', 266) +pseudo_op('LOAD_CLOSURE', 267) del def_op, pseudo_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 00000000000000..bd229a6092e164 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-08-01-21-43-58.gh-issue-105481.cl2ajS.rst @@ -0,0 +1,3 @@ +Remove ``opcode.is_pseudo``, which was added in 3.12, was never documented +and not intended to be used externally. It is a shortcut for ``op >= +opcode.MIN_PSEUDO_OPCODE and op <= opcode.MAX_PSEUDO_OPCODE``. diff --git a/Tools/build/generate_opcode_h.py b/Tools/build/generate_opcode_h.py index 16b028dc1205ac..e84e3ab6d408ec 100644 --- a/Tools/build/generate_opcode_h.py +++ b/Tools/build/generate_opcode_h.py @@ -72,7 +72,6 @@ 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"] @@ -126,7 +125,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: From fdba0fb4074edc70968a138ecf1880b93733054b Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Wed, 2 Aug 2023 16:53:48 +0100 Subject: [PATCH 2/3] remove MIN_PSEUDO_OPCODE and MAX_PSEUDO_OPCODE too --- Doc/whatsnew/3.13.rst | 5 +++++ Include/opcode.h | 2 -- Lib/opcode.py | 7 +------ .../Library/2023-08-01-21-43-58.gh-issue-105481.cl2ajS.rst | 5 ++--- Tools/build/generate_opcode_h.py | 7 ------- 5 files changed, 8 insertions(+), 18 deletions(-) diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 22c1e03470f5dc..63cdee6cf1a4f3 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 eb4bb85e5b667d..ede1518b6fd25c 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 24085eac3a12a0..b52e6caab47721 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -200,13 +200,8 @@ def def_op(name, op): # 255 is reserved -MIN_PSEUDO_OPCODE = 256 -MAX_PSEUDO_OPCODE = -1 def pseudo_op(name, op): - global MAX_PSEUDO_OPCODE - if op > MAX_PSEUDO_OPCODE: - MAX_PSEUDO_OPCODE = op def_op(name, op) pseudo_op('SETUP_FINALLY', 256) @@ -227,7 +222,7 @@ def pseudo_op(name, op): del def_op, pseudo_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 index bd229a6092e164..d02f909e870188 100644 --- 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 @@ -1,3 +1,2 @@ -Remove ``opcode.is_pseudo``, which was added in 3.12, was never documented -and not intended to be used externally. It is a shortcut for ``op >= -opcode.MIN_PSEUDO_OPCODE and op <= opcode.MAX_PSEUDO_OPCODE``. +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 e84e3ab6d408ec..3a817326c94cbb 100644 --- a/Tools/build/generate_opcode_h.py +++ b/Tools/build/generate_opcode_h.py @@ -73,8 +73,6 @@ def main(opcode_py, opmap = opcode['opmap'] opname = opcode['opname'] - 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) @@ -100,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)) From cabf2b85d9d591a3f34b333a2aae69d007c1bbaa Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Wed, 2 Aug 2023 16:59:42 +0100 Subject: [PATCH 3/3] don't need pseudo_op anymore --- Lib/opcode.py | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/Lib/opcode.py b/Lib/opcode.py index b52e6caab47721..5a9f8ddd0738db 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -200,27 +200,25 @@ def def_op(name, op): # 255 is reserved +# Pseudo ops are above 255: -def pseudo_op(name, op): - def_op(name, op) +def_op('SETUP_FINALLY', 256) +def_op('SETUP_CLEANUP', 257) +def_op('SETUP_WITH', 258) +def_op('POP_BLOCK', 259) -pseudo_op('SETUP_FINALLY', 256) -pseudo_op('SETUP_CLEANUP', 257) -pseudo_op('SETUP_WITH', 258) -pseudo_op('POP_BLOCK', 259) +def_op('JUMP', 260) +def_op('JUMP_NO_INTERRUPT', 261) -pseudo_op('JUMP', 260) -pseudo_op('JUMP_NO_INTERRUPT', 261) +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) -pseudo_op('LOAD_METHOD', 262) -pseudo_op('LOAD_SUPER_METHOD', 263) -pseudo_op('LOAD_ZERO_SUPER_METHOD', 264) -pseudo_op('LOAD_ZERO_SUPER_ATTR', 265) +def_op('STORE_FAST_MAYBE_NULL', 266) +def_op('LOAD_CLOSURE', 267) -pseudo_op('STORE_FAST_MAYBE_NULL', 266) -pseudo_op('LOAD_CLOSURE', 267) - -del def_op, pseudo_op +del def_op opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)] for op, i in opmap.items():