https://github.com/python/cpython/commit/7a65439b93d6ee4d4e32757b55909b882f9a2056
commit: 7a65439b93d6ee4d4e32757b55909b882f9a2056
branch: main
author: Mark Shannon <m...@hotpy.org>
committer: markshannon <m...@hotpy.org>
date: 2024-08-13T14:22:57+01:00
summary:

GH-122390: Replace `_Py_GetbaseOpcode` with `_Py_GetBaseCodeUnit` (GH-122942)

files:
M Include/internal/pycore_code.h
M Include/internal/pycore_magic_number.h
M Include/internal/pycore_opcode_metadata.h
M Include/opcode_ids.h
M Lib/_opcode_metadata.py
M Lib/test/test__opcode.py
M Lib/test/test_dis.py
M Objects/codeobject.c
M Objects/frameobject.c
M Programs/test_frozenmain.h
M Python/instrumentation.c
M Python/opcode_targets.h
M Python/optimizer.c
M Python/specialize.c
M Tools/cases_generator/analyzer.py
M Tools/cases_generator/opcode_id_generator.py

diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h
index cd77fe408fc5d9..67aeab24db2347 100644
--- a/Include/internal/pycore_code.h
+++ b/Include/internal/pycore_code.h
@@ -586,7 +586,7 @@ adaptive_counter_backoff(_Py_BackoffCounter counter) {
 
 extern int _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp);
 
-extern int _Py_GetBaseOpcode(PyCodeObject *code, int offset);
+extern _Py_CODEUNIT _Py_GetBaseCodeUnit(PyCodeObject *code, int offset);
 
 extern int _PyInstruction_GetLength(PyCodeObject *code, int offset);
 
diff --git a/Include/internal/pycore_magic_number.h 
b/Include/internal/pycore_magic_number.h
index 249314fff55a16..0af6e3f3cd4c92 100644
--- a/Include/internal/pycore_magic_number.h
+++ b/Include/internal/pycore_magic_number.h
@@ -256,6 +256,7 @@ Known values:
     Python 3.14a1 3602 (Add LOAD_SPECIAL. Remove BEFORE_WITH and 
BEFORE_ASYNC_WITH)
     Python 3.14a1 3603 (Remove BUILD_CONST_KEY_MAP)
     Python 3.14a1 3604 (Do not duplicate test at end of while statements)
+    Python 3.14a1 3605 (Move ENTER_EXECUTOR to opcode 255)
 
     Python 3.15 will start with 3650
 
@@ -268,7 +269,7 @@ PC/launcher.c must also be updated.
 
 */
 
-#define PYC_MAGIC_NUMBER 3604
+#define PYC_MAGIC_NUMBER 3605
 /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
    (little-endian) and then appending b'\r\n'. */
 #define PYC_MAGIC_NUMBER_TOKEN \
diff --git a/Include/internal/pycore_opcode_metadata.h 
b/Include/internal/pycore_opcode_metadata.h
index d8e5034268b343..c056ff13c418db 100644
--- a/Include/internal/pycore_opcode_metadata.h
+++ b/Include/internal/pycore_opcode_metadata.h
@@ -1859,6 +1859,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
 #endif // NEED_OPCODE_METADATA
 
 #define EXTRA_CASES \
+    case 116: \
     case 117: \
     case 118: \
     case 119: \
@@ -1904,7 +1905,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
     case 233: \
     case 234: \
     case 235: \
-    case 255: \
         ;
 struct pseudo_targets {
     uint8_t targets[3];
diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h
index 54dd76158bf84d..3353e8011bb3ff 100644
--- a/Include/opcode_ids.h
+++ b/Include/opcode_ids.h
@@ -76,57 +76,56 @@ extern "C" {
 #define DELETE_NAME                             63
 #define DICT_MERGE                              64
 #define DICT_UPDATE                             65
-#define ENTER_EXECUTOR                          66
-#define EXTENDED_ARG                            67
-#define FOR_ITER                                68
-#define GET_AWAITABLE                           69
-#define IMPORT_FROM                             70
-#define IMPORT_NAME                             71
-#define IS_OP                                   72
-#define JUMP_BACKWARD                           73
-#define JUMP_BACKWARD_NO_INTERRUPT              74
-#define JUMP_FORWARD                            75
-#define LIST_APPEND                             76
-#define LIST_EXTEND                             77
-#define LOAD_ATTR                               78
-#define LOAD_COMMON_CONSTANT                    79
-#define LOAD_CONST                              80
-#define LOAD_DEREF                              81
-#define LOAD_FAST                               82
-#define LOAD_FAST_AND_CLEAR                     83
-#define LOAD_FAST_CHECK                         84
-#define LOAD_FAST_LOAD_FAST                     85
-#define LOAD_FROM_DICT_OR_DEREF                 86
-#define LOAD_FROM_DICT_OR_GLOBALS               87
-#define LOAD_GLOBAL                             88
-#define LOAD_NAME                               89
-#define LOAD_SPECIAL                            90
-#define LOAD_SUPER_ATTR                         91
-#define MAKE_CELL                               92
-#define MAP_ADD                                 93
-#define MATCH_CLASS                             94
-#define POP_JUMP_IF_FALSE                       95
-#define POP_JUMP_IF_NONE                        96
-#define POP_JUMP_IF_NOT_NONE                    97
-#define POP_JUMP_IF_TRUE                        98
-#define RAISE_VARARGS                           99
-#define RERAISE                                100
-#define RETURN_CONST                           101
-#define SEND                                   102
-#define SET_ADD                                103
-#define SET_FUNCTION_ATTRIBUTE                 104
-#define SET_UPDATE                             105
-#define STORE_ATTR                             106
-#define STORE_DEREF                            107
-#define STORE_FAST                             108
-#define STORE_FAST_LOAD_FAST                   109
-#define STORE_FAST_STORE_FAST                  110
-#define STORE_GLOBAL                           111
-#define STORE_NAME                             112
-#define SWAP                                   113
-#define UNPACK_EX                              114
-#define UNPACK_SEQUENCE                        115
-#define YIELD_VALUE                            116
+#define EXTENDED_ARG                            66
+#define FOR_ITER                                67
+#define GET_AWAITABLE                           68
+#define IMPORT_FROM                             69
+#define IMPORT_NAME                             70
+#define IS_OP                                   71
+#define JUMP_BACKWARD                           72
+#define JUMP_BACKWARD_NO_INTERRUPT              73
+#define JUMP_FORWARD                            74
+#define LIST_APPEND                             75
+#define LIST_EXTEND                             76
+#define LOAD_ATTR                               77
+#define LOAD_COMMON_CONSTANT                    78
+#define LOAD_CONST                              79
+#define LOAD_DEREF                              80
+#define LOAD_FAST                               81
+#define LOAD_FAST_AND_CLEAR                     82
+#define LOAD_FAST_CHECK                         83
+#define LOAD_FAST_LOAD_FAST                     84
+#define LOAD_FROM_DICT_OR_DEREF                 85
+#define LOAD_FROM_DICT_OR_GLOBALS               86
+#define LOAD_GLOBAL                             87
+#define LOAD_NAME                               88
+#define LOAD_SPECIAL                            89
+#define LOAD_SUPER_ATTR                         90
+#define MAKE_CELL                               91
+#define MAP_ADD                                 92
+#define MATCH_CLASS                             93
+#define POP_JUMP_IF_FALSE                       94
+#define POP_JUMP_IF_NONE                        95
+#define POP_JUMP_IF_NOT_NONE                    96
+#define POP_JUMP_IF_TRUE                        97
+#define RAISE_VARARGS                           98
+#define RERAISE                                 99
+#define RETURN_CONST                           100
+#define SEND                                   101
+#define SET_ADD                                102
+#define SET_FUNCTION_ATTRIBUTE                 103
+#define SET_UPDATE                             104
+#define STORE_ATTR                             105
+#define STORE_DEREF                            106
+#define STORE_FAST                             107
+#define STORE_FAST_LOAD_FAST                   108
+#define STORE_FAST_STORE_FAST                  109
+#define STORE_GLOBAL                           110
+#define STORE_NAME                             111
+#define SWAP                                   112
+#define UNPACK_EX                              113
+#define UNPACK_SEQUENCE                        114
+#define YIELD_VALUE                            115
 #define RESUME                                 149
 #define BINARY_OP_ADD_FLOAT                    150
 #define BINARY_OP_ADD_INT                      151
@@ -220,6 +219,7 @@ extern "C" {
 #define INSTRUMENTED_YIELD_VALUE               252
 #define INSTRUMENTED_CALL                      253
 #define INSTRUMENTED_LINE                      254
+#define ENTER_EXECUTOR                         255
 #define JUMP                                   256
 #define JUMP_NO_INTERRUPT                      257
 #define LOAD_CLOSURE                           258
@@ -230,6 +230,7 @@ extern "C" {
 #define STORE_FAST_MAYBE_NULL                  263
 
 #define HAVE_ARGUMENT                           41
+#define MIN_SPECIALIZED_OPCODE                 150
 #define MIN_INSTRUMENTED_OPCODE                236
 
 #ifdef __cplusplus
diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py
index 05ee1f29b58331..7c559f6190fc85 100644
--- a/Lib/_opcode_metadata.py
+++ b/Lib/_opcode_metadata.py
@@ -191,6 +191,7 @@
     'RESERVED': 17,
     'RESUME': 149,
     'INSTRUMENTED_LINE': 254,
+    'ENTER_EXECUTOR': 255,
     'BINARY_SLICE': 1,
     'BINARY_SUBSCR': 2,
     'CHECK_EG_MATCH': 4,
@@ -254,57 +255,56 @@
     'DELETE_NAME': 63,
     'DICT_MERGE': 64,
     'DICT_UPDATE': 65,
-    'ENTER_EXECUTOR': 66,
-    'EXTENDED_ARG': 67,
-    'FOR_ITER': 68,
-    'GET_AWAITABLE': 69,
-    'IMPORT_FROM': 70,
-    'IMPORT_NAME': 71,
-    'IS_OP': 72,
-    'JUMP_BACKWARD': 73,
-    'JUMP_BACKWARD_NO_INTERRUPT': 74,
-    'JUMP_FORWARD': 75,
-    'LIST_APPEND': 76,
-    'LIST_EXTEND': 77,
-    'LOAD_ATTR': 78,
-    'LOAD_COMMON_CONSTANT': 79,
-    'LOAD_CONST': 80,
-    'LOAD_DEREF': 81,
-    'LOAD_FAST': 82,
-    'LOAD_FAST_AND_CLEAR': 83,
-    'LOAD_FAST_CHECK': 84,
-    'LOAD_FAST_LOAD_FAST': 85,
-    'LOAD_FROM_DICT_OR_DEREF': 86,
-    'LOAD_FROM_DICT_OR_GLOBALS': 87,
-    'LOAD_GLOBAL': 88,
-    'LOAD_NAME': 89,
-    'LOAD_SPECIAL': 90,
-    'LOAD_SUPER_ATTR': 91,
-    'MAKE_CELL': 92,
-    'MAP_ADD': 93,
-    'MATCH_CLASS': 94,
-    'POP_JUMP_IF_FALSE': 95,
-    'POP_JUMP_IF_NONE': 96,
-    'POP_JUMP_IF_NOT_NONE': 97,
-    'POP_JUMP_IF_TRUE': 98,
-    'RAISE_VARARGS': 99,
-    'RERAISE': 100,
-    'RETURN_CONST': 101,
-    'SEND': 102,
-    'SET_ADD': 103,
-    'SET_FUNCTION_ATTRIBUTE': 104,
-    'SET_UPDATE': 105,
-    'STORE_ATTR': 106,
-    'STORE_DEREF': 107,
-    'STORE_FAST': 108,
-    'STORE_FAST_LOAD_FAST': 109,
-    'STORE_FAST_STORE_FAST': 110,
-    'STORE_GLOBAL': 111,
-    'STORE_NAME': 112,
-    'SWAP': 113,
-    'UNPACK_EX': 114,
-    'UNPACK_SEQUENCE': 115,
-    'YIELD_VALUE': 116,
+    'EXTENDED_ARG': 66,
+    'FOR_ITER': 67,
+    'GET_AWAITABLE': 68,
+    'IMPORT_FROM': 69,
+    'IMPORT_NAME': 70,
+    'IS_OP': 71,
+    'JUMP_BACKWARD': 72,
+    'JUMP_BACKWARD_NO_INTERRUPT': 73,
+    'JUMP_FORWARD': 74,
+    'LIST_APPEND': 75,
+    'LIST_EXTEND': 76,
+    'LOAD_ATTR': 77,
+    'LOAD_COMMON_CONSTANT': 78,
+    'LOAD_CONST': 79,
+    'LOAD_DEREF': 80,
+    'LOAD_FAST': 81,
+    'LOAD_FAST_AND_CLEAR': 82,
+    'LOAD_FAST_CHECK': 83,
+    'LOAD_FAST_LOAD_FAST': 84,
+    'LOAD_FROM_DICT_OR_DEREF': 85,
+    'LOAD_FROM_DICT_OR_GLOBALS': 86,
+    'LOAD_GLOBAL': 87,
+    'LOAD_NAME': 88,
+    'LOAD_SPECIAL': 89,
+    'LOAD_SUPER_ATTR': 90,
+    'MAKE_CELL': 91,
+    'MAP_ADD': 92,
+    'MATCH_CLASS': 93,
+    'POP_JUMP_IF_FALSE': 94,
+    'POP_JUMP_IF_NONE': 95,
+    'POP_JUMP_IF_NOT_NONE': 96,
+    'POP_JUMP_IF_TRUE': 97,
+    'RAISE_VARARGS': 98,
+    'RERAISE': 99,
+    'RETURN_CONST': 100,
+    'SEND': 101,
+    'SET_ADD': 102,
+    'SET_FUNCTION_ATTRIBUTE': 103,
+    'SET_UPDATE': 104,
+    'STORE_ATTR': 105,
+    'STORE_DEREF': 106,
+    'STORE_FAST': 107,
+    'STORE_FAST_LOAD_FAST': 108,
+    'STORE_FAST_STORE_FAST': 109,
+    'STORE_GLOBAL': 110,
+    'STORE_NAME': 111,
+    'SWAP': 112,
+    'UNPACK_EX': 113,
+    'UNPACK_SEQUENCE': 114,
+    'YIELD_VALUE': 115,
     'INSTRUMENTED_RESUME': 236,
     'INSTRUMENTED_END_FOR': 237,
     'INSTRUMENTED_END_SEND': 238,
diff --git a/Lib/test/test__opcode.py b/Lib/test/test__opcode.py
index 10f04b64dda40e..d5cf014d40daf8 100644
--- a/Lib/test/test__opcode.py
+++ b/Lib/test/test__opcode.py
@@ -17,7 +17,7 @@ def check_bool_function_result(self, func, ops, expected):
                 self.assertEqual(func(op), expected)
 
     def test_invalid_opcodes(self):
-        invalid = [-100, -1, 255, 512, 513, 1000]
+        invalid = [-100, -1, 512, 513, 1000]
         self.check_bool_function_result(_opcode.is_valid, invalid, False)
         self.check_bool_function_result(_opcode.has_arg, invalid, False)
         self.check_bool_function_result(_opcode.has_const, invalid, False)
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index a895642087dfa7..80f66c168bab60 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -1604,201 +1604,201 @@ def _prepare_test_cases():
 Instruction = dis.Instruction
 
 expected_opinfo_outer = [
-  Instruction(opname='MAKE_CELL', opcode=92, arg=0, argval='a', argrepr='a', 
offset=0, start_offset=0, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='MAKE_CELL', opcode=92, arg=1, argval='b', argrepr='b', 
offset=2, start_offset=2, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='MAKE_CELL', opcode=91, arg=0, argval='a', argrepr='a', 
offset=0, start_offset=0, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='MAKE_CELL', opcode=91, arg=1, argval='b', argrepr='b', 
offset=2, start_offset=2, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
   Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', 
offset=4, start_offset=4, starts_line=True, line_number=1, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=5, argval=(3, 4), 
argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='a', argrepr='a', 
offset=8, start_offset=8, starts_line=False, line_number=2, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=1, argval='b', argrepr='b', 
offset=10, start_offset=10, starts_line=False, line_number=2, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=5, argval=(3, 4), 
argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='a', argrepr='a', 
offset=8, start_offset=8, starts_line=False, line_number=2, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=1, argval='b', argrepr='b', 
offset=10, start_offset=10, starts_line=False, line_number=2, label=None, 
positions=None, cache_info=None),
   Instruction(opname='BUILD_TUPLE', opcode=48, arg=2, argval=2, argrepr='', 
offset=12, start_offset=12, starts_line=False, line_number=2, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=1, argval=code_object_f, 
argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, 
line_number=2, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=1, argval=code_object_f, 
argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, 
line_number=2, label=None, positions=None, cache_info=None),
   Instruction(opname='MAKE_FUNCTION', opcode=23, arg=None, argval=None, 
argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=104, arg=8, argval=8, 
argrepr='closure', offset=18, start_offset=18, starts_line=False, 
line_number=2, label=None, positions=None, cache_info=None),
-  Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=104, arg=1, argval=1, 
argrepr='defaults', offset=20, start_offset=20, starts_line=False, 
line_number=2, label=None, positions=None, cache_info=None),
-  Instruction(opname='STORE_FAST', opcode=108, arg=2, argval='f', argrepr='f', 
offset=22, start_offset=22, starts_line=False, line_number=2, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=1, argval='print', 
argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, 
line_number=7, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=0, argval='a', argrepr='a', 
offset=34, start_offset=34, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=1, argval='b', argrepr='b', 
offset=36, start_offset=36, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=2, argval='', argrepr="''", 
offset=38, start_offset=38, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=1, argrepr='1', 
offset=40, start_offset=40, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=103, arg=8, argval=8, 
argrepr='closure', offset=18, start_offset=18, starts_line=False, 
line_number=2, label=None, positions=None, cache_info=None),
+  Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=103, arg=1, argval=1, 
argrepr='defaults', offset=20, start_offset=20, starts_line=False, 
line_number=2, label=None, positions=None, cache_info=None),
+  Instruction(opname='STORE_FAST', opcode=107, arg=2, argval='f', argrepr='f', 
offset=22, start_offset=22, starts_line=False, line_number=2, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=1, argval='print', 
argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, 
line_number=7, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=0, argval='a', argrepr='a', 
offset=34, start_offset=34, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=1, argval='b', argrepr='b', 
offset=36, start_offset=36, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=2, argval='', argrepr="''", 
offset=38, start_offset=38, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=3, argval=1, argrepr='1', 
offset=40, start_offset=40, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
   Instruction(opname='BUILD_LIST', opcode=43, arg=0, argval=0, argrepr='', 
offset=42, start_offset=42, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
   Instruction(opname='BUILD_MAP', opcode=44, arg=0, argval=0, argrepr='', 
offset=44, start_offset=44, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=4, argval='Hello world!', 
argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, 
line_number=7, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=4, argval='Hello world!', 
argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, 
line_number=7, label=None, positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=7, argval=7, argrepr='', 
offset=48, start_offset=48, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=56, start_offset=56, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=2, argval='f', argrepr='f', 
offset=58, start_offset=58, starts_line=True, line_number=8, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=2, argval='f', argrepr='f', 
offset=58, start_offset=58, starts_line=True, line_number=8, label=None, 
positions=None, cache_info=None),
   Instruction(opname='RETURN_VALUE', opcode=33, arg=None, argval=None, 
argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, 
label=None, positions=None, cache_info=None),
 ]
 
 expected_opinfo_f = [
   Instruction(opname='COPY_FREE_VARS', opcode=58, arg=2, argval=2, argrepr='', 
offset=0, start_offset=0, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='MAKE_CELL', opcode=92, arg=0, argval='c', argrepr='c', 
offset=2, start_offset=2, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='MAKE_CELL', opcode=92, arg=1, argval='d', argrepr='d', 
offset=4, start_offset=4, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='MAKE_CELL', opcode=91, arg=0, argval='c', argrepr='c', 
offset=2, start_offset=2, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='MAKE_CELL', opcode=91, arg=1, argval='d', argrepr='d', 
offset=4, start_offset=4, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
   Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', 
offset=6, start_offset=6, starts_line=True, line_number=2, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=2, argval=(5, 6), 
argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=3, argval='a', argrepr='a', 
offset=10, start_offset=10, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=4, argval='b', argrepr='b', 
offset=12, start_offset=12, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='c', argrepr='c', 
offset=14, start_offset=14, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=1, argval='d', argrepr='d', 
offset=16, start_offset=16, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=2, argval=(5, 6), 
argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=3, argval='a', argrepr='a', 
offset=10, start_offset=10, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=4, argval='b', argrepr='b', 
offset=12, start_offset=12, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='c', argrepr='c', 
offset=14, start_offset=14, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=1, argval='d', argrepr='d', 
offset=16, start_offset=16, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
   Instruction(opname='BUILD_TUPLE', opcode=48, arg=4, argval=4, argrepr='', 
offset=18, start_offset=18, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=1, argval=code_object_inner, 
argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, 
line_number=3, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=1, argval=code_object_inner, 
argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, 
line_number=3, label=None, positions=None, cache_info=None),
   Instruction(opname='MAKE_FUNCTION', opcode=23, arg=None, argval=None, 
argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=104, arg=8, argval=8, 
argrepr='closure', offset=24, start_offset=24, starts_line=False, 
line_number=3, label=None, positions=None, cache_info=None),
-  Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=104, arg=1, argval=1, 
argrepr='defaults', offset=26, start_offset=26, starts_line=False, 
line_number=3, label=None, positions=None, cache_info=None),
-  Instruction(opname='STORE_FAST', opcode=108, arg=2, argval='inner', 
argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=1, argval='print', 
argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, 
line_number=5, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=3, argval='a', argrepr='a', 
offset=40, start_offset=40, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=4, argval='b', argrepr='b', 
offset=42, start_offset=42, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=0, argval='c', argrepr='c', 
offset=44, start_offset=44, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=1, argval='d', argrepr='d', 
offset=46, start_offset=46, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=103, arg=8, argval=8, 
argrepr='closure', offset=24, start_offset=24, starts_line=False, 
line_number=3, label=None, positions=None, cache_info=None),
+  Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=103, arg=1, argval=1, 
argrepr='defaults', offset=26, start_offset=26, starts_line=False, 
line_number=3, label=None, positions=None, cache_info=None),
+  Instruction(opname='STORE_FAST', opcode=107, arg=2, argval='inner', 
argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=1, argval='print', 
argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, 
line_number=5, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=3, argval='a', argrepr='a', 
offset=40, start_offset=40, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=4, argval='b', argrepr='b', 
offset=42, start_offset=42, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=0, argval='c', argrepr='c', 
offset=44, start_offset=44, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=1, argval='d', argrepr='d', 
offset=46, start_offset=46, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=4, argval=4, argrepr='', 
offset=48, start_offset=48, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=56, start_offset=56, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=2, argval='inner', 
argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=2, argval='inner', 
argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, 
label=None, positions=None, cache_info=None),
   Instruction(opname='RETURN_VALUE', opcode=33, arg=None, argval=None, 
argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, 
label=None, positions=None, cache_info=None),
 ]
 
 expected_opinfo_inner = [
   Instruction(opname='COPY_FREE_VARS', opcode=58, arg=4, argval=4, argrepr='', 
offset=0, start_offset=0, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
   Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', 
offset=2, start_offset=2, starts_line=True, line_number=3, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=1, argval='print', 
argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, 
line_number=4, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=2, argval='a', argrepr='a', 
offset=14, start_offset=14, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=3, argval='b', argrepr='b', 
offset=16, start_offset=16, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=4, argval='c', argrepr='c', 
offset=18, start_offset=18, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_DEREF', opcode=81, arg=5, argval='d', argrepr='d', 
offset=20, start_offset=20, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=85, arg=1, argval=('e', 
'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, 
line_number=4, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=1, argval='print', 
argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, 
line_number=4, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=2, argval='a', argrepr='a', 
offset=14, start_offset=14, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=3, argval='b', argrepr='b', 
offset=16, start_offset=16, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=4, argval='c', argrepr='c', 
offset=18, start_offset=18, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_DEREF', opcode=80, arg=5, argval='d', argrepr='d', 
offset=20, start_offset=20, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=84, arg=1, argval=('e', 
'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, 
line_number=4, label=None, positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=6, argval=6, argrepr='', 
offset=24, start_offset=24, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=32, start_offset=32, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='RETURN_CONST', opcode=101, arg=0, argval=None, 
argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='RETURN_CONST', opcode=100, arg=0, argval=None, 
argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, 
label=None, positions=None, cache_info=None),
 ]
 
 expected_opinfo_jumpy = [
   Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', 
offset=0, start_offset=0, starts_line=True, line_number=1, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=1, argval='range', 
argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, 
line_number=3, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=1, argval=10, argrepr='10', 
offset=12, start_offset=12, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=1, argval='range', 
argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, 
line_number=3, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=1, argval=10, argrepr='10', 
offset=12, start_offset=12, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=14, start_offset=14, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='GET_ITER', opcode=16, arg=None, argval=None, argrepr='', 
offset=22, start_offset=22, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='FOR_ITER', opcode=68, arg=30, argval=88, argrepr='to 
L4', offset=24, start_offset=24, starts_line=False, line_number=3, label=1, 
positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
-  Instruction(opname='STORE_FAST', opcode=108, arg=0, argval='i', argrepr='i', 
offset=28, start_offset=28, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, 
line_number=4, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=40, start_offset=40, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='FOR_ITER', opcode=67, arg=30, argval=88, argrepr='to 
L4', offset=24, start_offset=24, starts_line=False, line_number=3, label=1, 
positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+  Instruction(opname='STORE_FAST', opcode=107, arg=0, argval='i', argrepr='i', 
offset=28, start_offset=28, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=3, argval='print', 
argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, 
line_number=4, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='i', argrepr='i', 
offset=40, start_offset=40, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=42, start_offset=42, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=50, start_offset=50, starts_line=False, line_number=4, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=52, start_offset=52, starts_line=True, line_number=5, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=2, argval=4, argrepr='4', 
offset=54, start_offset=54, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='i', argrepr='i', 
offset=52, start_offset=52, starts_line=True, line_number=5, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=2, argval=4, argrepr='4', 
offset=54, start_offset=54, starts_line=False, line_number=5, label=None, 
positions=None, cache_info=None),
   Instruction(opname='COMPARE_OP', opcode=54, arg=18, argval='<', 
argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, 
line_number=5, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=2, argval=68, 
argrepr='to L2', offset=60, start_offset=60, starts_line=False, line_number=5, 
label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
-  Instruction(opname='JUMP_BACKWARD', opcode=73, arg=22, argval=24, 
argrepr='to L1', offset=64, start_offset=64, starts_line=True, line_number=6, 
label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=68, start_offset=68, starts_line=True, line_number=7, label=2, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=6, argrepr='6', 
offset=70, start_offset=70, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_JUMP_IF_FALSE', opcode=94, arg=2, argval=68, 
argrepr='to L2', offset=60, start_offset=60, starts_line=False, line_number=5, 
label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+  Instruction(opname='JUMP_BACKWARD', opcode=72, arg=22, argval=24, 
argrepr='to L1', offset=64, start_offset=64, starts_line=True, line_number=6, 
label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='i', argrepr='i', 
offset=68, start_offset=68, starts_line=True, line_number=7, label=2, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=3, argval=6, argrepr='6', 
offset=70, start_offset=70, starts_line=False, line_number=7, label=None, 
positions=None, cache_info=None),
   Instruction(opname='COMPARE_OP', opcode=54, arg=148, argval='>', 
argrepr='bool(>)', offset=72, start_offset=72, starts_line=False, 
line_number=7, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_TRUE', opcode=98, arg=2, argval=84, 
argrepr='to L3', offset=76, start_offset=76, starts_line=False, line_number=7, 
label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
-  Instruction(opname='JUMP_BACKWARD', opcode=73, arg=30, argval=24, 
argrepr='to L1', offset=80, start_offset=80, starts_line=False, line_number=7, 
label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+  Instruction(opname='POP_JUMP_IF_TRUE', opcode=97, arg=2, argval=84, 
argrepr='to L3', offset=76, start_offset=76, starts_line=False, line_number=7, 
label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+  Instruction(opname='JUMP_BACKWARD', opcode=72, arg=30, argval=24, 
argrepr='to L1', offset=80, start_offset=80, starts_line=False, line_number=7, 
label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=84, start_offset=84, starts_line=True, line_number=8, label=3, 
positions=None, cache_info=None),
-  Instruction(opname='JUMP_FORWARD', opcode=75, arg=13, argval=114, 
argrepr='to L5', offset=86, start_offset=86, starts_line=False, line_number=8, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='JUMP_FORWARD', opcode=74, arg=13, argval=114, 
argrepr='to L5', offset=86, start_offset=86, starts_line=False, line_number=8, 
label=None, positions=None, cache_info=None),
   Instruction(opname='END_FOR', opcode=9, arg=None, argval=None, argrepr='', 
offset=88, start_offset=88, starts_line=True, line_number=3, label=4, 
positions=None, cache_info=None),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=90, start_offset=90, starts_line=False, line_number=3, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=92, start_offset=92, starts_line=True, 
line_number=10, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=4, argval='I can haz else 
clause?', argrepr="'I can haz else clause?'", offset=102, start_offset=102, 
starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=3, argval='print', 
argrepr='print + NULL', offset=92, start_offset=92, starts_line=True, 
line_number=10, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=4, argval='I can haz else 
clause?', argrepr="'I can haz else clause?'", offset=102, start_offset=102, 
starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=104, start_offset=104, starts_line=False, line_number=10, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=112, start_offset=112, starts_line=False, line_number=10, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST_CHECK', opcode=84, arg=0, argval='i', 
argrepr='i', offset=114, start_offset=114, starts_line=True, line_number=11, 
label=5, positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST_CHECK', opcode=83, arg=0, argval='i', 
argrepr='i', offset=114, start_offset=114, starts_line=True, line_number=11, 
label=5, positions=None, cache_info=None),
   Instruction(opname='TO_BOOL', opcode=37, arg=None, argval=None, argrepr='', 
offset=116, start_offset=116, starts_line=False, line_number=11, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=33, argval=194, 
argrepr='to L8', offset=124, start_offset=124, starts_line=False, 
line_number=11, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=128, start_offset=128, starts_line=True, 
line_number=12, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=138, start_offset=138, starts_line=False, line_number=12, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_JUMP_IF_FALSE', opcode=94, arg=33, argval=194, 
argrepr='to L8', offset=124, start_offset=124, starts_line=False, 
line_number=11, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=3, argval='print', 
argrepr='print + NULL', offset=128, start_offset=128, starts_line=True, 
line_number=12, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='i', argrepr='i', 
offset=138, start_offset=138, starts_line=False, line_number=12, label=None, 
positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=140, start_offset=140, starts_line=False, line_number=12, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=148, start_offset=148, starts_line=False, line_number=12, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=150, start_offset=150, starts_line=True, line_number=13, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=5, argval=1, argrepr='1', 
offset=152, start_offset=152, starts_line=False, line_number=13, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='i', argrepr='i', 
offset=150, start_offset=150, starts_line=True, line_number=13, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=5, argval=1, argrepr='1', 
offset=152, start_offset=152, starts_line=False, line_number=13, label=None, 
positions=None, cache_info=None),
   Instruction(opname='BINARY_OP', opcode=42, arg=23, argval=23, argrepr='-=', 
offset=154, start_offset=154, starts_line=False, line_number=13, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
-  Instruction(opname='STORE_FAST', opcode=108, arg=0, argval='i', argrepr='i', 
offset=158, start_offset=158, starts_line=False, line_number=13, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=160, start_offset=160, starts_line=True, line_number=14, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=6, argrepr='6', 
offset=162, start_offset=162, starts_line=False, line_number=14, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='STORE_FAST', opcode=107, arg=0, argval='i', argrepr='i', 
offset=158, start_offset=158, starts_line=False, line_number=13, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='i', argrepr='i', 
offset=160, start_offset=160, starts_line=True, line_number=14, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=3, argval=6, argrepr='6', 
offset=162, start_offset=162, starts_line=False, line_number=14, label=None, 
positions=None, cache_info=None),
   Instruction(opname='COMPARE_OP', opcode=54, arg=148, argval='>', 
argrepr='bool(>)', offset=164, start_offset=164, starts_line=False, 
line_number=14, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=2, argval=176, 
argrepr='to L6', offset=168, start_offset=168, starts_line=False, 
line_number=14, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='JUMP_BACKWARD', opcode=73, arg=31, argval=114, 
argrepr='to L5', offset=172, start_offset=172, starts_line=True, 
line_number=15, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=176, start_offset=176, starts_line=True, line_number=16, label=6, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=2, argval=4, argrepr='4', 
offset=178, start_offset=178, starts_line=False, line_number=16, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_JUMP_IF_FALSE', opcode=94, arg=2, argval=176, 
argrepr='to L6', offset=168, start_offset=168, starts_line=False, 
line_number=14, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='JUMP_BACKWARD', opcode=72, arg=31, argval=114, 
argrepr='to L5', offset=172, start_offset=172, starts_line=True, 
line_number=15, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='i', argrepr='i', 
offset=176, start_offset=176, starts_line=True, line_number=16, label=6, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=2, argval=4, argrepr='4', 
offset=178, start_offset=178, starts_line=False, line_number=16, label=None, 
positions=None, cache_info=None),
   Instruction(opname='COMPARE_OP', opcode=54, arg=18, argval='<', 
argrepr='bool(<)', offset=180, start_offset=180, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_TRUE', opcode=98, arg=2, argval=192, 
argrepr='to L7', offset=184, start_offset=184, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='JUMP_BACKWARD', opcode=73, arg=39, argval=114, 
argrepr='to L5', offset=188, start_offset=188, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='JUMP_FORWARD', opcode=75, arg=11, argval=216, 
argrepr='to L9', offset=192, start_offset=192, starts_line=True, 
line_number=17, label=7, positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=194, start_offset=194, starts_line=True, 
line_number=19, label=8, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=6, argval='Who let lolcatz 
into this test suite?', argrepr="'Who let lolcatz into this test suite?'", 
offset=204, start_offset=204, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_JUMP_IF_TRUE', opcode=97, arg=2, argval=192, 
argrepr='to L7', offset=184, start_offset=184, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='JUMP_BACKWARD', opcode=72, arg=39, argval=114, 
argrepr='to L5', offset=188, start_offset=188, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='JUMP_FORWARD', opcode=74, arg=11, argval=216, 
argrepr='to L9', offset=192, start_offset=192, starts_line=True, 
line_number=17, label=7, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=3, argval='print', 
argrepr='print + NULL', offset=194, start_offset=194, starts_line=True, 
line_number=19, label=8, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=6, argval='Who let lolcatz 
into this test suite?', argrepr="'Who let lolcatz into this test suite?'", 
offset=204, start_offset=204, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=206, start_offset=206, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=214, start_offset=214, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=None),
   Instruction(opname='NOP', opcode=27, arg=None, argval=None, argrepr='', 
offset=216, start_offset=216, starts_line=True, line_number=20, label=9, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=5, argval=1, argrepr='1', 
offset=218, start_offset=218, starts_line=True, line_number=21, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=7, argval=0, argrepr='0', 
offset=220, start_offset=220, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=5, argval=1, argrepr='1', 
offset=218, start_offset=218, starts_line=True, line_number=21, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=7, argval=0, argrepr='0', 
offset=220, start_offset=220, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=None),
   Instruction(opname='BINARY_OP', opcode=42, arg=11, argval=11, argrepr='/', 
offset=222, start_offset=222, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=226, start_offset=226, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=228, start_offset=228, starts_line=True, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=81, arg=0, argval='i', argrepr='i', 
offset=228, start_offset=228, starts_line=True, line_number=25, label=None, 
positions=None, cache_info=None),
   Instruction(opname='COPY', opcode=57, arg=1, argval=1, argrepr='', 
offset=230, start_offset=230, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_SPECIAL', opcode=90, arg=1, argval=1, 
argrepr='__exit__', offset=232, start_offset=232, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='SWAP', opcode=113, arg=2, argval=2, argrepr='', 
offset=234, start_offset=234, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='SWAP', opcode=113, arg=3, argval=3, argrepr='', 
offset=236, start_offset=236, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_SPECIAL', opcode=90, arg=0, argval=0, 
argrepr='__enter__', offset=238, start_offset=238, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_SPECIAL', opcode=89, arg=1, argval=1, 
argrepr='__exit__', offset=232, start_offset=232, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='SWAP', opcode=112, arg=2, argval=2, argrepr='', 
offset=234, start_offset=234, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='SWAP', opcode=112, arg=3, argval=3, argrepr='', 
offset=236, start_offset=236, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_SPECIAL', opcode=89, arg=0, argval=0, 
argrepr='__enter__', offset=238, start_offset=238, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=0, argval=0, argrepr='', 
offset=240, start_offset=240, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='STORE_FAST', opcode=108, arg=1, argval='dodgy', 
argrepr='dodgy', offset=248, start_offset=248, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=250, start_offset=250, starts_line=True, 
line_number=26, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=8, argval='Never reach 
this', argrepr="'Never reach this'", offset=260, start_offset=260, 
starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
+  Instruction(opname='STORE_FAST', opcode=107, arg=1, argval='dodgy', 
argrepr='dodgy', offset=248, start_offset=248, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=3, argval='print', 
argrepr='print + NULL', offset=250, start_offset=250, starts_line=True, 
line_number=26, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=8, argval='Never reach 
this', argrepr="'Never reach this'", offset=260, start_offset=260, 
starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=262, start_offset=262, starts_line=False, line_number=26, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=270, start_offset=270, starts_line=False, line_number=26, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=272, start_offset=272, starts_line=True, line_number=25, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=274, start_offset=274, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=276, start_offset=276, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=0, argval=None, 
argrepr='None', offset=272, start_offset=272, starts_line=True, line_number=25, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=0, argval=None, 
argrepr='None', offset=274, start_offset=274, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=0, argval=None, 
argrepr='None', offset=276, start_offset=276, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=3, argval=3, argrepr='', 
offset=278, start_offset=278, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=286, start_offset=286, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=288, start_offset=288, starts_line=True, 
line_number=28, label=10, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=10, argval="OK, now we're 
done", argrepr='"OK, now we\'re done"', offset=298, start_offset=298, 
starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=3, argval='print', 
argrepr='print + NULL', offset=288, start_offset=288, starts_line=True, 
line_number=28, label=10, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=10, argval="OK, now we're 
done", argrepr='"OK, now we\'re done"', offset=298, start_offset=298, 
starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=300, start_offset=300, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=308, start_offset=308, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='RETURN_CONST', opcode=101, arg=0, argval=None, 
argrepr='None', offset=310, start_offset=310, starts_line=False, 
line_number=28, label=None, positions=None, cache_info=None),
+  Instruction(opname='RETURN_CONST', opcode=100, arg=0, argval=None, 
argrepr='None', offset=310, start_offset=310, starts_line=False, 
line_number=28, label=None, positions=None, cache_info=None),
   Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=312, start_offset=312, starts_line=True, line_number=25, 
label=None, positions=None, cache_info=None),
   Instruction(opname='WITH_EXCEPT_START', opcode=41, arg=None, argval=None, 
argrepr='', offset=314, start_offset=314, starts_line=False, line_number=25, 
label=None, positions=None, cache_info=None),
   Instruction(opname='TO_BOOL', opcode=37, arg=None, argval=None, argrepr='', 
offset=316, start_offset=316, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_TRUE', opcode=98, arg=1, argval=330, 
argrepr='to L11', offset=324, start_offset=324, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='RERAISE', opcode=100, arg=2, argval=2, argrepr='', 
offset=328, start_offset=328, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_JUMP_IF_TRUE', opcode=97, arg=1, argval=330, 
argrepr='to L11', offset=324, start_offset=324, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='RERAISE', opcode=99, arg=2, argval=2, argrepr='', 
offset=328, start_offset=328, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=330, start_offset=330, starts_line=False, line_number=25, label=11, 
positions=None, cache_info=None),
   Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=332, start_offset=332, starts_line=False, line_number=25, 
label=None, positions=None, cache_info=None),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=334, start_offset=334, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=336, start_offset=336, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=338, start_offset=338, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=74, arg=27, 
argval=288, argrepr='to L10', offset=340, start_offset=340, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=73, arg=27, 
argval=288, argrepr='to L10', offset=340, start_offset=340, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
   Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=342, start_offset=342, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
   Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=344, start_offset=344, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=346, start_offset=346, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=99, arg=1, argval=1, argrepr='', 
offset=346, start_offset=346, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
   Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=348, start_offset=348, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=4, 
argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=350, 
start_offset=350, starts_line=True, line_number=22, label=None, positions=None, 
cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), 
('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, 
b'\x00\x00')]),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=4, 
argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=350, 
start_offset=350, starts_line=True, line_number=22, label=None, positions=None, 
cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), 
('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, 
b'\x00\x00')]),
   Instruction(opname='CHECK_EXC_MATCH', opcode=5, arg=None, argval=None, 
argrepr='', offset=360, start_offset=360, starts_line=False, line_number=22, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=14, argval=394, 
argrepr='to L12', offset=362, start_offset=362, starts_line=False, 
line_number=22, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='POP_JUMP_IF_FALSE', opcode=94, arg=14, argval=394, 
argrepr='to L12', offset=362, start_offset=362, starts_line=False, 
line_number=22, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=366, start_offset=366, starts_line=False, line_number=22, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=368, start_offset=368, starts_line=True, 
line_number=23, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=9, argval='Here we go, here 
we go, here we go...', argrepr="'Here we go, here we go, here we go...'", 
offset=378, start_offset=378, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=3, argval='print', 
argrepr='print + NULL', offset=368, start_offset=368, starts_line=True, 
line_number=23, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=9, argval='Here we go, here 
we go, here we go...', argrepr="'Here we go, here we go, here we go...'", 
offset=378, start_offset=378, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=380, start_offset=380, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=388, start_offset=388, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=None),
   Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=390, start_offset=390, starts_line=False, line_number=23, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=74, arg=53, 
argval=288, argrepr='to L10', offset=392, start_offset=392, starts_line=False, 
line_number=23, label=None, positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=0, argval=0, argrepr='', 
offset=394, start_offset=394, starts_line=True, line_number=22, label=12, 
positions=None, cache_info=None),
+  Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=73, arg=53, 
argval=288, argrepr='to L10', offset=392, start_offset=392, starts_line=False, 
line_number=23, label=None, positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=99, arg=0, argval=0, argrepr='', 
offset=394, start_offset=394, starts_line=True, line_number=22, label=12, 
positions=None, cache_info=None),
   Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=396, start_offset=396, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
   Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=398, start_offset=398, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=400, start_offset=400, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=99, arg=1, argval=1, argrepr='', 
offset=400, start_offset=400, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
   Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=402, start_offset=402, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=404, start_offset=404, starts_line=True, 
line_number=28, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=10, argval="OK, now we're 
done", argrepr='"OK, now we\'re done"', offset=414, start_offset=414, 
starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=87, arg=3, argval='print', 
argrepr='print + NULL', offset=404, start_offset=404, starts_line=True, 
line_number=28, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=79, arg=10, argval="OK, now we're 
done", argrepr='"OK, now we\'re done"', offset=414, start_offset=414, 
starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=416, start_offset=416, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=424, start_offset=424, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=0, argval=0, argrepr='', 
offset=426, start_offset=426, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=99, arg=0, argval=0, argrepr='', 
offset=426, start_offset=426, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
   Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=428, start_offset=428, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
   Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=430, start_offset=430, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=432, start_offset=432, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=99, arg=1, argval=1, argrepr='', 
offset=432, start_offset=432, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
 ]
 
 # One last piece of inspect fodder to check the default line number handling
 def simple(): pass
 expected_opinfo_simple = [
   Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', 
offset=0, start_offset=0, starts_line=True, 
line_number=simple.__code__.co_firstlineno, label=None, positions=None),
-  Instruction(opname='RETURN_CONST', opcode=101, arg=0, argval=None, 
argrepr='None', offset=2, start_offset=2, starts_line=False, 
line_number=simple.__code__.co_firstlineno, label=None),
+  Instruction(opname='RETURN_CONST', opcode=100, arg=0, argval=None, 
argrepr='None', offset=2, start_offset=2, starts_line=False, 
line_number=simple.__code__.co_firstlineno, label=None),
 ]
 
 
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index 6423a4214bfa9c..ef24b51b961eeb 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -1630,15 +1630,10 @@ deopt_code(PyCodeObject *code, _Py_CODEUNIT 
*instructions)
 {
     Py_ssize_t len = Py_SIZE(code);
     for (int i = 0; i < len; i++) {
-        int opcode = _Py_GetBaseOpcode(code, i);
-        if (opcode == ENTER_EXECUTOR) {
-            _PyExecutorObject *exec = 
code->co_executors->executors[instructions[i].op.arg];
-            opcode = _PyOpcode_Deopt[exec->vm_data.opcode];
-            instructions[i].op.arg = exec->vm_data.oparg;
-        }
-        assert(opcode != ENTER_EXECUTOR);
-        int caches = _PyOpcode_Caches[opcode];
-        instructions[i].op.code = opcode;
+        _Py_CODEUNIT inst = _Py_GetBaseCodeUnit(code, i);
+        assert(inst.op.code < MIN_SPECIALIZED_OPCODE);
+        int caches = _PyOpcode_Caches[inst.op.code];
+        instructions[i] = inst;
         for (int j = 1; j <= caches; j++) {
             instructions[i+j].cache = 0;
         }
@@ -1940,33 +1935,12 @@ code_richcompare(PyObject *self, PyObject *other, int 
op)
         goto unequal;
     }
     for (int i = 0; i < Py_SIZE(co); i++) {
-        _Py_CODEUNIT co_instr = _PyCode_CODE(co)[i];
-        _Py_CODEUNIT cp_instr = _PyCode_CODE(cp)[i];
-        uint8_t co_code = _Py_GetBaseOpcode(co, i);
-        uint8_t co_arg = co_instr.op.arg;
-        uint8_t cp_code = _Py_GetBaseOpcode(cp, i);
-        uint8_t cp_arg = cp_instr.op.arg;
-
-        if (co_code == ENTER_EXECUTOR) {
-            const int exec_index = co_arg;
-            _PyExecutorObject *exec = co->co_executors->executors[exec_index];
-            co_code = _PyOpcode_Deopt[exec->vm_data.opcode];
-            co_arg = exec->vm_data.oparg;
-        }
-        assert(co_code != ENTER_EXECUTOR);
-
-        if (cp_code == ENTER_EXECUTOR) {
-            const int exec_index = cp_arg;
-            _PyExecutorObject *exec = cp->co_executors->executors[exec_index];
-            cp_code = _PyOpcode_Deopt[exec->vm_data.opcode];
-            cp_arg = exec->vm_data.oparg;
-        }
-        assert(cp_code != ENTER_EXECUTOR);
-
-        if (co_code != cp_code || co_arg != cp_arg) {
+        _Py_CODEUNIT co_instr = _Py_GetBaseCodeUnit(co, i);
+        _Py_CODEUNIT cp_instr = _Py_GetBaseCodeUnit(cp, i);
+        if (co_instr.cache != cp_instr.cache) {
             goto unequal;
         }
-        i += _PyOpcode_Caches[co_code];
+        i += _PyOpcode_Caches[co_instr.op.code];
     }
 
     /* compare constants */
@@ -2045,22 +2019,10 @@ code_hash(PyCodeObject *co)
     SCRAMBLE_IN(co->co_firstlineno);
     SCRAMBLE_IN(Py_SIZE(co));
     for (int i = 0; i < Py_SIZE(co); i++) {
-        _Py_CODEUNIT co_instr = _PyCode_CODE(co)[i];
-        uint8_t co_code = co_instr.op.code;
-        uint8_t co_arg = co_instr.op.arg;
-        if (co_code == ENTER_EXECUTOR) {
-            _PyExecutorObject *exec = co->co_executors->executors[co_arg];
-            assert(exec != NULL);
-            assert(exec->vm_data.opcode != ENTER_EXECUTOR);
-            co_code = _PyOpcode_Deopt[exec->vm_data.opcode];
-            co_arg = exec->vm_data.oparg;
-        }
-        else {
-            co_code = _Py_GetBaseOpcode(co, i);
-        }
-        SCRAMBLE_IN(co_code);
-        SCRAMBLE_IN(co_arg);
-        i += _PyOpcode_Caches[co_code];
+        _Py_CODEUNIT co_instr = _Py_GetBaseCodeUnit(co, i);
+        SCRAMBLE_IN(co_instr.op.code);
+        SCRAMBLE_IN(co_instr.op.arg);
+        i += _PyOpcode_Caches[co_instr.op.code];
     }
     if ((Py_hash_t)uhash == -1) {
         return -2;
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 4e77780eb39097..621f8996ccbb8e 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -1060,9 +1060,7 @@ mark_stacks(PyCodeObject *code_obj, int len)
     if (co_code == NULL) {
         return NULL;
     }
-    _Py_CODEUNIT *code = (_Py_CODEUNIT *)PyBytes_AS_STRING(co_code);
     int64_t *stacks = PyMem_New(int64_t, len+1);
-    int i, j, opcode;
 
     if (stacks == NULL) {
         PyErr_NoMemory();
@@ -1077,22 +1075,25 @@ mark_stacks(PyCodeObject *code_obj, int len)
     while (todo) {
         todo = 0;
         /* Scan instructions */
-        for (i = 0; i < len;) {
+        for (int i = 0; i < len;) {
+            int j;
             int64_t next_stack = stacks[i];
-            opcode = _Py_GetBaseOpcode(code_obj, i);
+            _Py_CODEUNIT inst = _Py_GetBaseCodeUnit(code_obj, i);
+            int opcode = inst.op.code;
             int oparg = 0;
             while (opcode == EXTENDED_ARG) {
-                oparg = (oparg << 8) | code[i].op.arg;
+                oparg = (oparg << 8) | inst.op.arg;
                 i++;
-                opcode = _Py_GetBaseOpcode(code_obj, i);
+                inst = _Py_GetBaseCodeUnit(code_obj, i);
+                opcode = inst.op.code;
                 stacks[i] = next_stack;
             }
+            oparg = (oparg << 8) | inst.op.arg;
             int next_i = i + _PyOpcode_Caches[opcode] + 1;
             if (next_stack == UNINITIALIZED) {
                 i = next_i;
                 continue;
             }
-            oparg = (oparg << 8) | code[i].op.arg;
             switch (opcode) {
                 case POP_JUMP_IF_FALSE:
                 case POP_JUMP_IF_TRUE:
@@ -1100,7 +1101,7 @@ mark_stacks(PyCodeObject *code_obj, int len)
                 case POP_JUMP_IF_NOT_NONE:
                 {
                     int64_t target_stack;
-                    int j = next_i + oparg;
+                    j = next_i + oparg;
                     assert(j < len);
                     next_stack = pop_value(next_stack);
                     target_stack = next_stack;
diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h
index 22354c9bbf8a35..624d9c0b653ad7 100644
--- a/Programs/test_frozenmain.h
+++ b/Programs/test_frozenmain.h
@@ -1,17 +1,17 @@
 // Auto-generated by Programs/freeze_test_frozenmain.py
 unsigned char M_test_frozenmain[] = {
     227,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,
-    0,0,0,0,0,243,166,0,0,0,149,0,80,0,80,1,
-    71,0,112,0,80,0,80,1,71,1,112,1,89,2,31,0,
-    80,2,49,1,0,0,0,0,0,0,29,0,89,2,31,0,
-    80,3,89,0,78,6,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,243,166,0,0,0,149,0,79,0,79,1,
+    70,0,111,0,79,0,79,1,70,1,111,1,88,2,31,0,
+    79,2,49,1,0,0,0,0,0,0,29,0,88,2,31,0,
+    79,3,88,0,77,6,0,0,0,0,0,0,0,0,0,0,
     0,0,0,0,0,0,0,0,49,2,0,0,0,0,0,0,
-    29,0,89,1,78,8,0,0,0,0,0,0,0,0,0,0,
+    29,0,88,1,77,8,0,0,0,0,0,0,0,0,0,0,
     0,0,0,0,0,0,0,0,31,0,49,0,0,0,0,0,
-    0,0,80,4,2,0,0,0,112,5,80,5,16,0,68,20,
-    0,0,112,6,89,2,31,0,80,6,89,6,12,0,80,7,
-    89,5,89,6,2,0,0,0,12,0,47,4,49,1,0,0,
-    0,0,0,0,29,0,73,22,0,0,9,0,29,0,101,1,
+    0,0,79,4,2,0,0,0,111,5,79,5,16,0,67,20,
+    0,0,111,6,88,2,31,0,79,6,88,6,12,0,79,7,
+    88,5,88,6,2,0,0,0,12,0,47,4,49,1,0,0,
+    0,0,0,0,29,0,72,22,0,0,9,0,29,0,100,1,
     41,8,233,0,0,0,0,78,122,18,70,114,111,122,101,110,
     32,72,101,108,108,111,32,87,111,114,108,100,122,8,115,121,
     115,46,97,114,103,118,218,6,99,111,110,102,105,103,41,5,
diff --git a/Python/instrumentation.c b/Python/instrumentation.c
index 3481b5df14288b..5e51a9c992f6c2 100644
--- a/Python/instrumentation.c
+++ b/Python/instrumentation.c
@@ -165,6 +165,7 @@ is_instrumented(int opcode)
 {
     assert(opcode != 0);
     assert(opcode != RESERVED);
+    assert(opcode != ENTER_EXECUTOR);
     return opcode >= MIN_INSTRUMENTED_OPCODE;
 }
 
@@ -330,13 +331,12 @@ _PyInstruction_GetLength(PyCodeObject *code, int offset)
         opcode = _PyOpcode_Deopt[opcode];
     }
     assert(opcode != 0);
-    assert(!is_instrumented(opcode));
     if (opcode == ENTER_EXECUTOR) {
         int exec_index = _PyCode_CODE(code)[offset].op.arg;
         _PyExecutorObject *exec = code->co_executors->executors[exec_index];
         opcode = _PyOpcode_Deopt[exec->vm_data.opcode];
-
     }
+    assert(!is_instrumented(opcode));
     assert(opcode != ENTER_EXECUTOR);
     assert(opcode == _PyOpcode_Deopt[opcode]);
     return 1 + _PyOpcode_Caches[opcode];
@@ -507,7 +507,7 @@ sanity_check_instrumentation(PyCodeObject *code)
     for (int i = 0; i < code_len;) {
         _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i];
         int opcode = instr->op.code;
-        int base_opcode = _Py_GetBaseOpcode(code, i);
+        int base_opcode = _Py_GetBaseCodeUnit(code, offset).op.code;
         CHECK(valid_opcode(opcode));
         CHECK(valid_opcode(base_opcode));
         if (opcode == INSTRUMENTED_INSTRUCTION) {
@@ -579,10 +579,26 @@ sanity_check_instrumentation(PyCodeObject *code)
 
 #endif
 
-/* Get the underlying opcode, stripping instrumentation */
-int _Py_GetBaseOpcode(PyCodeObject *code, int i)
+/* Get the underlying code unit, stripping instrumentation and ENTER_EXECUTOR 
*/
+_Py_CODEUNIT
+_Py_GetBaseCodeUnit(PyCodeObject *code, int i)
 {
-    int opcode = _PyCode_CODE(code)[i].op.code;
+    _Py_CODEUNIT inst = _PyCode_CODE(code)[i];
+    int opcode = inst.op.code;
+    if (opcode < MIN_INSTRUMENTED_OPCODE) {
+        inst.op.code = _PyOpcode_Deopt[opcode];
+        assert(inst.op.code <= RESUME);
+        return inst;
+    }
+    if (opcode == ENTER_EXECUTOR) {
+        _PyExecutorObject *exec = code->co_executors->executors[inst.op.arg];
+        opcode = _PyOpcode_Deopt[exec->vm_data.opcode];
+        inst.op.code = opcode;
+        assert(opcode <= RESUME);
+        inst.op.arg = exec->vm_data.oparg;
+        assert(inst.op.code <= RESUME);
+        return inst;
+    }
     if (opcode == INSTRUMENTED_LINE) {
         opcode = code->_co_monitoring->lines[i].original_opcode;
     }
@@ -593,9 +609,13 @@ int _Py_GetBaseOpcode(PyCodeObject *code, int i)
     CHECK(opcode != INSTRUMENTED_LINE);
     int deinstrumented = DE_INSTRUMENT[opcode];
     if (deinstrumented) {
-        return deinstrumented;
+        inst.op.code = deinstrumented;
     }
-    return _PyOpcode_Deopt[opcode];
+    else {
+        inst.op.code = _PyOpcode_Deopt[opcode];
+    }
+    assert(inst.op.code < MIN_SPECIALIZED_OPCODE);
+    return inst;
 }
 
 static void
@@ -756,7 +776,7 @@ remove_tools(PyCodeObject * code, int offset, int event, 
int tools)
     assert(event != PY_MONITORING_EVENT_LINE);
     assert(event != PY_MONITORING_EVENT_INSTRUCTION);
     assert(PY_MONITORING_IS_INSTRUMENTED_EVENT(event));
-    assert(opcode_has_event(_Py_GetBaseOpcode(code, offset)));
+    assert(opcode_has_event(_Py_GetBaseCodeUnit(code, offset).op.code));
     _PyCoMonitoringData *monitoring = code->_co_monitoring;
     if (monitoring && monitoring->tools) {
         monitoring->tools[offset] &= ~tools;
@@ -1479,7 +1499,7 @@ initialize_lines(PyCodeObject *code)
     }
     int current_line = -1;
     for (int i = code->_co_firsttraceable; i < code_len; ) {
-        int opcode = _Py_GetBaseOpcode(code, i);
+        int opcode = _Py_GetBaseCodeUnit(code, i).op.code;
         int line = _PyCode_CheckLineNumber(i*(int)sizeof(_Py_CODEUNIT), 
&range);
         line_data[i].line_delta = compute_line_delta(code, i, line);
         int length = _PyInstruction_GetLength(code, i);
@@ -1522,14 +1542,16 @@ initialize_lines(PyCodeObject *code)
         i += length;
     }
     for (int i = code->_co_firsttraceable; i < code_len; ) {
-        int opcode = _Py_GetBaseOpcode(code, i);
+        _Py_CODEUNIT inst =_Py_GetBaseCodeUnit(code, i);
+        int opcode = inst.op.code;
         int oparg = 0;
         while (opcode == EXTENDED_ARG) {
-            oparg = (oparg << 8) | _PyCode_CODE(code)[i].op.arg;
+            oparg = (oparg << 8) | inst.op.arg;
             i++;
-            opcode = _Py_GetBaseOpcode(code, i);
+            inst =_Py_GetBaseCodeUnit(code, i);
+            opcode = inst.op.code;
         }
-        oparg = (oparg << 8) | _PyCode_CODE(code)[i].op.arg;
+        oparg = (oparg << 8) | inst.op.arg;
         i += _PyInstruction_GetLength(code, i);
         int target = -1;
         switch (opcode) {
@@ -1560,7 +1582,7 @@ initialize_lines(PyCodeObject *code)
         }
         assert(target >= 0);
         if (line_data[target].line_delta != NO_LINE) {
-            line_data[target].original_opcode = _Py_GetBaseOpcode(code, 
target);
+            line_data[target].original_opcode = _Py_GetBaseCodeUnit(code, 
target).op.code;
             if (line_data[target].line_delta == COMPUTED_LINE_LINENO_CHANGE) {
                 // If the line is a jump target, we are not sure if the line
                 // number changes, so we set it to COMPUTED_LINE.
@@ -1582,7 +1604,7 @@ initialize_lines(PyCodeObject *code)
         assert(handler >= 0 && handler < code_len);
         int depth_and_lasti;
         scan = parse_varint(scan, &depth_and_lasti);
-        int original_opcode = _Py_GetBaseOpcode(code, handler);
+        int original_opcode = _Py_GetBaseCodeUnit(code, handler).op.code;
         /* Skip if not the start of a line.
          * END_ASYNC_FOR is a bit special as it marks the end of
          * an `async for` loop, which should not generate its own
@@ -1740,15 +1762,14 @@ force_instrument_lock_held(PyCodeObject *code, 
PyInterpreterState *interp)
     }
     /* Insert instrumentation */
     for (int i = code->_co_firsttraceable; i < code_len; i+= 
_PyInstruction_GetLength(code, i)) {
-        _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i];
-        CHECK(instr->op.code != 0);
-        assert(instr->op.code != ENTER_EXECUTOR);
-        int base_opcode = _Py_GetBaseOpcode(code, i);
-        assert(base_opcode != ENTER_EXECUTOR);
+        assert(_PyCode_CODE(code)[i].op.code != ENTER_EXECUTOR);
+        _Py_CODEUNIT instr = _Py_GetBaseCodeUnit(code, i);
+        CHECK(instr.op.code != 0);
+        int base_opcode = instr.op.code;
         if (opcode_has_event(base_opcode)) {
             int8_t event;
             if (base_opcode == RESUME) {
-                event = instr->op.arg > 0;
+                event = instr.op.arg > 0;
             }
             else {
                 event = EVENT_FOR_OPCODE[base_opcode];
@@ -1781,7 +1802,7 @@ force_instrument_lock_held(PyCodeObject *code, 
PyInterpreterState *interp)
     }
     if (removed_per_instruction_tools) {
         for (int i = code->_co_firsttraceable; i < code_len;) {
-            int opcode = _Py_GetBaseOpcode(code, i);
+            int opcode = _Py_GetBaseCodeUnit(code, i).op.code;
             if (opcode == RESUME || opcode == END_FOR) {
                 i += _PyInstruction_GetLength(code, i);
                 continue;
@@ -1808,7 +1829,7 @@ force_instrument_lock_held(PyCodeObject *code, 
PyInterpreterState *interp)
     }
     if (new_per_instruction_tools) {
         for (int i = code->_co_firsttraceable; i < code_len;) {
-            int opcode = _Py_GetBaseOpcode(code, i);
+            int opcode = _Py_GetBaseCodeUnit(code, i).op.code;
             if (opcode == RESUME || opcode == END_FOR) {
                 i += _PyInstruction_GetLength(code, i);
                 continue;
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index 6b5f231e13d15a..db92b0262efe76 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -65,7 +65,6 @@ static void *opcode_targets[256] = {
     &&TARGET_DELETE_NAME,
     &&TARGET_DICT_MERGE,
     &&TARGET_DICT_UPDATE,
-    &&TARGET_ENTER_EXECUTOR,
     &&TARGET_EXTENDED_ARG,
     &&TARGET_FOR_ITER,
     &&TARGET_GET_AWAITABLE,
@@ -148,6 +147,7 @@ static void *opcode_targets[256] = {
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
+    &&_unknown_opcode,
     &&TARGET_RESUME,
     &&TARGET_BINARY_OP_ADD_FLOAT,
     &&TARGET_BINARY_OP_ADD_INT,
@@ -254,5 +254,5 @@ static void *opcode_targets[256] = {
     &&TARGET_INSTRUMENTED_YIELD_VALUE,
     &&TARGET_INSTRUMENTED_CALL,
     &&TARGET_INSTRUMENTED_LINE,
-    &&_unknown_opcode,
+    &&TARGET_ENTER_EXECUTOR,
 };
diff --git a/Python/optimizer.c b/Python/optimizer.c
index 1758329c832a88..dbd5467f0d4653 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -22,20 +22,6 @@
 
 #define MAX_EXECUTORS_SIZE 256
 
-#ifdef Py_DEBUG
-static int
-base_opcode(PyCodeObject *code, int offset)
-{
-    int opcode = _Py_GetBaseOpcode(code, offset);
-    if (opcode == ENTER_EXECUTOR) {
-        int oparg = _PyCode_CODE(code)[offset].op.arg;
-        _PyExecutorObject *ex = code->co_executors->executors[oparg];
-        return ex->vm_data.opcode;
-    }
-    return opcode;
-}
-#endif
-
 static bool
 has_space_for_executor(PyCodeObject *code, _Py_CODEUNIT *instr)
 {
@@ -771,9 +757,8 @@ translate_bytecode_to_trace(
                                 {
                                     uint32_t next_inst = target + 1 + 
INLINE_CACHE_ENTRIES_FOR_ITER + (oparg > 255);
                                     uint32_t jump_target = next_inst + oparg;
-                                    assert(base_opcode(code, jump_target) == 
END_FOR ||
-                                        base_opcode(code, jump_target) == 
INSTRUMENTED_END_FOR);
-                                    assert(base_opcode(code, jump_target+1) == 
POP_TOP);
+                                    assert(_Py_GetBaseCodeUnit(code, 
jump_target).op.code == END_FOR);
+                                    assert(_Py_GetBaseCodeUnit(code, 
jump_target+1).op.code == POP_TOP);
                                 }
 #endif
                                 break;
diff --git a/Python/specialize.c b/Python/specialize.c
index c354a9079019ac..4a227381a8b1d7 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -428,9 +428,9 @@ _PyCode_Quicken(PyCodeObject *code)
     #if ENABLE_SPECIALIZATION
     int opcode = 0;
     _Py_CODEUNIT *instructions = _PyCode_CODE(code);
-    for (int i = 0; i < Py_SIZE(code); i++) {
-        opcode = _Py_GetBaseOpcode(code, i);
-        assert(opcode < MIN_INSTRUMENTED_OPCODE);
+    /* The last code unit cannot have a cache, so we don't need to check it */
+    for (int i = 0; i < Py_SIZE(code)-1; i++) {
+        opcode = instructions[i].op.code;
         int caches = _PyOpcode_Caches[opcode];
         if (caches) {
             // The initial value depends on the opcode
diff --git a/Tools/cases_generator/analyzer.py 
b/Tools/cases_generator/analyzer.py
index db302296502fdd..8c751656132dc3 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -882,6 +882,7 @@ def assign_opcodes(
     instmap["BINARY_OP_INPLACE_ADD_UNICODE"] = 3
 
     instmap["INSTRUMENTED_LINE"] = 254
+    instmap["ENTER_EXECUTOR"] = 255
 
     instrumented = [name for name in instructions if 
name.startswith("INSTRUMENTED")]
 
diff --git a/Tools/cases_generator/opcode_id_generator.py 
b/Tools/cases_generator/opcode_id_generator.py
index 7932379b02dbff..888ae0f3861eb6 100644
--- a/Tools/cases_generator/opcode_id_generator.py
+++ b/Tools/cases_generator/opcode_id_generator.py
@@ -37,6 +37,7 @@ def write_define(name: str, op: int) -> None:
 
         out.emit("\n")
         write_define("HAVE_ARGUMENT", analysis.have_arg)
+        write_define("MIN_SPECIALIZED_OPCODE", analysis.opmap["RESUME"]+1)
         write_define("MIN_INSTRUMENTED_OPCODE", analysis.min_instrumented)
 
 

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to