]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-144179: Add value recording to JIT tracing front-end (GH-144303)
authorMark Shannon <Mark.Shannon@arm.com>
Mon, 2 Feb 2026 16:57:04 +0000 (16:57 +0000)
committerGitHub <noreply@github.com>
Mon, 2 Feb 2026 16:57:04 +0000 (16:57 +0000)
23 files changed:
.gitattributes
Include/internal/pycore_opcode_metadata.h
Include/internal/pycore_optimizer.h
Include/internal/pycore_uop_ids.h
Include/internal/pycore_uop_metadata.h
Makefile.pre.in
Modules/_testinternalcapi/test_cases.c.h
Python/bytecodes.c
Python/executor_cases.c.h
Python/generated_cases.c.h
Python/optimizer.c
Python/optimizer_bytecodes.c
Python/optimizer_cases.c.h
Python/record_functions.c.h [new file with mode: 0644]
Tools/c-analyzer/cpython/_parser.py
Tools/cases_generator/analyzer.py
Tools/cases_generator/generators_common.py
Tools/cases_generator/opcode_metadata_generator.py
Tools/cases_generator/record_function_generator.py [new file with mode: 0644]
Tools/cases_generator/tier1_generator.py
Tools/cases_generator/tier2_generator.py
Tools/cases_generator/uop_id_generator.py
Tools/cases_generator/uop_metadata_generator.py

index 14c1eced0cfed45ee26eae1946a8d66c9c699247..0dac0f849271193495b51b3ce8eaf3875b04773a 100644 (file)
@@ -106,6 +106,7 @@ Python/executor_cases.c.h                           generated
 Python/generated_cases.c.h                          generated
 Python/optimizer_cases.c.h                          generated
 Python/opcode_targets.h                             generated
+Python/record_functions.c.h                         generated
 Python/stdlib_module_names.h                        generated
 Tools/peg_generator/pegen/grammar_parser.py         generated
 aclocal.m4                                          generated
index fe94dc6a24fcc0a06c2f7855e644ccfc4dc56226..db28839a860008e9a4f26fecf8fac5cadff77ff6 100644 (file)
@@ -1050,6 +1050,7 @@ enum InstructionFormat {
 #define HAS_PERIODIC_FLAG (32768)
 #define HAS_UNPREDICTABLE_JUMP_FLAG (65536)
 #define HAS_NEEDS_GUARD_IP_FLAG (131072)
+#define HAS_RECORDS_VALUE_FLAG (262144)
 #define OPCODE_HAS_ARG(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_ARG_FLAG))
 #define OPCODE_HAS_CONST(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_CONST_FLAG))
 #define OPCODE_HAS_NAME(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_NAME_FLAG))
@@ -1068,6 +1069,7 @@ enum InstructionFormat {
 #define OPCODE_HAS_PERIODIC(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_PERIODIC_FLAG))
 #define OPCODE_HAS_UNPREDICTABLE_JUMP(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_UNPREDICTABLE_JUMP_FLAG))
 #define OPCODE_HAS_NEEDS_GUARD_IP(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_NEEDS_GUARD_IP_FLAG))
+#define OPCODE_HAS_RECORDS_VALUE(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_RECORDS_VALUE_FLAG))
 
 #define OPARG_SIMPLE 0
 #define OPARG_CACHE_1 1
@@ -1099,7 +1101,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG },
     [BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG },
     [BINARY_OP_SUBSCR_DICT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
-    [BINARY_OP_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+    [BINARY_OP_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
     [BINARY_OP_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
     [BINARY_OP_SUBSCR_LIST_SLICE] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [BINARY_OP_SUBSCR_STR_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
@@ -1118,15 +1120,15 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [BUILD_TUPLE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG },
     [CACHE] = { true, INSTR_FMT_IX, 0 },
     [CALL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [CALL_ALLOC_AND_ENTER_INIT] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [CALL_BOUND_METHOD_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_BUILTIN_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_BUILTIN_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
+    [CALL_ALLOC_AND_ENTER_INIT] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_BOUND_METHOD_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_BUILTIN_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_BUILTIN_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
     [CALL_EX_NON_PY_GENERAL] = { true, INSTR_FMT_IXC, HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_EX_PY] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+    [CALL_EX_PY] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
     [CALL_FUNCTION_EX] = { true, INSTR_FMT_IXC, HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
     [CALL_INTRINSIC_1] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [CALL_INTRINSIC_2] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
@@ -1138,12 +1140,12 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [CALL_LEN] = { true, INSTR_FMT_IXC00, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
     [CALL_LIST_APPEND] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
     [CALL_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_NON_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [CALL_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+    [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_NON_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [CALL_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
     [CALL_STR_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
     [CALL_TUPLE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
     [CALL_TYPE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
@@ -1177,7 +1179,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [FORMAT_SIMPLE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [FORMAT_WITH_SPEC] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [FOR_ITER] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG },
-    [FOR_ITER_GEN] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+    [FOR_ITER_GEN] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
     [FOR_ITER_LIST] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG },
     [FOR_ITER_RANGE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG },
     [FOR_ITER_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EXIT_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG },
@@ -1221,18 +1223,18 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [LIST_EXTEND] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [LOAD_ATTR] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [LOAD_ATTR_CLASS] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
-    [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
+    [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
     [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [LOAD_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
-    [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
-    [LOAD_ATTR_METHOD_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG },
-    [LOAD_ATTR_METHOD_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
+    [LOAD_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [LOAD_ATTR_METHOD_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [LOAD_ATTR_METHOD_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_RECORDS_VALUE_FLAG },
     [LOAD_ATTR_MODULE] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
-    [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
-    [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
-    [LOAD_ATTR_PROPERTY] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [LOAD_ATTR_SLOT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
-    [LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
+    [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [LOAD_ATTR_PROPERTY] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [LOAD_ATTR_SLOT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
     [LOAD_BUILD_CLASS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [LOAD_COMMON_CONSTANT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG },
     [LOAD_CONST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG },
@@ -1278,8 +1280,8 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [RESERVED] = { true, INSTR_FMT_IX, 0 },
     [RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
     [RESUME_CHECK] = { true, INSTR_FMT_IX, HAS_DEOPT_FLAG },
-    [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+    [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
     [SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
     [SEND_GEN] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
     [SETUP_ANNOTATIONS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
@@ -1288,8 +1290,8 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [SET_UPDATE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [STORE_ATTR] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [STORE_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IXC000, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
-    [STORE_ATTR_SLOT] = { true, INSTR_FMT_IXC000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
-    [STORE_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
+    [STORE_ATTR_SLOT] = { true, INSTR_FMT_IXC000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+    [STORE_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
     [STORE_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ESCAPES_FLAG },
     [STORE_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ESCAPES_FLAG },
     [STORE_FAST_LOAD_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ESCAPES_FLAG },
@@ -1302,7 +1304,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [STORE_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
     [SWAP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_PURE_FLAG },
     [TO_BOOL] = { true, INSTR_FMT_IXC00, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [TO_BOOL_ALWAYS_TRUE] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
+    [TO_BOOL_ALWAYS_TRUE] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
     [TO_BOOL_BOOL] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG },
     [TO_BOOL_INT] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG },
     [TO_BOOL_LIST] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
@@ -1318,7 +1320,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [UNPACK_SEQUENCE_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
     [UNPACK_SEQUENCE_TWO_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
     [WITH_EXCEPT_START] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
-    [YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+    [YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
     [ANNOTATIONS_PLACEHOLDER] = { true, -1, HAS_PURE_FLAG },
     [JUMP] = { true, -1, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [JUMP_IF_FALSE] = { true, -1, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
@@ -1333,7 +1335,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
 };
 #endif
 
-#define MAX_UOP_PER_EXPANSION 10
+#define MAX_UOP_PER_EXPANSION 11
 struct opcode_macro_expansion {
     int nuops;
     struct { int16_t uop; int8_t size; int8_t offset; } uops[MAX_UOP_PER_EXPANSION];
@@ -1352,7 +1354,7 @@ _PyOpcode_macro_expansion[256] = {
     [BINARY_OP_MULTIPLY_FLOAT] = { .nuops = 5, .uops = { { _GUARD_TOS_FLOAT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_FLOAT, OPARG_SIMPLE, 0 }, { _BINARY_OP_MULTIPLY_FLOAT, OPARG_SIMPLE, 5 }, { _POP_TOP_FLOAT, OPARG_SIMPLE, 5 }, { _POP_TOP_FLOAT, OPARG_SIMPLE, 5 } } },
     [BINARY_OP_MULTIPLY_INT] = { .nuops = 5, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_INT, OPARG_SIMPLE, 0 }, { _BINARY_OP_MULTIPLY_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_INT, OPARG_SIMPLE, 5 } } },
     [BINARY_OP_SUBSCR_DICT] = { .nuops = 4, .uops = { { _GUARD_NOS_DICT, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_DICT, OPARG_SIMPLE, 5 }, { _POP_TOP, OPARG_SIMPLE, 5 }, { _POP_TOP, OPARG_SIMPLE, 5 } } },
-    [BINARY_OP_SUBSCR_GETITEM] = { .nuops = 4, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_CHECK_FUNC, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_INIT_CALL, OPARG_SIMPLE, 5 }, { _PUSH_FRAME, OPARG_SIMPLE, 5 } } },
+    [BINARY_OP_SUBSCR_GETITEM] = { .nuops = 5, .uops = { { _RECORD_TOS, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_CHECK_FUNC, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_INIT_CALL, OPARG_SIMPLE, 5 }, { _PUSH_FRAME, OPARG_SIMPLE, 5 } } },
     [BINARY_OP_SUBSCR_LIST_INT] = { .nuops = 5, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_LIST_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_INT, OPARG_SIMPLE, 5 }, { _POP_TOP, OPARG_SIMPLE, 5 } } },
     [BINARY_OP_SUBSCR_LIST_SLICE] = { .nuops = 3, .uops = { { _GUARD_TOS_SLICE, OPARG_SIMPLE, 0 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_LIST_SLICE, OPARG_SIMPLE, 5 } } },
     [BINARY_OP_SUBSCR_STR_INT] = { .nuops = 5, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_COMPACT_ASCII, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_STR_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_UNICODE, OPARG_SIMPLE, 5 } } },
@@ -1369,15 +1371,15 @@ _PyOpcode_macro_expansion[256] = {
     [BUILD_STRING] = { .nuops = 1, .uops = { { _BUILD_STRING, OPARG_SIMPLE, 0 } } },
     [BUILD_TEMPLATE] = { .nuops = 1, .uops = { { _BUILD_TEMPLATE, OPARG_SIMPLE, 0 } } },
     [BUILD_TUPLE] = { .nuops = 1, .uops = { { _BUILD_TUPLE, OPARG_SIMPLE, 0 } } },
-    [CALL_ALLOC_AND_ENTER_INIT] = { .nuops = 4, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_AND_ALLOCATE_OBJECT, 2, 1 }, { _CREATE_INIT_FRAME, OPARG_SIMPLE, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
-    [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 10, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
-    [CALL_BOUND_METHOD_GENERAL] = { .nuops = 7, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_METHOD_VERSION, 2, 1 }, { _EXPAND_METHOD, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
-    [CALL_BUILTIN_CLASS] = { .nuops = 2, .uops = { { _CALL_BUILTIN_CLASS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
-    [CALL_BUILTIN_FAST] = { .nuops = 2, .uops = { { _CALL_BUILTIN_FAST, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
-    [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { .nuops = 2, .uops = { { _CALL_BUILTIN_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
-    [CALL_BUILTIN_O] = { .nuops = 4, .uops = { { _CALL_BUILTIN_O, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+    [CALL_ALLOC_AND_ENTER_INIT] = { .nuops = 5, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_AND_ALLOCATE_OBJECT, 2, 1 }, { _CREATE_INIT_FRAME, OPARG_SIMPLE, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+    [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 11, .uops = { { _RECORD_BOUND_METHOD, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+    [CALL_BOUND_METHOD_GENERAL] = { .nuops = 8, .uops = { { _RECORD_BOUND_METHOD, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_METHOD_VERSION, 2, 1 }, { _EXPAND_METHOD, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+    [CALL_BUILTIN_CLASS] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_BUILTIN_CLASS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+    [CALL_BUILTIN_FAST] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_BUILTIN_FAST, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+    [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_BUILTIN_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+    [CALL_BUILTIN_O] = { .nuops = 5, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_BUILTIN_O, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
     [CALL_EX_NON_PY_GENERAL] = { .nuops = 4, .uops = { { _CHECK_IS_NOT_PY_CALLABLE_EX, OPARG_SIMPLE, 1 }, { _MAKE_CALLARGS_A_TUPLE, OPARG_SIMPLE, 1 }, { _CALL_FUNCTION_EX_NON_PY_GENERAL, OPARG_SIMPLE, 1 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 1 } } },
-    [CALL_EX_PY] = { .nuops = 6, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _MAKE_CALLARGS_A_TUPLE, OPARG_SIMPLE, 1 }, { _CHECK_IS_PY_CALLABLE_EX, OPARG_SIMPLE, 1 }, { _PY_FRAME_EX, OPARG_SIMPLE, 1 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
+    [CALL_EX_PY] = { .nuops = 7, .uops = { { _RECORD_4OS, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _MAKE_CALLARGS_A_TUPLE, OPARG_SIMPLE, 1 }, { _CHECK_IS_PY_CALLABLE_EX, OPARG_SIMPLE, 1 }, { _PY_FRAME_EX, OPARG_SIMPLE, 1 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
     [CALL_INTRINSIC_1] = { .nuops = 1, .uops = { { _CALL_INTRINSIC_1, OPARG_SIMPLE, 0 } } },
     [CALL_INTRINSIC_2] = { .nuops = 1, .uops = { { _CALL_INTRINSIC_2, OPARG_SIMPLE, 0 } } },
     [CALL_ISINSTANCE] = { .nuops = 3, .uops = { { _GUARD_THIRD_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_ISINSTANCE, OPARG_SIMPLE, 3 }, { _CALL_ISINSTANCE, OPARG_SIMPLE, 3 } } },
@@ -1387,12 +1389,12 @@ _PyOpcode_macro_expansion[256] = {
     [CALL_LEN] = { .nuops = 5, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_LEN, OPARG_SIMPLE, 3 }, { _CALL_LEN, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
     [CALL_LIST_APPEND] = { .nuops = 6, .uops = { { _GUARD_CALLABLE_LIST_APPEND, OPARG_SIMPLE, 3 }, { _GUARD_NOS_NOT_NULL, OPARG_SIMPLE, 3 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 3 }, { _CALL_LIST_APPEND, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
     [CALL_METHOD_DESCRIPTOR_FAST] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
-    [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
-    [CALL_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_NOARGS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
-    [CALL_METHOD_DESCRIPTOR_O] = { .nuops = 5, .uops = { { _CALL_METHOD_DESCRIPTOR_O, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
-    [CALL_NON_PY_GENERAL] = { .nuops = 3, .uops = { { _CHECK_IS_NOT_PY_CALLABLE, OPARG_SIMPLE, 3 }, { _CALL_NON_PY_GENERAL, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
-    [CALL_PY_EXACT_ARGS] = { .nuops = 8, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
-    [CALL_PY_GENERAL] = { .nuops = 6, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+    [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+    [CALL_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_METHOD_DESCRIPTOR_NOARGS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+    [CALL_METHOD_DESCRIPTOR_O] = { .nuops = 6, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_METHOD_DESCRIPTOR_O, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+    [CALL_NON_PY_GENERAL] = { .nuops = 4, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CHECK_IS_NOT_PY_CALLABLE, OPARG_SIMPLE, 3 }, { _CALL_NON_PY_GENERAL, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+    [CALL_PY_EXACT_ARGS] = { .nuops = 9, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+    [CALL_PY_GENERAL] = { .nuops = 7, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
     [CALL_STR_1] = { .nuops = 5, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_STR_1, OPARG_SIMPLE, 3 }, { _CALL_STR_1, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
     [CALL_TUPLE_1] = { .nuops = 5, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_TUPLE_1, OPARG_SIMPLE, 3 }, { _CALL_TUPLE_1, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
     [CALL_TYPE_1] = { .nuops = 4, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_TYPE_1, OPARG_SIMPLE, 3 }, { _CALL_TYPE_1, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
@@ -1422,7 +1424,7 @@ _PyOpcode_macro_expansion[256] = {
     [FORMAT_SIMPLE] = { .nuops = 1, .uops = { { _FORMAT_SIMPLE, OPARG_SIMPLE, 0 } } },
     [FORMAT_WITH_SPEC] = { .nuops = 1, .uops = { { _FORMAT_WITH_SPEC, OPARG_SIMPLE, 0 } } },
     [FOR_ITER] = { .nuops = 1, .uops = { { _FOR_ITER, OPARG_REPLACED, 0 } } },
-    [FOR_ITER_GEN] = { .nuops = 3, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _FOR_ITER_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
+    [FOR_ITER_GEN] = { .nuops = 4, .uops = { { _RECORD_NOS, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _FOR_ITER_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
     [FOR_ITER_LIST] = { .nuops = 3, .uops = { { _ITER_CHECK_LIST, OPARG_SIMPLE, 1 }, { _ITER_JUMP_LIST, OPARG_REPLACED, 1 }, { _ITER_NEXT_LIST, OPARG_REPLACED, 1 } } },
     [FOR_ITER_RANGE] = { .nuops = 3, .uops = { { _ITER_CHECK_RANGE, OPARG_SIMPLE, 1 }, { _ITER_JUMP_RANGE, OPARG_REPLACED, 1 }, { _ITER_NEXT_RANGE, OPARG_SIMPLE, 1 } } },
     [FOR_ITER_TUPLE] = { .nuops = 3, .uops = { { _ITER_CHECK_TUPLE, OPARG_SIMPLE, 1 }, { _ITER_JUMP_TUPLE, OPARG_REPLACED, 1 }, { _ITER_NEXT_TUPLE, OPARG_SIMPLE, 1 } } },
@@ -1442,17 +1444,17 @@ _PyOpcode_macro_expansion[256] = {
     [LIST_EXTEND] = { .nuops = 1, .uops = { { _LIST_EXTEND, OPARG_SIMPLE, 0 } } },
     [LOAD_ATTR] = { .nuops = 1, .uops = { { _LOAD_ATTR, OPARG_SIMPLE, 8 } } },
     [LOAD_ATTR_CLASS] = { .nuops = 3, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
-    [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { .nuops = 4, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _GUARD_TYPE_VERSION, 2, 3 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
-    [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 5, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, OPARG_SIMPLE, 3 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
-    [LOAD_ATTR_METHOD_LAZY_DICT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_METHOD_LAZY_DICT, 1, 3 }, { _LOAD_ATTR_METHOD_LAZY_DICT, 4, 5 } } },
-    [LOAD_ATTR_METHOD_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_METHOD_NO_DICT, 4, 5 } } },
-    [LOAD_ATTR_METHOD_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_METHOD_WITH_VALUES, 4, 5 } } },
+    [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_CLASS, 2, 3 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+    [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 6, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, OPARG_SIMPLE, 3 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+    [LOAD_ATTR_METHOD_LAZY_DICT] = { .nuops = 4, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_METHOD_LAZY_DICT, 1, 3 }, { _LOAD_ATTR_METHOD_LAZY_DICT, 4, 5 } } },
+    [LOAD_ATTR_METHOD_NO_DICT] = { .nuops = 3, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_METHOD_NO_DICT, 4, 5 } } },
+    [LOAD_ATTR_METHOD_WITH_VALUES] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_METHOD_WITH_VALUES, 4, 5 } } },
     [LOAD_ATTR_MODULE] = { .nuops = 4, .uops = { { _LOAD_ATTR_MODULE, 2, 1 }, { _LOAD_ATTR_MODULE, OPERAND1_1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
-    [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 4, 5 } } },
-    [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 4, 5 } } },
-    [LOAD_ATTR_PROPERTY] = { .nuops = 5, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_PROPERTY_FRAME, 4, 5 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 9 }, { _PUSH_FRAME, OPARG_SIMPLE, 9 } } },
-    [LOAD_ATTR_SLOT] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
-    [LOAD_ATTR_WITH_HINT] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+    [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { .nuops = 3, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 4, 5 } } },
+    [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 4, 5 } } },
+    [LOAD_ATTR_PROPERTY] = { .nuops = 6, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_PEP_523, OPARG_SIMPLE, 3 }, { _LOAD_ATTR_PROPERTY_FRAME, 4, 5 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 9 }, { _PUSH_FRAME, OPARG_SIMPLE, 9 } } },
+    [LOAD_ATTR_SLOT] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+    [LOAD_ATTR_WITH_HINT] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
     [LOAD_BUILD_CLASS] = { .nuops = 1, .uops = { { _LOAD_BUILD_CLASS, OPARG_SIMPLE, 0 } } },
     [LOAD_COMMON_CONSTANT] = { .nuops = 1, .uops = { { _LOAD_COMMON_CONSTANT, OPARG_SIMPLE, 0 } } },
     [LOAD_CONST] = { .nuops = 1, .uops = { { _LOAD_CONST, OPARG_SIMPLE, 0 } } },
@@ -1492,8 +1494,8 @@ _PyOpcode_macro_expansion[256] = {
     [PUSH_EXC_INFO] = { .nuops = 1, .uops = { { _PUSH_EXC_INFO, OPARG_SIMPLE, 0 } } },
     [PUSH_NULL] = { .nuops = 1, .uops = { { _PUSH_NULL, OPARG_SIMPLE, 0 } } },
     [RESUME_CHECK] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 0 } } },
-    [RETURN_GENERATOR] = { .nuops = 1, .uops = { { _RETURN_GENERATOR, OPARG_SIMPLE, 0 } } },
-    [RETURN_VALUE] = { .nuops = 1, .uops = { { _RETURN_VALUE, OPARG_SIMPLE, 0 } } },
+    [RETURN_GENERATOR] = { .nuops = 2, .uops = { { _RECORD_CALLER_CODE, OPARG_SIMPLE, 0 }, { _RETURN_GENERATOR, OPARG_SIMPLE, 0 } } },
+    [RETURN_VALUE] = { .nuops = 2, .uops = { { _RECORD_CALLER_CODE, OPARG_SIMPLE, 0 }, { _RETURN_VALUE, OPARG_SIMPLE, 0 } } },
     [SEND_GEN] = { .nuops = 3, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _SEND_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
     [SETUP_ANNOTATIONS] = { .nuops = 1, .uops = { { _SETUP_ANNOTATIONS, OPARG_SIMPLE, 0 } } },
     [SET_ADD] = { .nuops = 1, .uops = { { _SET_ADD, OPARG_SIMPLE, 0 } } },
@@ -1501,8 +1503,8 @@ _PyOpcode_macro_expansion[256] = {
     [SET_UPDATE] = { .nuops = 1, .uops = { { _SET_UPDATE, OPARG_SIMPLE, 0 } } },
     [STORE_ATTR] = { .nuops = 1, .uops = { { _STORE_ATTR, OPARG_SIMPLE, 3 } } },
     [STORE_ATTR_INSTANCE_VALUE] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION_AND_LOCK, 2, 1 }, { _GUARD_DORV_NO_DICT, OPARG_SIMPLE, 3 }, { _STORE_ATTR_INSTANCE_VALUE, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
-    [STORE_ATTR_SLOT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
-    [STORE_ATTR_WITH_HINT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
+    [STORE_ATTR_SLOT] = { .nuops = 4, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
+    [STORE_ATTR_WITH_HINT] = { .nuops = 4, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
     [STORE_DEREF] = { .nuops = 1, .uops = { { _STORE_DEREF, OPARG_SIMPLE, 0 } } },
     [STORE_FAST] = { .nuops = 2, .uops = { { _SWAP_FAST, OPARG_SIMPLE, 0 }, { _POP_TOP, OPARG_SIMPLE, 0 } } },
     [STORE_FAST_LOAD_FAST] = { .nuops = 3, .uops = { { _SWAP_FAST, OPARG_TOP, 0 }, { _POP_TOP, OPARG_TOP, 0 }, { _LOAD_FAST, OPARG_BOTTOM, 0 } } },
@@ -1515,7 +1517,7 @@ _PyOpcode_macro_expansion[256] = {
     [STORE_SUBSCR_LIST_INT] = { .nuops = 5, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 0 }, { _STORE_SUBSCR_LIST_INT, OPARG_SIMPLE, 1 }, { _POP_TOP_INT, OPARG_SIMPLE, 1 }, { _POP_TOP, OPARG_SIMPLE, 1 } } },
     [SWAP] = { .nuops = 1, .uops = { { _SWAP, OPARG_SIMPLE, 0 } } },
     [TO_BOOL] = { .nuops = 1, .uops = { { _TO_BOOL, OPARG_SIMPLE, 2 } } },
-    [TO_BOOL_ALWAYS_TRUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _REPLACE_WITH_TRUE, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
+    [TO_BOOL_ALWAYS_TRUE] = { .nuops = 4, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _REPLACE_WITH_TRUE, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
     [TO_BOOL_BOOL] = { .nuops = 1, .uops = { { _TO_BOOL_BOOL, OPARG_SIMPLE, 3 } } },
     [TO_BOOL_INT] = { .nuops = 3, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _TO_BOOL_INT, OPARG_SIMPLE, 3 }, { _POP_TOP_INT, OPARG_SIMPLE, 3 } } },
     [TO_BOOL_LIST] = { .nuops = 3, .uops = { { _GUARD_TOS_LIST, OPARG_SIMPLE, 0 }, { _TO_BOOL_LIST, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
@@ -1530,7 +1532,7 @@ _PyOpcode_macro_expansion[256] = {
     [UNPACK_SEQUENCE_TUPLE] = { .nuops = 2, .uops = { { _GUARD_TOS_TUPLE, OPARG_SIMPLE, 0 }, { _UNPACK_SEQUENCE_TUPLE, OPARG_SIMPLE, 1 } } },
     [UNPACK_SEQUENCE_TWO_TUPLE] = { .nuops = 2, .uops = { { _GUARD_TOS_TUPLE, OPARG_SIMPLE, 0 }, { _UNPACK_SEQUENCE_TWO_TUPLE, OPARG_SIMPLE, 1 } } },
     [WITH_EXCEPT_START] = { .nuops = 1, .uops = { { _WITH_EXCEPT_START, OPARG_SIMPLE, 0 } } },
-    [YIELD_VALUE] = { .nuops = 1, .uops = { { _YIELD_VALUE, OPARG_SIMPLE, 0 } } },
+    [YIELD_VALUE] = { .nuops = 2, .uops = { { _RECORD_CALLER_CODE, OPARG_SIMPLE, 0 }, { _YIELD_VALUE, OPARG_SIMPLE, 0 } } },
 };
 #endif // NEED_OPCODE_METADATA
 
index 2ee518fb82f301e75377b59455b008be200c8536..bb2028c59356b2cfee88da35e7453927ec6b5f19 100644 (file)
@@ -90,6 +90,7 @@ typedef struct _PyJitTracerPreviousState {
     PyCodeObject *instr_code; // Strong
     struct _PyInterpreterFrame *instr_frame;
     _PyBloomFilter dependencies;
+    PyObject *recorded_value; // Strong, may be NULL
 } _PyJitTracerPreviousState;
 
 typedef struct _PyJitTracerTranslatorState {
@@ -336,7 +337,7 @@ PyAPI_FUNC(int) _PyJit_translate_single_bytecode_to_trace(PyThreadState *tstate,
 PyAPI_FUNC(int)
 _PyJit_TryInitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame,
     _Py_CODEUNIT *curr_instr, _Py_CODEUNIT *start_instr,
-    _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth, _PyExitData *exit,
+    _Py_CODEUNIT *close_loop_instr, _PyStackRef *stack_pointer, int chain_depth, _PyExitData *exit,
     int oparg, _PyExecutorObject *current_executor);
 
 PyAPI_FUNC(void) _PyJit_FinalizeTracing(PyThreadState *tstate, int err);
@@ -344,6 +345,12 @@ void _PyJit_TracerFree(_PyThreadStateImpl *_tstate);
 
 void _PyJit_Tracer_InvalidateDependency(PyThreadState *old_tstate, void *obj);
 
+#ifdef _Py_TIER2
+typedef void (*_Py_RecordFuncPtr)(_PyInterpreterFrame *frame, _PyStackRef *stackpointer, int oparg, PyObject **recorded_value);
+PyAPI_DATA(const _Py_RecordFuncPtr) _PyOpcode_RecordFunctions[];
+PyAPI_DATA(const uint8_t) _PyOpcode_RecordFunctionIndices[256];
+#endif
+
 #ifdef __cplusplus
 }
 #endif
index 8712d1afc7570ba7daaa467fc2b6966540cbfad7..850ae446dc7aca1c1dbf20d035343395bb0d67b1 100644 (file)
@@ -323,922 +323,929 @@ extern "C" {
 #define _PY_FRAME_GENERAL 538
 #define _PY_FRAME_KW 539
 #define _QUICKEN_RESUME 540
-#define _REPLACE_WITH_TRUE 541
+#define _RECORD_4OS 541
+#define _RECORD_BOUND_METHOD 542
+#define _RECORD_CALLABLE 543
+#define _RECORD_CALLER_CODE 544
+#define _RECORD_NOS 545
+#define _RECORD_TOS 546
+#define _RECORD_TOS_TYPE 547
+#define _REPLACE_WITH_TRUE 548
 #define _RESUME_CHECK RESUME_CHECK
-#define _RETURN_GENERATOR RETURN_GENERATOR
-#define _RETURN_VALUE RETURN_VALUE
-#define _SAVE_RETURN_OFFSET 542
-#define _SEND 543
-#define _SEND_GEN_FRAME 544
+#define _RETURN_GENERATOR 549
+#define _RETURN_VALUE 550
+#define _SAVE_RETURN_OFFSET 551
+#define _SEND 552
+#define _SEND_GEN_FRAME 553
 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
 #define _SET_ADD SET_ADD
 #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
 #define _SET_UPDATE SET_UPDATE
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 545
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 546
-#define _SPILL_OR_RELOAD 547
-#define _START_EXECUTOR 548
-#define _STORE_ATTR 549
-#define _STORE_ATTR_INSTANCE_VALUE 550
-#define _STORE_ATTR_SLOT 551
-#define _STORE_ATTR_WITH_HINT 552
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 554
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 555
+#define _SPILL_OR_RELOAD 556
+#define _START_EXECUTOR 557
+#define _STORE_ATTR 558
+#define _STORE_ATTR_INSTANCE_VALUE 559
+#define _STORE_ATTR_SLOT 560
+#define _STORE_ATTR_WITH_HINT 561
 #define _STORE_DEREF STORE_DEREF
 #define _STORE_GLOBAL STORE_GLOBAL
 #define _STORE_NAME STORE_NAME
-#define _STORE_SLICE 553
-#define _STORE_SUBSCR 554
-#define _STORE_SUBSCR_DICT 555
-#define _STORE_SUBSCR_LIST_INT 556
-#define _SWAP 557
-#define _SWAP_2 558
-#define _SWAP_3 559
-#define _SWAP_FAST 560
-#define _SWAP_FAST_0 561
-#define _SWAP_FAST_1 562
-#define _SWAP_FAST_2 563
-#define _SWAP_FAST_3 564
-#define _SWAP_FAST_4 565
-#define _SWAP_FAST_5 566
-#define _SWAP_FAST_6 567
-#define _SWAP_FAST_7 568
-#define _TIER2_RESUME_CHECK 569
-#define _TO_BOOL 570
+#define _STORE_SLICE 562
+#define _STORE_SUBSCR 563
+#define _STORE_SUBSCR_DICT 564
+#define _STORE_SUBSCR_LIST_INT 565
+#define _SWAP 566
+#define _SWAP_2 567
+#define _SWAP_3 568
+#define _SWAP_FAST 569
+#define _SWAP_FAST_0 570
+#define _SWAP_FAST_1 571
+#define _SWAP_FAST_2 572
+#define _SWAP_FAST_3 573
+#define _SWAP_FAST_4 574
+#define _SWAP_FAST_5 575
+#define _SWAP_FAST_6 576
+#define _SWAP_FAST_7 577
+#define _TIER2_RESUME_CHECK 578
+#define _TO_BOOL 579
 #define _TO_BOOL_BOOL TO_BOOL_BOOL
-#define _TO_BOOL_INT 571
-#define _TO_BOOL_LIST 572
+#define _TO_BOOL_INT 580
+#define _TO_BOOL_LIST 581
 #define _TO_BOOL_NONE TO_BOOL_NONE
-#define _TO_BOOL_STR 573
+#define _TO_BOOL_STR 582
 #define _TRACE_RECORD TRACE_RECORD
-#define _UNARY_INVERT 574
-#define _UNARY_NEGATIVE 575
+#define _UNARY_INVERT 583
+#define _UNARY_NEGATIVE 584
 #define _UNARY_NOT UNARY_NOT
 #define _UNPACK_EX UNPACK_EX
-#define _UNPACK_SEQUENCE 576
-#define _UNPACK_SEQUENCE_LIST 577
-#define _UNPACK_SEQUENCE_TUPLE 578
-#define _UNPACK_SEQUENCE_TWO_TUPLE 579
+#define _UNPACK_SEQUENCE 585
+#define _UNPACK_SEQUENCE_LIST 586
+#define _UNPACK_SEQUENCE_TUPLE 587
+#define _UNPACK_SEQUENCE_TWO_TUPLE 588
 #define _WITH_EXCEPT_START WITH_EXCEPT_START
-#define _YIELD_VALUE YIELD_VALUE
-#define MAX_UOP_ID 579
-#define _BINARY_OP_r23 580
-#define _BINARY_OP_ADD_FLOAT_r03 581
-#define _BINARY_OP_ADD_FLOAT_r13 582
-#define _BINARY_OP_ADD_FLOAT_r23 583
-#define _BINARY_OP_ADD_INT_r03 584
-#define _BINARY_OP_ADD_INT_r13 585
-#define _BINARY_OP_ADD_INT_r23 586
-#define _BINARY_OP_ADD_UNICODE_r03 587
-#define _BINARY_OP_ADD_UNICODE_r13 588
-#define _BINARY_OP_ADD_UNICODE_r23 589
-#define _BINARY_OP_EXTEND_r23 590
-#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 591
-#define _BINARY_OP_MULTIPLY_FLOAT_r03 592
-#define _BINARY_OP_MULTIPLY_FLOAT_r13 593
-#define _BINARY_OP_MULTIPLY_FLOAT_r23 594
-#define _BINARY_OP_MULTIPLY_INT_r03 595
-#define _BINARY_OP_MULTIPLY_INT_r13 596
-#define _BINARY_OP_MULTIPLY_INT_r23 597
-#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 598
-#define _BINARY_OP_SUBSCR_DICT_r23 599
-#define _BINARY_OP_SUBSCR_INIT_CALL_r01 600
-#define _BINARY_OP_SUBSCR_INIT_CALL_r11 601
-#define _BINARY_OP_SUBSCR_INIT_CALL_r21 602
-#define _BINARY_OP_SUBSCR_INIT_CALL_r31 603
-#define _BINARY_OP_SUBSCR_LIST_INT_r23 604
-#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 605
-#define _BINARY_OP_SUBSCR_STR_INT_r23 606
-#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 607
-#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 608
-#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 609
-#define _BINARY_OP_SUBSCR_USTR_INT_r23 610
-#define _BINARY_OP_SUBTRACT_FLOAT_r03 611
-#define _BINARY_OP_SUBTRACT_FLOAT_r13 612
-#define _BINARY_OP_SUBTRACT_FLOAT_r23 613
-#define _BINARY_OP_SUBTRACT_INT_r03 614
-#define _BINARY_OP_SUBTRACT_INT_r13 615
-#define _BINARY_OP_SUBTRACT_INT_r23 616
-#define _BINARY_SLICE_r31 617
-#define _BUILD_INTERPOLATION_r01 618
-#define _BUILD_LIST_r01 619
-#define _BUILD_MAP_r01 620
-#define _BUILD_SET_r01 621
-#define _BUILD_SLICE_r01 622
-#define _BUILD_STRING_r01 623
-#define _BUILD_TEMPLATE_r21 624
-#define _BUILD_TUPLE_r01 625
-#define _CALL_BUILTIN_CLASS_r01 626
-#define _CALL_BUILTIN_FAST_r01 627
-#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 628
-#define _CALL_BUILTIN_O_r03 629
-#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 630
-#define _CALL_INTRINSIC_1_r11 631
-#define _CALL_INTRINSIC_2_r21 632
-#define _CALL_ISINSTANCE_r31 633
-#define _CALL_KW_NON_PY_r11 634
-#define _CALL_LEN_r33 635
-#define _CALL_LIST_APPEND_r03 636
-#define _CALL_LIST_APPEND_r13 637
-#define _CALL_LIST_APPEND_r23 638
-#define _CALL_LIST_APPEND_r33 639
-#define _CALL_METHOD_DESCRIPTOR_FAST_r01 640
-#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 641
-#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 642
-#define _CALL_METHOD_DESCRIPTOR_O_r03 643
-#define _CALL_NON_PY_GENERAL_r01 644
-#define _CALL_STR_1_r32 645
-#define _CALL_TUPLE_1_r32 646
-#define _CALL_TYPE_1_r02 647
-#define _CALL_TYPE_1_r12 648
-#define _CALL_TYPE_1_r22 649
-#define _CALL_TYPE_1_r32 650
-#define _CHECK_AND_ALLOCATE_OBJECT_r00 651
-#define _CHECK_ATTR_CLASS_r01 652
-#define _CHECK_ATTR_CLASS_r11 653
-#define _CHECK_ATTR_CLASS_r22 654
-#define _CHECK_ATTR_CLASS_r33 655
-#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 656
-#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 657
-#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 658
-#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 659
-#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 660
-#define _CHECK_EG_MATCH_r22 661
-#define _CHECK_EXC_MATCH_r22 662
-#define _CHECK_FUNCTION_EXACT_ARGS_r00 663
-#define _CHECK_FUNCTION_VERSION_r00 664
-#define _CHECK_FUNCTION_VERSION_INLINE_r00 665
-#define _CHECK_FUNCTION_VERSION_INLINE_r11 666
-#define _CHECK_FUNCTION_VERSION_INLINE_r22 667
-#define _CHECK_FUNCTION_VERSION_INLINE_r33 668
-#define _CHECK_FUNCTION_VERSION_KW_r11 669
-#define _CHECK_IS_NOT_PY_CALLABLE_r00 670
-#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 671
-#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 672
-#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 673
-#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 674
-#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 675
-#define _CHECK_IS_PY_CALLABLE_EX_r03 676
-#define _CHECK_IS_PY_CALLABLE_EX_r13 677
-#define _CHECK_IS_PY_CALLABLE_EX_r23 678
-#define _CHECK_IS_PY_CALLABLE_EX_r33 679
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 680
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 681
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 682
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 683
-#define _CHECK_METHOD_VERSION_r00 684
-#define _CHECK_METHOD_VERSION_KW_r11 685
-#define _CHECK_PEP_523_r00 686
-#define _CHECK_PEP_523_r11 687
-#define _CHECK_PEP_523_r22 688
-#define _CHECK_PEP_523_r33 689
-#define _CHECK_PERIODIC_r00 690
-#define _CHECK_PERIODIC_AT_END_r00 691
-#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 692
-#define _CHECK_RECURSION_REMAINING_r00 693
-#define _CHECK_RECURSION_REMAINING_r11 694
-#define _CHECK_RECURSION_REMAINING_r22 695
-#define _CHECK_RECURSION_REMAINING_r33 696
-#define _CHECK_STACK_SPACE_r00 697
-#define _CHECK_STACK_SPACE_OPERAND_r00 698
-#define _CHECK_STACK_SPACE_OPERAND_r11 699
-#define _CHECK_STACK_SPACE_OPERAND_r22 700
-#define _CHECK_STACK_SPACE_OPERAND_r33 701
-#define _CHECK_VALIDITY_r00 702
-#define _CHECK_VALIDITY_r11 703
-#define _CHECK_VALIDITY_r22 704
-#define _CHECK_VALIDITY_r33 705
-#define _COLD_DYNAMIC_EXIT_r00 706
-#define _COLD_EXIT_r00 707
-#define _COMPARE_OP_r21 708
-#define _COMPARE_OP_FLOAT_r03 709
-#define _COMPARE_OP_FLOAT_r13 710
-#define _COMPARE_OP_FLOAT_r23 711
-#define _COMPARE_OP_INT_r23 712
-#define _COMPARE_OP_STR_r23 713
-#define _CONTAINS_OP_r23 714
-#define _CONTAINS_OP_DICT_r23 715
-#define _CONTAINS_OP_SET_r23 716
-#define _CONVERT_VALUE_r11 717
-#define _COPY_r01 718
-#define _COPY_1_r02 719
-#define _COPY_1_r12 720
-#define _COPY_1_r23 721
-#define _COPY_2_r03 722
-#define _COPY_2_r13 723
-#define _COPY_2_r23 724
-#define _COPY_3_r03 725
-#define _COPY_3_r13 726
-#define _COPY_3_r23 727
-#define _COPY_3_r33 728
-#define _COPY_FREE_VARS_r00 729
-#define _COPY_FREE_VARS_r11 730
-#define _COPY_FREE_VARS_r22 731
-#define _COPY_FREE_VARS_r33 732
-#define _CREATE_INIT_FRAME_r01 733
-#define _DELETE_ATTR_r10 734
-#define _DELETE_DEREF_r00 735
-#define _DELETE_FAST_r00 736
-#define _DELETE_GLOBAL_r00 737
-#define _DELETE_NAME_r00 738
-#define _DELETE_SUBSCR_r20 739
-#define _DEOPT_r00 740
-#define _DEOPT_r10 741
-#define _DEOPT_r20 742
-#define _DEOPT_r30 743
-#define _DICT_MERGE_r10 744
-#define _DICT_UPDATE_r10 745
-#define _DO_CALL_r01 746
-#define _DO_CALL_FUNCTION_EX_r31 747
-#define _DO_CALL_KW_r11 748
-#define _DYNAMIC_EXIT_r00 749
-#define _DYNAMIC_EXIT_r10 750
-#define _DYNAMIC_EXIT_r20 751
-#define _DYNAMIC_EXIT_r30 752
-#define _END_FOR_r10 753
-#define _END_SEND_r21 754
-#define _ERROR_POP_N_r00 755
-#define _EXIT_INIT_CHECK_r10 756
-#define _EXIT_TRACE_r00 757
-#define _EXIT_TRACE_r10 758
-#define _EXIT_TRACE_r20 759
-#define _EXIT_TRACE_r30 760
-#define _EXPAND_METHOD_r00 761
-#define _EXPAND_METHOD_KW_r11 762
-#define _FATAL_ERROR_r00 763
-#define _FATAL_ERROR_r11 764
-#define _FATAL_ERROR_r22 765
-#define _FATAL_ERROR_r33 766
-#define _FORMAT_SIMPLE_r11 767
-#define _FORMAT_WITH_SPEC_r21 768
-#define _FOR_ITER_r23 769
-#define _FOR_ITER_GEN_FRAME_r03 770
-#define _FOR_ITER_GEN_FRAME_r13 771
-#define _FOR_ITER_GEN_FRAME_r23 772
-#define _FOR_ITER_TIER_TWO_r23 773
-#define _GET_AITER_r11 774
-#define _GET_ANEXT_r12 775
-#define _GET_AWAITABLE_r11 776
-#define _GET_ITER_r12 777
-#define _GET_LEN_r12 778
-#define _GET_YIELD_FROM_ITER_r11 779
-#define _GUARD_BINARY_OP_EXTEND_r22 780
-#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 781
-#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 782
-#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 783
-#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 784
-#define _GUARD_BIT_IS_SET_POP_r00 785
-#define _GUARD_BIT_IS_SET_POP_r10 786
-#define _GUARD_BIT_IS_SET_POP_r21 787
-#define _GUARD_BIT_IS_SET_POP_r32 788
-#define _GUARD_BIT_IS_SET_POP_4_r00 789
-#define _GUARD_BIT_IS_SET_POP_4_r10 790
-#define _GUARD_BIT_IS_SET_POP_4_r21 791
-#define _GUARD_BIT_IS_SET_POP_4_r32 792
-#define _GUARD_BIT_IS_SET_POP_5_r00 793
-#define _GUARD_BIT_IS_SET_POP_5_r10 794
-#define _GUARD_BIT_IS_SET_POP_5_r21 795
-#define _GUARD_BIT_IS_SET_POP_5_r32 796
-#define _GUARD_BIT_IS_SET_POP_6_r00 797
-#define _GUARD_BIT_IS_SET_POP_6_r10 798
-#define _GUARD_BIT_IS_SET_POP_6_r21 799
-#define _GUARD_BIT_IS_SET_POP_6_r32 800
-#define _GUARD_BIT_IS_SET_POP_7_r00 801
-#define _GUARD_BIT_IS_SET_POP_7_r10 802
-#define _GUARD_BIT_IS_SET_POP_7_r21 803
-#define _GUARD_BIT_IS_SET_POP_7_r32 804
-#define _GUARD_BIT_IS_UNSET_POP_r00 805
-#define _GUARD_BIT_IS_UNSET_POP_r10 806
-#define _GUARD_BIT_IS_UNSET_POP_r21 807
-#define _GUARD_BIT_IS_UNSET_POP_r32 808
-#define _GUARD_BIT_IS_UNSET_POP_4_r00 809
-#define _GUARD_BIT_IS_UNSET_POP_4_r10 810
-#define _GUARD_BIT_IS_UNSET_POP_4_r21 811
-#define _GUARD_BIT_IS_UNSET_POP_4_r32 812
-#define _GUARD_BIT_IS_UNSET_POP_5_r00 813
-#define _GUARD_BIT_IS_UNSET_POP_5_r10 814
-#define _GUARD_BIT_IS_UNSET_POP_5_r21 815
-#define _GUARD_BIT_IS_UNSET_POP_5_r32 816
-#define _GUARD_BIT_IS_UNSET_POP_6_r00 817
-#define _GUARD_BIT_IS_UNSET_POP_6_r10 818
-#define _GUARD_BIT_IS_UNSET_POP_6_r21 819
-#define _GUARD_BIT_IS_UNSET_POP_6_r32 820
-#define _GUARD_BIT_IS_UNSET_POP_7_r00 821
-#define _GUARD_BIT_IS_UNSET_POP_7_r10 822
-#define _GUARD_BIT_IS_UNSET_POP_7_r21 823
-#define _GUARD_BIT_IS_UNSET_POP_7_r32 824
-#define _GUARD_CALLABLE_ISINSTANCE_r03 825
-#define _GUARD_CALLABLE_ISINSTANCE_r13 826
-#define _GUARD_CALLABLE_ISINSTANCE_r23 827
-#define _GUARD_CALLABLE_ISINSTANCE_r33 828
-#define _GUARD_CALLABLE_LEN_r03 829
-#define _GUARD_CALLABLE_LEN_r13 830
-#define _GUARD_CALLABLE_LEN_r23 831
-#define _GUARD_CALLABLE_LEN_r33 832
-#define _GUARD_CALLABLE_LIST_APPEND_r03 833
-#define _GUARD_CALLABLE_LIST_APPEND_r13 834
-#define _GUARD_CALLABLE_LIST_APPEND_r23 835
-#define _GUARD_CALLABLE_LIST_APPEND_r33 836
-#define _GUARD_CALLABLE_STR_1_r03 837
-#define _GUARD_CALLABLE_STR_1_r13 838
-#define _GUARD_CALLABLE_STR_1_r23 839
-#define _GUARD_CALLABLE_STR_1_r33 840
-#define _GUARD_CALLABLE_TUPLE_1_r03 841
-#define _GUARD_CALLABLE_TUPLE_1_r13 842
-#define _GUARD_CALLABLE_TUPLE_1_r23 843
-#define _GUARD_CALLABLE_TUPLE_1_r33 844
-#define _GUARD_CALLABLE_TYPE_1_r03 845
-#define _GUARD_CALLABLE_TYPE_1_r13 846
-#define _GUARD_CALLABLE_TYPE_1_r23 847
-#define _GUARD_CALLABLE_TYPE_1_r33 848
-#define _GUARD_DORV_NO_DICT_r01 849
-#define _GUARD_DORV_NO_DICT_r11 850
-#define _GUARD_DORV_NO_DICT_r22 851
-#define _GUARD_DORV_NO_DICT_r33 852
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 853
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 854
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 855
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 856
-#define _GUARD_GLOBALS_VERSION_r00 857
-#define _GUARD_GLOBALS_VERSION_r11 858
-#define _GUARD_GLOBALS_VERSION_r22 859
-#define _GUARD_GLOBALS_VERSION_r33 860
-#define _GUARD_IP_RETURN_GENERATOR_r00 861
-#define _GUARD_IP_RETURN_GENERATOR_r11 862
-#define _GUARD_IP_RETURN_GENERATOR_r22 863
-#define _GUARD_IP_RETURN_GENERATOR_r33 864
-#define _GUARD_IP_RETURN_VALUE_r00 865
-#define _GUARD_IP_RETURN_VALUE_r11 866
-#define _GUARD_IP_RETURN_VALUE_r22 867
-#define _GUARD_IP_RETURN_VALUE_r33 868
-#define _GUARD_IP_YIELD_VALUE_r00 869
-#define _GUARD_IP_YIELD_VALUE_r11 870
-#define _GUARD_IP_YIELD_VALUE_r22 871
-#define _GUARD_IP_YIELD_VALUE_r33 872
-#define _GUARD_IP__PUSH_FRAME_r00 873
-#define _GUARD_IP__PUSH_FRAME_r11 874
-#define _GUARD_IP__PUSH_FRAME_r22 875
-#define _GUARD_IP__PUSH_FRAME_r33 876
-#define _GUARD_IS_FALSE_POP_r00 877
-#define _GUARD_IS_FALSE_POP_r10 878
-#define _GUARD_IS_FALSE_POP_r21 879
-#define _GUARD_IS_FALSE_POP_r32 880
-#define _GUARD_IS_NONE_POP_r00 881
-#define _GUARD_IS_NONE_POP_r10 882
-#define _GUARD_IS_NONE_POP_r21 883
-#define _GUARD_IS_NONE_POP_r32 884
-#define _GUARD_IS_NOT_NONE_POP_r10 885
-#define _GUARD_IS_TRUE_POP_r00 886
-#define _GUARD_IS_TRUE_POP_r10 887
-#define _GUARD_IS_TRUE_POP_r21 888
-#define _GUARD_IS_TRUE_POP_r32 889
-#define _GUARD_KEYS_VERSION_r01 890
-#define _GUARD_KEYS_VERSION_r11 891
-#define _GUARD_KEYS_VERSION_r22 892
-#define _GUARD_KEYS_VERSION_r33 893
-#define _GUARD_NOS_COMPACT_ASCII_r02 894
-#define _GUARD_NOS_COMPACT_ASCII_r12 895
-#define _GUARD_NOS_COMPACT_ASCII_r22 896
-#define _GUARD_NOS_COMPACT_ASCII_r33 897
-#define _GUARD_NOS_DICT_r02 898
-#define _GUARD_NOS_DICT_r12 899
-#define _GUARD_NOS_DICT_r22 900
-#define _GUARD_NOS_DICT_r33 901
-#define _GUARD_NOS_FLOAT_r02 902
-#define _GUARD_NOS_FLOAT_r12 903
-#define _GUARD_NOS_FLOAT_r22 904
-#define _GUARD_NOS_FLOAT_r33 905
-#define _GUARD_NOS_INT_r02 906
-#define _GUARD_NOS_INT_r12 907
-#define _GUARD_NOS_INT_r22 908
-#define _GUARD_NOS_INT_r33 909
-#define _GUARD_NOS_LIST_r02 910
-#define _GUARD_NOS_LIST_r12 911
-#define _GUARD_NOS_LIST_r22 912
-#define _GUARD_NOS_LIST_r33 913
-#define _GUARD_NOS_NOT_NULL_r02 914
-#define _GUARD_NOS_NOT_NULL_r12 915
-#define _GUARD_NOS_NOT_NULL_r22 916
-#define _GUARD_NOS_NOT_NULL_r33 917
-#define _GUARD_NOS_NULL_r02 918
-#define _GUARD_NOS_NULL_r12 919
-#define _GUARD_NOS_NULL_r22 920
-#define _GUARD_NOS_NULL_r33 921
-#define _GUARD_NOS_OVERFLOWED_r02 922
-#define _GUARD_NOS_OVERFLOWED_r12 923
-#define _GUARD_NOS_OVERFLOWED_r22 924
-#define _GUARD_NOS_OVERFLOWED_r33 925
-#define _GUARD_NOS_TUPLE_r02 926
-#define _GUARD_NOS_TUPLE_r12 927
-#define _GUARD_NOS_TUPLE_r22 928
-#define _GUARD_NOS_TUPLE_r33 929
-#define _GUARD_NOS_UNICODE_r02 930
-#define _GUARD_NOS_UNICODE_r12 931
-#define _GUARD_NOS_UNICODE_r22 932
-#define _GUARD_NOS_UNICODE_r33 933
-#define _GUARD_NOT_EXHAUSTED_LIST_r02 934
-#define _GUARD_NOT_EXHAUSTED_LIST_r12 935
-#define _GUARD_NOT_EXHAUSTED_LIST_r22 936
-#define _GUARD_NOT_EXHAUSTED_LIST_r33 937
-#define _GUARD_NOT_EXHAUSTED_RANGE_r02 938
-#define _GUARD_NOT_EXHAUSTED_RANGE_r12 939
-#define _GUARD_NOT_EXHAUSTED_RANGE_r22 940
-#define _GUARD_NOT_EXHAUSTED_RANGE_r33 941
-#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 942
-#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 943
-#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 944
-#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 945
-#define _GUARD_THIRD_NULL_r03 946
-#define _GUARD_THIRD_NULL_r13 947
-#define _GUARD_THIRD_NULL_r23 948
-#define _GUARD_THIRD_NULL_r33 949
-#define _GUARD_TOS_ANY_SET_r01 950
-#define _GUARD_TOS_ANY_SET_r11 951
-#define _GUARD_TOS_ANY_SET_r22 952
-#define _GUARD_TOS_ANY_SET_r33 953
-#define _GUARD_TOS_DICT_r01 954
-#define _GUARD_TOS_DICT_r11 955
-#define _GUARD_TOS_DICT_r22 956
-#define _GUARD_TOS_DICT_r33 957
-#define _GUARD_TOS_FLOAT_r01 958
-#define _GUARD_TOS_FLOAT_r11 959
-#define _GUARD_TOS_FLOAT_r22 960
-#define _GUARD_TOS_FLOAT_r33 961
-#define _GUARD_TOS_INT_r01 962
-#define _GUARD_TOS_INT_r11 963
-#define _GUARD_TOS_INT_r22 964
-#define _GUARD_TOS_INT_r33 965
-#define _GUARD_TOS_LIST_r01 966
-#define _GUARD_TOS_LIST_r11 967
-#define _GUARD_TOS_LIST_r22 968
-#define _GUARD_TOS_LIST_r33 969
-#define _GUARD_TOS_OVERFLOWED_r01 970
-#define _GUARD_TOS_OVERFLOWED_r11 971
-#define _GUARD_TOS_OVERFLOWED_r22 972
-#define _GUARD_TOS_OVERFLOWED_r33 973
-#define _GUARD_TOS_SLICE_r01 974
-#define _GUARD_TOS_SLICE_r11 975
-#define _GUARD_TOS_SLICE_r22 976
-#define _GUARD_TOS_SLICE_r33 977
-#define _GUARD_TOS_TUPLE_r01 978
-#define _GUARD_TOS_TUPLE_r11 979
-#define _GUARD_TOS_TUPLE_r22 980
-#define _GUARD_TOS_TUPLE_r33 981
-#define _GUARD_TOS_UNICODE_r01 982
-#define _GUARD_TOS_UNICODE_r11 983
-#define _GUARD_TOS_UNICODE_r22 984
-#define _GUARD_TOS_UNICODE_r33 985
-#define _GUARD_TYPE_VERSION_r01 986
-#define _GUARD_TYPE_VERSION_r11 987
-#define _GUARD_TYPE_VERSION_r22 988
-#define _GUARD_TYPE_VERSION_r33 989
-#define _GUARD_TYPE_VERSION_AND_LOCK_r01 990
-#define _GUARD_TYPE_VERSION_AND_LOCK_r11 991
-#define _GUARD_TYPE_VERSION_AND_LOCK_r22 992
-#define _GUARD_TYPE_VERSION_AND_LOCK_r33 993
-#define _HANDLE_PENDING_AND_DEOPT_r00 994
-#define _HANDLE_PENDING_AND_DEOPT_r10 995
-#define _HANDLE_PENDING_AND_DEOPT_r20 996
-#define _HANDLE_PENDING_AND_DEOPT_r30 997
-#define _IMPORT_FROM_r12 998
-#define _IMPORT_NAME_r21 999
-#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1000
-#define _INIT_CALL_PY_EXACT_ARGS_r01 1001
-#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1002
-#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1003
-#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1004
-#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1005
-#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1006
-#define _INSERT_1_LOAD_CONST_INLINE_r02 1007
-#define _INSERT_1_LOAD_CONST_INLINE_r12 1008
-#define _INSERT_1_LOAD_CONST_INLINE_r23 1009
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1010
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1011
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1012
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1013
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1014
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1015
-#define _INSERT_NULL_r10 1016
-#define _INSTRUMENTED_FOR_ITER_r23 1017
-#define _INSTRUMENTED_INSTRUCTION_r00 1018
-#define _INSTRUMENTED_JUMP_FORWARD_r00 1019
-#define _INSTRUMENTED_JUMP_FORWARD_r11 1020
-#define _INSTRUMENTED_JUMP_FORWARD_r22 1021
-#define _INSTRUMENTED_JUMP_FORWARD_r33 1022
-#define _INSTRUMENTED_LINE_r00 1023
-#define _INSTRUMENTED_NOT_TAKEN_r00 1024
-#define _INSTRUMENTED_NOT_TAKEN_r11 1025
-#define _INSTRUMENTED_NOT_TAKEN_r22 1026
-#define _INSTRUMENTED_NOT_TAKEN_r33 1027
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1028
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1029
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1030
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1031
-#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1032
-#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1033
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1034
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1035
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1036
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1037
-#define _IS_NONE_r11 1038
-#define _IS_OP_r03 1039
-#define _IS_OP_r13 1040
-#define _IS_OP_r23 1041
-#define _ITER_CHECK_LIST_r02 1042
-#define _ITER_CHECK_LIST_r12 1043
-#define _ITER_CHECK_LIST_r22 1044
-#define _ITER_CHECK_LIST_r33 1045
-#define _ITER_CHECK_RANGE_r02 1046
-#define _ITER_CHECK_RANGE_r12 1047
-#define _ITER_CHECK_RANGE_r22 1048
-#define _ITER_CHECK_RANGE_r33 1049
-#define _ITER_CHECK_TUPLE_r02 1050
-#define _ITER_CHECK_TUPLE_r12 1051
-#define _ITER_CHECK_TUPLE_r22 1052
-#define _ITER_CHECK_TUPLE_r33 1053
-#define _ITER_JUMP_LIST_r02 1054
-#define _ITER_JUMP_LIST_r12 1055
-#define _ITER_JUMP_LIST_r22 1056
-#define _ITER_JUMP_LIST_r33 1057
-#define _ITER_JUMP_RANGE_r02 1058
-#define _ITER_JUMP_RANGE_r12 1059
-#define _ITER_JUMP_RANGE_r22 1060
-#define _ITER_JUMP_RANGE_r33 1061
-#define _ITER_JUMP_TUPLE_r02 1062
-#define _ITER_JUMP_TUPLE_r12 1063
-#define _ITER_JUMP_TUPLE_r22 1064
-#define _ITER_JUMP_TUPLE_r33 1065
-#define _ITER_NEXT_LIST_r23 1066
-#define _ITER_NEXT_LIST_TIER_TWO_r23 1067
-#define _ITER_NEXT_RANGE_r03 1068
-#define _ITER_NEXT_RANGE_r13 1069
-#define _ITER_NEXT_RANGE_r23 1070
-#define _ITER_NEXT_TUPLE_r03 1071
-#define _ITER_NEXT_TUPLE_r13 1072
-#define _ITER_NEXT_TUPLE_r23 1073
-#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1074
-#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1075
-#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1076
-#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1077
-#define _JUMP_TO_TOP_r00 1078
-#define _LIST_APPEND_r10 1079
-#define _LIST_EXTEND_r10 1080
-#define _LOAD_ATTR_r10 1081
-#define _LOAD_ATTR_CLASS_r11 1082
-#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1083
-#define _LOAD_ATTR_INSTANCE_VALUE_r02 1084
-#define _LOAD_ATTR_INSTANCE_VALUE_r12 1085
-#define _LOAD_ATTR_INSTANCE_VALUE_r23 1086
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1087
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1088
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1089
-#define _LOAD_ATTR_METHOD_NO_DICT_r02 1090
-#define _LOAD_ATTR_METHOD_NO_DICT_r12 1091
-#define _LOAD_ATTR_METHOD_NO_DICT_r23 1092
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1093
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1094
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1095
-#define _LOAD_ATTR_MODULE_r12 1096
-#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1097
-#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1098
-#define _LOAD_ATTR_PROPERTY_FRAME_r11 1099
-#define _LOAD_ATTR_SLOT_r02 1100
-#define _LOAD_ATTR_SLOT_r12 1101
-#define _LOAD_ATTR_SLOT_r23 1102
-#define _LOAD_ATTR_WITH_HINT_r12 1103
-#define _LOAD_BUILD_CLASS_r01 1104
-#define _LOAD_BYTECODE_r00 1105
-#define _LOAD_COMMON_CONSTANT_r01 1106
-#define _LOAD_COMMON_CONSTANT_r12 1107
-#define _LOAD_COMMON_CONSTANT_r23 1108
-#define _LOAD_CONST_r01 1109
-#define _LOAD_CONST_r12 1110
-#define _LOAD_CONST_r23 1111
-#define _LOAD_CONST_INLINE_r01 1112
-#define _LOAD_CONST_INLINE_r12 1113
-#define _LOAD_CONST_INLINE_r23 1114
-#define _LOAD_CONST_INLINE_BORROW_r01 1115
-#define _LOAD_CONST_INLINE_BORROW_r12 1116
-#define _LOAD_CONST_INLINE_BORROW_r23 1117
-#define _LOAD_CONST_UNDER_INLINE_r02 1118
-#define _LOAD_CONST_UNDER_INLINE_r12 1119
-#define _LOAD_CONST_UNDER_INLINE_r23 1120
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1121
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1122
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1123
-#define _LOAD_DEREF_r01 1124
-#define _LOAD_FAST_r01 1125
-#define _LOAD_FAST_r12 1126
-#define _LOAD_FAST_r23 1127
-#define _LOAD_FAST_0_r01 1128
-#define _LOAD_FAST_0_r12 1129
-#define _LOAD_FAST_0_r23 1130
-#define _LOAD_FAST_1_r01 1131
-#define _LOAD_FAST_1_r12 1132
-#define _LOAD_FAST_1_r23 1133
-#define _LOAD_FAST_2_r01 1134
-#define _LOAD_FAST_2_r12 1135
-#define _LOAD_FAST_2_r23 1136
-#define _LOAD_FAST_3_r01 1137
-#define _LOAD_FAST_3_r12 1138
-#define _LOAD_FAST_3_r23 1139
-#define _LOAD_FAST_4_r01 1140
-#define _LOAD_FAST_4_r12 1141
-#define _LOAD_FAST_4_r23 1142
-#define _LOAD_FAST_5_r01 1143
-#define _LOAD_FAST_5_r12 1144
-#define _LOAD_FAST_5_r23 1145
-#define _LOAD_FAST_6_r01 1146
-#define _LOAD_FAST_6_r12 1147
-#define _LOAD_FAST_6_r23 1148
-#define _LOAD_FAST_7_r01 1149
-#define _LOAD_FAST_7_r12 1150
-#define _LOAD_FAST_7_r23 1151
-#define _LOAD_FAST_AND_CLEAR_r01 1152
-#define _LOAD_FAST_AND_CLEAR_r12 1153
-#define _LOAD_FAST_AND_CLEAR_r23 1154
-#define _LOAD_FAST_BORROW_r01 1155
-#define _LOAD_FAST_BORROW_r12 1156
-#define _LOAD_FAST_BORROW_r23 1157
-#define _LOAD_FAST_BORROW_0_r01 1158
-#define _LOAD_FAST_BORROW_0_r12 1159
-#define _LOAD_FAST_BORROW_0_r23 1160
-#define _LOAD_FAST_BORROW_1_r01 1161
-#define _LOAD_FAST_BORROW_1_r12 1162
-#define _LOAD_FAST_BORROW_1_r23 1163
-#define _LOAD_FAST_BORROW_2_r01 1164
-#define _LOAD_FAST_BORROW_2_r12 1165
-#define _LOAD_FAST_BORROW_2_r23 1166
-#define _LOAD_FAST_BORROW_3_r01 1167
-#define _LOAD_FAST_BORROW_3_r12 1168
-#define _LOAD_FAST_BORROW_3_r23 1169
-#define _LOAD_FAST_BORROW_4_r01 1170
-#define _LOAD_FAST_BORROW_4_r12 1171
-#define _LOAD_FAST_BORROW_4_r23 1172
-#define _LOAD_FAST_BORROW_5_r01 1173
-#define _LOAD_FAST_BORROW_5_r12 1174
-#define _LOAD_FAST_BORROW_5_r23 1175
-#define _LOAD_FAST_BORROW_6_r01 1176
-#define _LOAD_FAST_BORROW_6_r12 1177
-#define _LOAD_FAST_BORROW_6_r23 1178
-#define _LOAD_FAST_BORROW_7_r01 1179
-#define _LOAD_FAST_BORROW_7_r12 1180
-#define _LOAD_FAST_BORROW_7_r23 1181
-#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1182
-#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1183
-#define _LOAD_FAST_CHECK_r01 1184
-#define _LOAD_FAST_CHECK_r12 1185
-#define _LOAD_FAST_CHECK_r23 1186
-#define _LOAD_FAST_LOAD_FAST_r02 1187
-#define _LOAD_FAST_LOAD_FAST_r13 1188
-#define _LOAD_FROM_DICT_OR_DEREF_r11 1189
-#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1190
-#define _LOAD_GLOBAL_r00 1191
-#define _LOAD_GLOBAL_BUILTINS_r01 1192
-#define _LOAD_GLOBAL_MODULE_r01 1193
-#define _LOAD_LOCALS_r01 1194
-#define _LOAD_LOCALS_r12 1195
-#define _LOAD_LOCALS_r23 1196
-#define _LOAD_NAME_r01 1197
-#define _LOAD_SMALL_INT_r01 1198
-#define _LOAD_SMALL_INT_r12 1199
-#define _LOAD_SMALL_INT_r23 1200
-#define _LOAD_SMALL_INT_0_r01 1201
-#define _LOAD_SMALL_INT_0_r12 1202
-#define _LOAD_SMALL_INT_0_r23 1203
-#define _LOAD_SMALL_INT_1_r01 1204
-#define _LOAD_SMALL_INT_1_r12 1205
-#define _LOAD_SMALL_INT_1_r23 1206
-#define _LOAD_SMALL_INT_2_r01 1207
-#define _LOAD_SMALL_INT_2_r12 1208
-#define _LOAD_SMALL_INT_2_r23 1209
-#define _LOAD_SMALL_INT_3_r01 1210
-#define _LOAD_SMALL_INT_3_r12 1211
-#define _LOAD_SMALL_INT_3_r23 1212
-#define _LOAD_SPECIAL_r00 1213
-#define _LOAD_SUPER_ATTR_ATTR_r31 1214
-#define _LOAD_SUPER_ATTR_METHOD_r32 1215
-#define _MAKE_CALLARGS_A_TUPLE_r33 1216
-#define _MAKE_CELL_r00 1217
-#define _MAKE_FUNCTION_r11 1218
-#define _MAKE_WARM_r00 1219
-#define _MAKE_WARM_r11 1220
-#define _MAKE_WARM_r22 1221
-#define _MAKE_WARM_r33 1222
-#define _MAP_ADD_r20 1223
-#define _MATCH_CLASS_r31 1224
-#define _MATCH_KEYS_r23 1225
-#define _MATCH_MAPPING_r02 1226
-#define _MATCH_MAPPING_r12 1227
-#define _MATCH_MAPPING_r23 1228
-#define _MATCH_SEQUENCE_r02 1229
-#define _MATCH_SEQUENCE_r12 1230
-#define _MATCH_SEQUENCE_r23 1231
-#define _MAYBE_EXPAND_METHOD_r00 1232
-#define _MAYBE_EXPAND_METHOD_KW_r11 1233
-#define _MONITOR_CALL_r00 1234
-#define _MONITOR_CALL_KW_r11 1235
-#define _MONITOR_JUMP_BACKWARD_r00 1236
-#define _MONITOR_JUMP_BACKWARD_r11 1237
-#define _MONITOR_JUMP_BACKWARD_r22 1238
-#define _MONITOR_JUMP_BACKWARD_r33 1239
-#define _MONITOR_RESUME_r00 1240
-#define _NOP_r00 1241
-#define _NOP_r11 1242
-#define _NOP_r22 1243
-#define _NOP_r33 1244
-#define _POP_CALL_r20 1245
-#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1246
-#define _POP_CALL_ONE_r30 1247
-#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1248
-#define _POP_CALL_TWO_r30 1249
-#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1250
-#define _POP_EXCEPT_r10 1251
-#define _POP_ITER_r20 1252
-#define _POP_JUMP_IF_FALSE_r00 1253
-#define _POP_JUMP_IF_FALSE_r10 1254
-#define _POP_JUMP_IF_FALSE_r21 1255
-#define _POP_JUMP_IF_FALSE_r32 1256
-#define _POP_JUMP_IF_TRUE_r00 1257
-#define _POP_JUMP_IF_TRUE_r10 1258
-#define _POP_JUMP_IF_TRUE_r21 1259
-#define _POP_JUMP_IF_TRUE_r32 1260
-#define _POP_TOP_r10 1261
-#define _POP_TOP_FLOAT_r00 1262
-#define _POP_TOP_FLOAT_r10 1263
-#define _POP_TOP_FLOAT_r21 1264
-#define _POP_TOP_FLOAT_r32 1265
-#define _POP_TOP_INT_r00 1266
-#define _POP_TOP_INT_r10 1267
-#define _POP_TOP_INT_r21 1268
-#define _POP_TOP_INT_r32 1269
-#define _POP_TOP_LOAD_CONST_INLINE_r11 1270
-#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1271
-#define _POP_TOP_NOP_r00 1272
-#define _POP_TOP_NOP_r10 1273
-#define _POP_TOP_NOP_r21 1274
-#define _POP_TOP_NOP_r32 1275
-#define _POP_TOP_UNICODE_r00 1276
-#define _POP_TOP_UNICODE_r10 1277
-#define _POP_TOP_UNICODE_r21 1278
-#define _POP_TOP_UNICODE_r32 1279
-#define _POP_TWO_r20 1280
-#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1281
-#define _PUSH_EXC_INFO_r02 1282
-#define _PUSH_EXC_INFO_r12 1283
-#define _PUSH_EXC_INFO_r23 1284
-#define _PUSH_FRAME_r10 1285
-#define _PUSH_NULL_r01 1286
-#define _PUSH_NULL_r12 1287
-#define _PUSH_NULL_r23 1288
-#define _PUSH_NULL_CONDITIONAL_r00 1289
-#define _PY_FRAME_EX_r31 1290
-#define _PY_FRAME_GENERAL_r01 1291
-#define _PY_FRAME_KW_r11 1292
-#define _QUICKEN_RESUME_r00 1293
-#define _QUICKEN_RESUME_r11 1294
-#define _QUICKEN_RESUME_r22 1295
-#define _QUICKEN_RESUME_r33 1296
-#define _REPLACE_WITH_TRUE_r02 1297
-#define _REPLACE_WITH_TRUE_r12 1298
-#define _REPLACE_WITH_TRUE_r23 1299
-#define _RESUME_CHECK_r00 1300
-#define _RESUME_CHECK_r11 1301
-#define _RESUME_CHECK_r22 1302
-#define _RESUME_CHECK_r33 1303
-#define _RETURN_GENERATOR_r01 1304
-#define _RETURN_VALUE_r11 1305
-#define _SAVE_RETURN_OFFSET_r00 1306
-#define _SAVE_RETURN_OFFSET_r11 1307
-#define _SAVE_RETURN_OFFSET_r22 1308
-#define _SAVE_RETURN_OFFSET_r33 1309
-#define _SEND_r22 1310
-#define _SEND_GEN_FRAME_r22 1311
-#define _SETUP_ANNOTATIONS_r00 1312
-#define _SET_ADD_r10 1313
-#define _SET_FUNCTION_ATTRIBUTE_r01 1314
-#define _SET_FUNCTION_ATTRIBUTE_r11 1315
-#define _SET_FUNCTION_ATTRIBUTE_r21 1316
-#define _SET_FUNCTION_ATTRIBUTE_r32 1317
-#define _SET_IP_r00 1318
-#define _SET_IP_r11 1319
-#define _SET_IP_r22 1320
-#define _SET_IP_r33 1321
-#define _SET_UPDATE_r10 1322
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1323
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1324
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1325
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1326
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1327
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1328
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1329
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1330
-#define _SPILL_OR_RELOAD_r01 1331
-#define _SPILL_OR_RELOAD_r02 1332
-#define _SPILL_OR_RELOAD_r03 1333
-#define _SPILL_OR_RELOAD_r10 1334
-#define _SPILL_OR_RELOAD_r12 1335
-#define _SPILL_OR_RELOAD_r13 1336
-#define _SPILL_OR_RELOAD_r20 1337
-#define _SPILL_OR_RELOAD_r21 1338
-#define _SPILL_OR_RELOAD_r23 1339
-#define _SPILL_OR_RELOAD_r30 1340
-#define _SPILL_OR_RELOAD_r31 1341
-#define _SPILL_OR_RELOAD_r32 1342
-#define _START_EXECUTOR_r00 1343
-#define _STORE_ATTR_r20 1344
-#define _STORE_ATTR_INSTANCE_VALUE_r21 1345
-#define _STORE_ATTR_SLOT_r21 1346
-#define _STORE_ATTR_WITH_HINT_r21 1347
-#define _STORE_DEREF_r10 1348
-#define _STORE_FAST_LOAD_FAST_r11 1349
-#define _STORE_FAST_STORE_FAST_r20 1350
-#define _STORE_GLOBAL_r10 1351
-#define _STORE_NAME_r10 1352
-#define _STORE_SLICE_r30 1353
-#define _STORE_SUBSCR_r30 1354
-#define _STORE_SUBSCR_DICT_r31 1355
-#define _STORE_SUBSCR_LIST_INT_r32 1356
-#define _SWAP_r11 1357
-#define _SWAP_2_r02 1358
-#define _SWAP_2_r12 1359
-#define _SWAP_2_r22 1360
-#define _SWAP_2_r33 1361
-#define _SWAP_3_r03 1362
-#define _SWAP_3_r13 1363
-#define _SWAP_3_r23 1364
-#define _SWAP_3_r33 1365
-#define _SWAP_FAST_r01 1366
-#define _SWAP_FAST_r11 1367
-#define _SWAP_FAST_r22 1368
-#define _SWAP_FAST_r33 1369
-#define _SWAP_FAST_0_r01 1370
-#define _SWAP_FAST_0_r11 1371
-#define _SWAP_FAST_0_r22 1372
-#define _SWAP_FAST_0_r33 1373
-#define _SWAP_FAST_1_r01 1374
-#define _SWAP_FAST_1_r11 1375
-#define _SWAP_FAST_1_r22 1376
-#define _SWAP_FAST_1_r33 1377
-#define _SWAP_FAST_2_r01 1378
-#define _SWAP_FAST_2_r11 1379
-#define _SWAP_FAST_2_r22 1380
-#define _SWAP_FAST_2_r33 1381
-#define _SWAP_FAST_3_r01 1382
-#define _SWAP_FAST_3_r11 1383
-#define _SWAP_FAST_3_r22 1384
-#define _SWAP_FAST_3_r33 1385
-#define _SWAP_FAST_4_r01 1386
-#define _SWAP_FAST_4_r11 1387
-#define _SWAP_FAST_4_r22 1388
-#define _SWAP_FAST_4_r33 1389
-#define _SWAP_FAST_5_r01 1390
-#define _SWAP_FAST_5_r11 1391
-#define _SWAP_FAST_5_r22 1392
-#define _SWAP_FAST_5_r33 1393
-#define _SWAP_FAST_6_r01 1394
-#define _SWAP_FAST_6_r11 1395
-#define _SWAP_FAST_6_r22 1396
-#define _SWAP_FAST_6_r33 1397
-#define _SWAP_FAST_7_r01 1398
-#define _SWAP_FAST_7_r11 1399
-#define _SWAP_FAST_7_r22 1400
-#define _SWAP_FAST_7_r33 1401
-#define _TIER2_RESUME_CHECK_r00 1402
-#define _TIER2_RESUME_CHECK_r11 1403
-#define _TIER2_RESUME_CHECK_r22 1404
-#define _TIER2_RESUME_CHECK_r33 1405
-#define _TO_BOOL_r11 1406
-#define _TO_BOOL_BOOL_r01 1407
-#define _TO_BOOL_BOOL_r11 1408
-#define _TO_BOOL_BOOL_r22 1409
-#define _TO_BOOL_BOOL_r33 1410
-#define _TO_BOOL_INT_r02 1411
-#define _TO_BOOL_INT_r12 1412
-#define _TO_BOOL_INT_r23 1413
-#define _TO_BOOL_LIST_r02 1414
-#define _TO_BOOL_LIST_r12 1415
-#define _TO_BOOL_LIST_r23 1416
-#define _TO_BOOL_NONE_r01 1417
-#define _TO_BOOL_NONE_r11 1418
-#define _TO_BOOL_NONE_r22 1419
-#define _TO_BOOL_NONE_r33 1420
-#define _TO_BOOL_STR_r02 1421
-#define _TO_BOOL_STR_r12 1422
-#define _TO_BOOL_STR_r23 1423
-#define _TRACE_RECORD_r00 1424
-#define _UNARY_INVERT_r12 1425
-#define _UNARY_NEGATIVE_r12 1426
-#define _UNARY_NOT_r01 1427
-#define _UNARY_NOT_r11 1428
-#define _UNARY_NOT_r22 1429
-#define _UNARY_NOT_r33 1430
-#define _UNPACK_EX_r10 1431
-#define _UNPACK_SEQUENCE_r10 1432
-#define _UNPACK_SEQUENCE_LIST_r10 1433
-#define _UNPACK_SEQUENCE_TUPLE_r10 1434
-#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1435
-#define _WITH_EXCEPT_START_r33 1436
-#define _YIELD_VALUE_r11 1437
-#define MAX_UOP_REGS_ID 1437
+#define _YIELD_VALUE 589
+#define MAX_UOP_ID 589
+#define _BINARY_OP_r23 590
+#define _BINARY_OP_ADD_FLOAT_r03 591
+#define _BINARY_OP_ADD_FLOAT_r13 592
+#define _BINARY_OP_ADD_FLOAT_r23 593
+#define _BINARY_OP_ADD_INT_r03 594
+#define _BINARY_OP_ADD_INT_r13 595
+#define _BINARY_OP_ADD_INT_r23 596
+#define _BINARY_OP_ADD_UNICODE_r03 597
+#define _BINARY_OP_ADD_UNICODE_r13 598
+#define _BINARY_OP_ADD_UNICODE_r23 599
+#define _BINARY_OP_EXTEND_r23 600
+#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 601
+#define _BINARY_OP_MULTIPLY_FLOAT_r03 602
+#define _BINARY_OP_MULTIPLY_FLOAT_r13 603
+#define _BINARY_OP_MULTIPLY_FLOAT_r23 604
+#define _BINARY_OP_MULTIPLY_INT_r03 605
+#define _BINARY_OP_MULTIPLY_INT_r13 606
+#define _BINARY_OP_MULTIPLY_INT_r23 607
+#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 608
+#define _BINARY_OP_SUBSCR_DICT_r23 609
+#define _BINARY_OP_SUBSCR_INIT_CALL_r01 610
+#define _BINARY_OP_SUBSCR_INIT_CALL_r11 611
+#define _BINARY_OP_SUBSCR_INIT_CALL_r21 612
+#define _BINARY_OP_SUBSCR_INIT_CALL_r31 613
+#define _BINARY_OP_SUBSCR_LIST_INT_r23 614
+#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 615
+#define _BINARY_OP_SUBSCR_STR_INT_r23 616
+#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 617
+#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 618
+#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 619
+#define _BINARY_OP_SUBSCR_USTR_INT_r23 620
+#define _BINARY_OP_SUBTRACT_FLOAT_r03 621
+#define _BINARY_OP_SUBTRACT_FLOAT_r13 622
+#define _BINARY_OP_SUBTRACT_FLOAT_r23 623
+#define _BINARY_OP_SUBTRACT_INT_r03 624
+#define _BINARY_OP_SUBTRACT_INT_r13 625
+#define _BINARY_OP_SUBTRACT_INT_r23 626
+#define _BINARY_SLICE_r31 627
+#define _BUILD_INTERPOLATION_r01 628
+#define _BUILD_LIST_r01 629
+#define _BUILD_MAP_r01 630
+#define _BUILD_SET_r01 631
+#define _BUILD_SLICE_r01 632
+#define _BUILD_STRING_r01 633
+#define _BUILD_TEMPLATE_r21 634
+#define _BUILD_TUPLE_r01 635
+#define _CALL_BUILTIN_CLASS_r01 636
+#define _CALL_BUILTIN_FAST_r01 637
+#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 638
+#define _CALL_BUILTIN_O_r03 639
+#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 640
+#define _CALL_INTRINSIC_1_r11 641
+#define _CALL_INTRINSIC_2_r21 642
+#define _CALL_ISINSTANCE_r31 643
+#define _CALL_KW_NON_PY_r11 644
+#define _CALL_LEN_r33 645
+#define _CALL_LIST_APPEND_r03 646
+#define _CALL_LIST_APPEND_r13 647
+#define _CALL_LIST_APPEND_r23 648
+#define _CALL_LIST_APPEND_r33 649
+#define _CALL_METHOD_DESCRIPTOR_FAST_r01 650
+#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 651
+#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 652
+#define _CALL_METHOD_DESCRIPTOR_O_r03 653
+#define _CALL_NON_PY_GENERAL_r01 654
+#define _CALL_STR_1_r32 655
+#define _CALL_TUPLE_1_r32 656
+#define _CALL_TYPE_1_r02 657
+#define _CALL_TYPE_1_r12 658
+#define _CALL_TYPE_1_r22 659
+#define _CALL_TYPE_1_r32 660
+#define _CHECK_AND_ALLOCATE_OBJECT_r00 661
+#define _CHECK_ATTR_CLASS_r01 662
+#define _CHECK_ATTR_CLASS_r11 663
+#define _CHECK_ATTR_CLASS_r22 664
+#define _CHECK_ATTR_CLASS_r33 665
+#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 666
+#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 667
+#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 668
+#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 669
+#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 670
+#define _CHECK_EG_MATCH_r22 671
+#define _CHECK_EXC_MATCH_r22 672
+#define _CHECK_FUNCTION_EXACT_ARGS_r00 673
+#define _CHECK_FUNCTION_VERSION_r00 674
+#define _CHECK_FUNCTION_VERSION_INLINE_r00 675
+#define _CHECK_FUNCTION_VERSION_INLINE_r11 676
+#define _CHECK_FUNCTION_VERSION_INLINE_r22 677
+#define _CHECK_FUNCTION_VERSION_INLINE_r33 678
+#define _CHECK_FUNCTION_VERSION_KW_r11 679
+#define _CHECK_IS_NOT_PY_CALLABLE_r00 680
+#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 681
+#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 682
+#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 683
+#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 684
+#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 685
+#define _CHECK_IS_PY_CALLABLE_EX_r03 686
+#define _CHECK_IS_PY_CALLABLE_EX_r13 687
+#define _CHECK_IS_PY_CALLABLE_EX_r23 688
+#define _CHECK_IS_PY_CALLABLE_EX_r33 689
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 690
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 691
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 692
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 693
+#define _CHECK_METHOD_VERSION_r00 694
+#define _CHECK_METHOD_VERSION_KW_r11 695
+#define _CHECK_PEP_523_r00 696
+#define _CHECK_PEP_523_r11 697
+#define _CHECK_PEP_523_r22 698
+#define _CHECK_PEP_523_r33 699
+#define _CHECK_PERIODIC_r00 700
+#define _CHECK_PERIODIC_AT_END_r00 701
+#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 702
+#define _CHECK_RECURSION_REMAINING_r00 703
+#define _CHECK_RECURSION_REMAINING_r11 704
+#define _CHECK_RECURSION_REMAINING_r22 705
+#define _CHECK_RECURSION_REMAINING_r33 706
+#define _CHECK_STACK_SPACE_r00 707
+#define _CHECK_STACK_SPACE_OPERAND_r00 708
+#define _CHECK_STACK_SPACE_OPERAND_r11 709
+#define _CHECK_STACK_SPACE_OPERAND_r22 710
+#define _CHECK_STACK_SPACE_OPERAND_r33 711
+#define _CHECK_VALIDITY_r00 712
+#define _CHECK_VALIDITY_r11 713
+#define _CHECK_VALIDITY_r22 714
+#define _CHECK_VALIDITY_r33 715
+#define _COLD_DYNAMIC_EXIT_r00 716
+#define _COLD_EXIT_r00 717
+#define _COMPARE_OP_r21 718
+#define _COMPARE_OP_FLOAT_r03 719
+#define _COMPARE_OP_FLOAT_r13 720
+#define _COMPARE_OP_FLOAT_r23 721
+#define _COMPARE_OP_INT_r23 722
+#define _COMPARE_OP_STR_r23 723
+#define _CONTAINS_OP_r23 724
+#define _CONTAINS_OP_DICT_r23 725
+#define _CONTAINS_OP_SET_r23 726
+#define _CONVERT_VALUE_r11 727
+#define _COPY_r01 728
+#define _COPY_1_r02 729
+#define _COPY_1_r12 730
+#define _COPY_1_r23 731
+#define _COPY_2_r03 732
+#define _COPY_2_r13 733
+#define _COPY_2_r23 734
+#define _COPY_3_r03 735
+#define _COPY_3_r13 736
+#define _COPY_3_r23 737
+#define _COPY_3_r33 738
+#define _COPY_FREE_VARS_r00 739
+#define _COPY_FREE_VARS_r11 740
+#define _COPY_FREE_VARS_r22 741
+#define _COPY_FREE_VARS_r33 742
+#define _CREATE_INIT_FRAME_r01 743
+#define _DELETE_ATTR_r10 744
+#define _DELETE_DEREF_r00 745
+#define _DELETE_FAST_r00 746
+#define _DELETE_GLOBAL_r00 747
+#define _DELETE_NAME_r00 748
+#define _DELETE_SUBSCR_r20 749
+#define _DEOPT_r00 750
+#define _DEOPT_r10 751
+#define _DEOPT_r20 752
+#define _DEOPT_r30 753
+#define _DICT_MERGE_r10 754
+#define _DICT_UPDATE_r10 755
+#define _DO_CALL_r01 756
+#define _DO_CALL_FUNCTION_EX_r31 757
+#define _DO_CALL_KW_r11 758
+#define _DYNAMIC_EXIT_r00 759
+#define _DYNAMIC_EXIT_r10 760
+#define _DYNAMIC_EXIT_r20 761
+#define _DYNAMIC_EXIT_r30 762
+#define _END_FOR_r10 763
+#define _END_SEND_r21 764
+#define _ERROR_POP_N_r00 765
+#define _EXIT_INIT_CHECK_r10 766
+#define _EXIT_TRACE_r00 767
+#define _EXIT_TRACE_r10 768
+#define _EXIT_TRACE_r20 769
+#define _EXIT_TRACE_r30 770
+#define _EXPAND_METHOD_r00 771
+#define _EXPAND_METHOD_KW_r11 772
+#define _FATAL_ERROR_r00 773
+#define _FATAL_ERROR_r11 774
+#define _FATAL_ERROR_r22 775
+#define _FATAL_ERROR_r33 776
+#define _FORMAT_SIMPLE_r11 777
+#define _FORMAT_WITH_SPEC_r21 778
+#define _FOR_ITER_r23 779
+#define _FOR_ITER_GEN_FRAME_r03 780
+#define _FOR_ITER_GEN_FRAME_r13 781
+#define _FOR_ITER_GEN_FRAME_r23 782
+#define _FOR_ITER_TIER_TWO_r23 783
+#define _GET_AITER_r11 784
+#define _GET_ANEXT_r12 785
+#define _GET_AWAITABLE_r11 786
+#define _GET_ITER_r12 787
+#define _GET_LEN_r12 788
+#define _GET_YIELD_FROM_ITER_r11 789
+#define _GUARD_BINARY_OP_EXTEND_r22 790
+#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 791
+#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 792
+#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 793
+#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 794
+#define _GUARD_BIT_IS_SET_POP_r00 795
+#define _GUARD_BIT_IS_SET_POP_r10 796
+#define _GUARD_BIT_IS_SET_POP_r21 797
+#define _GUARD_BIT_IS_SET_POP_r32 798
+#define _GUARD_BIT_IS_SET_POP_4_r00 799
+#define _GUARD_BIT_IS_SET_POP_4_r10 800
+#define _GUARD_BIT_IS_SET_POP_4_r21 801
+#define _GUARD_BIT_IS_SET_POP_4_r32 802
+#define _GUARD_BIT_IS_SET_POP_5_r00 803
+#define _GUARD_BIT_IS_SET_POP_5_r10 804
+#define _GUARD_BIT_IS_SET_POP_5_r21 805
+#define _GUARD_BIT_IS_SET_POP_5_r32 806
+#define _GUARD_BIT_IS_SET_POP_6_r00 807
+#define _GUARD_BIT_IS_SET_POP_6_r10 808
+#define _GUARD_BIT_IS_SET_POP_6_r21 809
+#define _GUARD_BIT_IS_SET_POP_6_r32 810
+#define _GUARD_BIT_IS_SET_POP_7_r00 811
+#define _GUARD_BIT_IS_SET_POP_7_r10 812
+#define _GUARD_BIT_IS_SET_POP_7_r21 813
+#define _GUARD_BIT_IS_SET_POP_7_r32 814
+#define _GUARD_BIT_IS_UNSET_POP_r00 815
+#define _GUARD_BIT_IS_UNSET_POP_r10 816
+#define _GUARD_BIT_IS_UNSET_POP_r21 817
+#define _GUARD_BIT_IS_UNSET_POP_r32 818
+#define _GUARD_BIT_IS_UNSET_POP_4_r00 819
+#define _GUARD_BIT_IS_UNSET_POP_4_r10 820
+#define _GUARD_BIT_IS_UNSET_POP_4_r21 821
+#define _GUARD_BIT_IS_UNSET_POP_4_r32 822
+#define _GUARD_BIT_IS_UNSET_POP_5_r00 823
+#define _GUARD_BIT_IS_UNSET_POP_5_r10 824
+#define _GUARD_BIT_IS_UNSET_POP_5_r21 825
+#define _GUARD_BIT_IS_UNSET_POP_5_r32 826
+#define _GUARD_BIT_IS_UNSET_POP_6_r00 827
+#define _GUARD_BIT_IS_UNSET_POP_6_r10 828
+#define _GUARD_BIT_IS_UNSET_POP_6_r21 829
+#define _GUARD_BIT_IS_UNSET_POP_6_r32 830
+#define _GUARD_BIT_IS_UNSET_POP_7_r00 831
+#define _GUARD_BIT_IS_UNSET_POP_7_r10 832
+#define _GUARD_BIT_IS_UNSET_POP_7_r21 833
+#define _GUARD_BIT_IS_UNSET_POP_7_r32 834
+#define _GUARD_CALLABLE_ISINSTANCE_r03 835
+#define _GUARD_CALLABLE_ISINSTANCE_r13 836
+#define _GUARD_CALLABLE_ISINSTANCE_r23 837
+#define _GUARD_CALLABLE_ISINSTANCE_r33 838
+#define _GUARD_CALLABLE_LEN_r03 839
+#define _GUARD_CALLABLE_LEN_r13 840
+#define _GUARD_CALLABLE_LEN_r23 841
+#define _GUARD_CALLABLE_LEN_r33 842
+#define _GUARD_CALLABLE_LIST_APPEND_r03 843
+#define _GUARD_CALLABLE_LIST_APPEND_r13 844
+#define _GUARD_CALLABLE_LIST_APPEND_r23 845
+#define _GUARD_CALLABLE_LIST_APPEND_r33 846
+#define _GUARD_CALLABLE_STR_1_r03 847
+#define _GUARD_CALLABLE_STR_1_r13 848
+#define _GUARD_CALLABLE_STR_1_r23 849
+#define _GUARD_CALLABLE_STR_1_r33 850
+#define _GUARD_CALLABLE_TUPLE_1_r03 851
+#define _GUARD_CALLABLE_TUPLE_1_r13 852
+#define _GUARD_CALLABLE_TUPLE_1_r23 853
+#define _GUARD_CALLABLE_TUPLE_1_r33 854
+#define _GUARD_CALLABLE_TYPE_1_r03 855
+#define _GUARD_CALLABLE_TYPE_1_r13 856
+#define _GUARD_CALLABLE_TYPE_1_r23 857
+#define _GUARD_CALLABLE_TYPE_1_r33 858
+#define _GUARD_DORV_NO_DICT_r01 859
+#define _GUARD_DORV_NO_DICT_r11 860
+#define _GUARD_DORV_NO_DICT_r22 861
+#define _GUARD_DORV_NO_DICT_r33 862
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 863
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 864
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 865
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 866
+#define _GUARD_GLOBALS_VERSION_r00 867
+#define _GUARD_GLOBALS_VERSION_r11 868
+#define _GUARD_GLOBALS_VERSION_r22 869
+#define _GUARD_GLOBALS_VERSION_r33 870
+#define _GUARD_IP_RETURN_GENERATOR_r00 871
+#define _GUARD_IP_RETURN_GENERATOR_r11 872
+#define _GUARD_IP_RETURN_GENERATOR_r22 873
+#define _GUARD_IP_RETURN_GENERATOR_r33 874
+#define _GUARD_IP_RETURN_VALUE_r00 875
+#define _GUARD_IP_RETURN_VALUE_r11 876
+#define _GUARD_IP_RETURN_VALUE_r22 877
+#define _GUARD_IP_RETURN_VALUE_r33 878
+#define _GUARD_IP_YIELD_VALUE_r00 879
+#define _GUARD_IP_YIELD_VALUE_r11 880
+#define _GUARD_IP_YIELD_VALUE_r22 881
+#define _GUARD_IP_YIELD_VALUE_r33 882
+#define _GUARD_IP__PUSH_FRAME_r00 883
+#define _GUARD_IP__PUSH_FRAME_r11 884
+#define _GUARD_IP__PUSH_FRAME_r22 885
+#define _GUARD_IP__PUSH_FRAME_r33 886
+#define _GUARD_IS_FALSE_POP_r00 887
+#define _GUARD_IS_FALSE_POP_r10 888
+#define _GUARD_IS_FALSE_POP_r21 889
+#define _GUARD_IS_FALSE_POP_r32 890
+#define _GUARD_IS_NONE_POP_r00 891
+#define _GUARD_IS_NONE_POP_r10 892
+#define _GUARD_IS_NONE_POP_r21 893
+#define _GUARD_IS_NONE_POP_r32 894
+#define _GUARD_IS_NOT_NONE_POP_r10 895
+#define _GUARD_IS_TRUE_POP_r00 896
+#define _GUARD_IS_TRUE_POP_r10 897
+#define _GUARD_IS_TRUE_POP_r21 898
+#define _GUARD_IS_TRUE_POP_r32 899
+#define _GUARD_KEYS_VERSION_r01 900
+#define _GUARD_KEYS_VERSION_r11 901
+#define _GUARD_KEYS_VERSION_r22 902
+#define _GUARD_KEYS_VERSION_r33 903
+#define _GUARD_NOS_COMPACT_ASCII_r02 904
+#define _GUARD_NOS_COMPACT_ASCII_r12 905
+#define _GUARD_NOS_COMPACT_ASCII_r22 906
+#define _GUARD_NOS_COMPACT_ASCII_r33 907
+#define _GUARD_NOS_DICT_r02 908
+#define _GUARD_NOS_DICT_r12 909
+#define _GUARD_NOS_DICT_r22 910
+#define _GUARD_NOS_DICT_r33 911
+#define _GUARD_NOS_FLOAT_r02 912
+#define _GUARD_NOS_FLOAT_r12 913
+#define _GUARD_NOS_FLOAT_r22 914
+#define _GUARD_NOS_FLOAT_r33 915
+#define _GUARD_NOS_INT_r02 916
+#define _GUARD_NOS_INT_r12 917
+#define _GUARD_NOS_INT_r22 918
+#define _GUARD_NOS_INT_r33 919
+#define _GUARD_NOS_LIST_r02 920
+#define _GUARD_NOS_LIST_r12 921
+#define _GUARD_NOS_LIST_r22 922
+#define _GUARD_NOS_LIST_r33 923
+#define _GUARD_NOS_NOT_NULL_r02 924
+#define _GUARD_NOS_NOT_NULL_r12 925
+#define _GUARD_NOS_NOT_NULL_r22 926
+#define _GUARD_NOS_NOT_NULL_r33 927
+#define _GUARD_NOS_NULL_r02 928
+#define _GUARD_NOS_NULL_r12 929
+#define _GUARD_NOS_NULL_r22 930
+#define _GUARD_NOS_NULL_r33 931
+#define _GUARD_NOS_OVERFLOWED_r02 932
+#define _GUARD_NOS_OVERFLOWED_r12 933
+#define _GUARD_NOS_OVERFLOWED_r22 934
+#define _GUARD_NOS_OVERFLOWED_r33 935
+#define _GUARD_NOS_TUPLE_r02 936
+#define _GUARD_NOS_TUPLE_r12 937
+#define _GUARD_NOS_TUPLE_r22 938
+#define _GUARD_NOS_TUPLE_r33 939
+#define _GUARD_NOS_UNICODE_r02 940
+#define _GUARD_NOS_UNICODE_r12 941
+#define _GUARD_NOS_UNICODE_r22 942
+#define _GUARD_NOS_UNICODE_r33 943
+#define _GUARD_NOT_EXHAUSTED_LIST_r02 944
+#define _GUARD_NOT_EXHAUSTED_LIST_r12 945
+#define _GUARD_NOT_EXHAUSTED_LIST_r22 946
+#define _GUARD_NOT_EXHAUSTED_LIST_r33 947
+#define _GUARD_NOT_EXHAUSTED_RANGE_r02 948
+#define _GUARD_NOT_EXHAUSTED_RANGE_r12 949
+#define _GUARD_NOT_EXHAUSTED_RANGE_r22 950
+#define _GUARD_NOT_EXHAUSTED_RANGE_r33 951
+#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 952
+#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 953
+#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 954
+#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 955
+#define _GUARD_THIRD_NULL_r03 956
+#define _GUARD_THIRD_NULL_r13 957
+#define _GUARD_THIRD_NULL_r23 958
+#define _GUARD_THIRD_NULL_r33 959
+#define _GUARD_TOS_ANY_SET_r01 960
+#define _GUARD_TOS_ANY_SET_r11 961
+#define _GUARD_TOS_ANY_SET_r22 962
+#define _GUARD_TOS_ANY_SET_r33 963
+#define _GUARD_TOS_DICT_r01 964
+#define _GUARD_TOS_DICT_r11 965
+#define _GUARD_TOS_DICT_r22 966
+#define _GUARD_TOS_DICT_r33 967
+#define _GUARD_TOS_FLOAT_r01 968
+#define _GUARD_TOS_FLOAT_r11 969
+#define _GUARD_TOS_FLOAT_r22 970
+#define _GUARD_TOS_FLOAT_r33 971
+#define _GUARD_TOS_INT_r01 972
+#define _GUARD_TOS_INT_r11 973
+#define _GUARD_TOS_INT_r22 974
+#define _GUARD_TOS_INT_r33 975
+#define _GUARD_TOS_LIST_r01 976
+#define _GUARD_TOS_LIST_r11 977
+#define _GUARD_TOS_LIST_r22 978
+#define _GUARD_TOS_LIST_r33 979
+#define _GUARD_TOS_OVERFLOWED_r01 980
+#define _GUARD_TOS_OVERFLOWED_r11 981
+#define _GUARD_TOS_OVERFLOWED_r22 982
+#define _GUARD_TOS_OVERFLOWED_r33 983
+#define _GUARD_TOS_SLICE_r01 984
+#define _GUARD_TOS_SLICE_r11 985
+#define _GUARD_TOS_SLICE_r22 986
+#define _GUARD_TOS_SLICE_r33 987
+#define _GUARD_TOS_TUPLE_r01 988
+#define _GUARD_TOS_TUPLE_r11 989
+#define _GUARD_TOS_TUPLE_r22 990
+#define _GUARD_TOS_TUPLE_r33 991
+#define _GUARD_TOS_UNICODE_r01 992
+#define _GUARD_TOS_UNICODE_r11 993
+#define _GUARD_TOS_UNICODE_r22 994
+#define _GUARD_TOS_UNICODE_r33 995
+#define _GUARD_TYPE_VERSION_r01 996
+#define _GUARD_TYPE_VERSION_r11 997
+#define _GUARD_TYPE_VERSION_r22 998
+#define _GUARD_TYPE_VERSION_r33 999
+#define _GUARD_TYPE_VERSION_AND_LOCK_r01 1000
+#define _GUARD_TYPE_VERSION_AND_LOCK_r11 1001
+#define _GUARD_TYPE_VERSION_AND_LOCK_r22 1002
+#define _GUARD_TYPE_VERSION_AND_LOCK_r33 1003
+#define _HANDLE_PENDING_AND_DEOPT_r00 1004
+#define _HANDLE_PENDING_AND_DEOPT_r10 1005
+#define _HANDLE_PENDING_AND_DEOPT_r20 1006
+#define _HANDLE_PENDING_AND_DEOPT_r30 1007
+#define _IMPORT_FROM_r12 1008
+#define _IMPORT_NAME_r21 1009
+#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1010
+#define _INIT_CALL_PY_EXACT_ARGS_r01 1011
+#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1012
+#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1013
+#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1014
+#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1015
+#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1016
+#define _INSERT_1_LOAD_CONST_INLINE_r02 1017
+#define _INSERT_1_LOAD_CONST_INLINE_r12 1018
+#define _INSERT_1_LOAD_CONST_INLINE_r23 1019
+#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1020
+#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1021
+#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1022
+#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1023
+#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1024
+#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1025
+#define _INSERT_NULL_r10 1026
+#define _INSTRUMENTED_FOR_ITER_r23 1027
+#define _INSTRUMENTED_INSTRUCTION_r00 1028
+#define _INSTRUMENTED_JUMP_FORWARD_r00 1029
+#define _INSTRUMENTED_JUMP_FORWARD_r11 1030
+#define _INSTRUMENTED_JUMP_FORWARD_r22 1031
+#define _INSTRUMENTED_JUMP_FORWARD_r33 1032
+#define _INSTRUMENTED_LINE_r00 1033
+#define _INSTRUMENTED_NOT_TAKEN_r00 1034
+#define _INSTRUMENTED_NOT_TAKEN_r11 1035
+#define _INSTRUMENTED_NOT_TAKEN_r22 1036
+#define _INSTRUMENTED_NOT_TAKEN_r33 1037
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1038
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1039
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1040
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1041
+#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1042
+#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1043
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1044
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1045
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1046
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1047
+#define _IS_NONE_r11 1048
+#define _IS_OP_r03 1049
+#define _IS_OP_r13 1050
+#define _IS_OP_r23 1051
+#define _ITER_CHECK_LIST_r02 1052
+#define _ITER_CHECK_LIST_r12 1053
+#define _ITER_CHECK_LIST_r22 1054
+#define _ITER_CHECK_LIST_r33 1055
+#define _ITER_CHECK_RANGE_r02 1056
+#define _ITER_CHECK_RANGE_r12 1057
+#define _ITER_CHECK_RANGE_r22 1058
+#define _ITER_CHECK_RANGE_r33 1059
+#define _ITER_CHECK_TUPLE_r02 1060
+#define _ITER_CHECK_TUPLE_r12 1061
+#define _ITER_CHECK_TUPLE_r22 1062
+#define _ITER_CHECK_TUPLE_r33 1063
+#define _ITER_JUMP_LIST_r02 1064
+#define _ITER_JUMP_LIST_r12 1065
+#define _ITER_JUMP_LIST_r22 1066
+#define _ITER_JUMP_LIST_r33 1067
+#define _ITER_JUMP_RANGE_r02 1068
+#define _ITER_JUMP_RANGE_r12 1069
+#define _ITER_JUMP_RANGE_r22 1070
+#define _ITER_JUMP_RANGE_r33 1071
+#define _ITER_JUMP_TUPLE_r02 1072
+#define _ITER_JUMP_TUPLE_r12 1073
+#define _ITER_JUMP_TUPLE_r22 1074
+#define _ITER_JUMP_TUPLE_r33 1075
+#define _ITER_NEXT_LIST_r23 1076
+#define _ITER_NEXT_LIST_TIER_TWO_r23 1077
+#define _ITER_NEXT_RANGE_r03 1078
+#define _ITER_NEXT_RANGE_r13 1079
+#define _ITER_NEXT_RANGE_r23 1080
+#define _ITER_NEXT_TUPLE_r03 1081
+#define _ITER_NEXT_TUPLE_r13 1082
+#define _ITER_NEXT_TUPLE_r23 1083
+#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1084
+#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1085
+#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1086
+#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1087
+#define _JUMP_TO_TOP_r00 1088
+#define _LIST_APPEND_r10 1089
+#define _LIST_EXTEND_r10 1090
+#define _LOAD_ATTR_r10 1091
+#define _LOAD_ATTR_CLASS_r11 1092
+#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1093
+#define _LOAD_ATTR_INSTANCE_VALUE_r02 1094
+#define _LOAD_ATTR_INSTANCE_VALUE_r12 1095
+#define _LOAD_ATTR_INSTANCE_VALUE_r23 1096
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1097
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1098
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1099
+#define _LOAD_ATTR_METHOD_NO_DICT_r02 1100
+#define _LOAD_ATTR_METHOD_NO_DICT_r12 1101
+#define _LOAD_ATTR_METHOD_NO_DICT_r23 1102
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1103
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1104
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1105
+#define _LOAD_ATTR_MODULE_r12 1106
+#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1107
+#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1108
+#define _LOAD_ATTR_PROPERTY_FRAME_r11 1109
+#define _LOAD_ATTR_SLOT_r02 1110
+#define _LOAD_ATTR_SLOT_r12 1111
+#define _LOAD_ATTR_SLOT_r23 1112
+#define _LOAD_ATTR_WITH_HINT_r12 1113
+#define _LOAD_BUILD_CLASS_r01 1114
+#define _LOAD_BYTECODE_r00 1115
+#define _LOAD_COMMON_CONSTANT_r01 1116
+#define _LOAD_COMMON_CONSTANT_r12 1117
+#define _LOAD_COMMON_CONSTANT_r23 1118
+#define _LOAD_CONST_r01 1119
+#define _LOAD_CONST_r12 1120
+#define _LOAD_CONST_r23 1121
+#define _LOAD_CONST_INLINE_r01 1122
+#define _LOAD_CONST_INLINE_r12 1123
+#define _LOAD_CONST_INLINE_r23 1124
+#define _LOAD_CONST_INLINE_BORROW_r01 1125
+#define _LOAD_CONST_INLINE_BORROW_r12 1126
+#define _LOAD_CONST_INLINE_BORROW_r23 1127
+#define _LOAD_CONST_UNDER_INLINE_r02 1128
+#define _LOAD_CONST_UNDER_INLINE_r12 1129
+#define _LOAD_CONST_UNDER_INLINE_r23 1130
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1131
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1132
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1133
+#define _LOAD_DEREF_r01 1134
+#define _LOAD_FAST_r01 1135
+#define _LOAD_FAST_r12 1136
+#define _LOAD_FAST_r23 1137
+#define _LOAD_FAST_0_r01 1138
+#define _LOAD_FAST_0_r12 1139
+#define _LOAD_FAST_0_r23 1140
+#define _LOAD_FAST_1_r01 1141
+#define _LOAD_FAST_1_r12 1142
+#define _LOAD_FAST_1_r23 1143
+#define _LOAD_FAST_2_r01 1144
+#define _LOAD_FAST_2_r12 1145
+#define _LOAD_FAST_2_r23 1146
+#define _LOAD_FAST_3_r01 1147
+#define _LOAD_FAST_3_r12 1148
+#define _LOAD_FAST_3_r23 1149
+#define _LOAD_FAST_4_r01 1150
+#define _LOAD_FAST_4_r12 1151
+#define _LOAD_FAST_4_r23 1152
+#define _LOAD_FAST_5_r01 1153
+#define _LOAD_FAST_5_r12 1154
+#define _LOAD_FAST_5_r23 1155
+#define _LOAD_FAST_6_r01 1156
+#define _LOAD_FAST_6_r12 1157
+#define _LOAD_FAST_6_r23 1158
+#define _LOAD_FAST_7_r01 1159
+#define _LOAD_FAST_7_r12 1160
+#define _LOAD_FAST_7_r23 1161
+#define _LOAD_FAST_AND_CLEAR_r01 1162
+#define _LOAD_FAST_AND_CLEAR_r12 1163
+#define _LOAD_FAST_AND_CLEAR_r23 1164
+#define _LOAD_FAST_BORROW_r01 1165
+#define _LOAD_FAST_BORROW_r12 1166
+#define _LOAD_FAST_BORROW_r23 1167
+#define _LOAD_FAST_BORROW_0_r01 1168
+#define _LOAD_FAST_BORROW_0_r12 1169
+#define _LOAD_FAST_BORROW_0_r23 1170
+#define _LOAD_FAST_BORROW_1_r01 1171
+#define _LOAD_FAST_BORROW_1_r12 1172
+#define _LOAD_FAST_BORROW_1_r23 1173
+#define _LOAD_FAST_BORROW_2_r01 1174
+#define _LOAD_FAST_BORROW_2_r12 1175
+#define _LOAD_FAST_BORROW_2_r23 1176
+#define _LOAD_FAST_BORROW_3_r01 1177
+#define _LOAD_FAST_BORROW_3_r12 1178
+#define _LOAD_FAST_BORROW_3_r23 1179
+#define _LOAD_FAST_BORROW_4_r01 1180
+#define _LOAD_FAST_BORROW_4_r12 1181
+#define _LOAD_FAST_BORROW_4_r23 1182
+#define _LOAD_FAST_BORROW_5_r01 1183
+#define _LOAD_FAST_BORROW_5_r12 1184
+#define _LOAD_FAST_BORROW_5_r23 1185
+#define _LOAD_FAST_BORROW_6_r01 1186
+#define _LOAD_FAST_BORROW_6_r12 1187
+#define _LOAD_FAST_BORROW_6_r23 1188
+#define _LOAD_FAST_BORROW_7_r01 1189
+#define _LOAD_FAST_BORROW_7_r12 1190
+#define _LOAD_FAST_BORROW_7_r23 1191
+#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1192
+#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1193
+#define _LOAD_FAST_CHECK_r01 1194
+#define _LOAD_FAST_CHECK_r12 1195
+#define _LOAD_FAST_CHECK_r23 1196
+#define _LOAD_FAST_LOAD_FAST_r02 1197
+#define _LOAD_FAST_LOAD_FAST_r13 1198
+#define _LOAD_FROM_DICT_OR_DEREF_r11 1199
+#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1200
+#define _LOAD_GLOBAL_r00 1201
+#define _LOAD_GLOBAL_BUILTINS_r01 1202
+#define _LOAD_GLOBAL_MODULE_r01 1203
+#define _LOAD_LOCALS_r01 1204
+#define _LOAD_LOCALS_r12 1205
+#define _LOAD_LOCALS_r23 1206
+#define _LOAD_NAME_r01 1207
+#define _LOAD_SMALL_INT_r01 1208
+#define _LOAD_SMALL_INT_r12 1209
+#define _LOAD_SMALL_INT_r23 1210
+#define _LOAD_SMALL_INT_0_r01 1211
+#define _LOAD_SMALL_INT_0_r12 1212
+#define _LOAD_SMALL_INT_0_r23 1213
+#define _LOAD_SMALL_INT_1_r01 1214
+#define _LOAD_SMALL_INT_1_r12 1215
+#define _LOAD_SMALL_INT_1_r23 1216
+#define _LOAD_SMALL_INT_2_r01 1217
+#define _LOAD_SMALL_INT_2_r12 1218
+#define _LOAD_SMALL_INT_2_r23 1219
+#define _LOAD_SMALL_INT_3_r01 1220
+#define _LOAD_SMALL_INT_3_r12 1221
+#define _LOAD_SMALL_INT_3_r23 1222
+#define _LOAD_SPECIAL_r00 1223
+#define _LOAD_SUPER_ATTR_ATTR_r31 1224
+#define _LOAD_SUPER_ATTR_METHOD_r32 1225
+#define _MAKE_CALLARGS_A_TUPLE_r33 1226
+#define _MAKE_CELL_r00 1227
+#define _MAKE_FUNCTION_r11 1228
+#define _MAKE_WARM_r00 1229
+#define _MAKE_WARM_r11 1230
+#define _MAKE_WARM_r22 1231
+#define _MAKE_WARM_r33 1232
+#define _MAP_ADD_r20 1233
+#define _MATCH_CLASS_r31 1234
+#define _MATCH_KEYS_r23 1235
+#define _MATCH_MAPPING_r02 1236
+#define _MATCH_MAPPING_r12 1237
+#define _MATCH_MAPPING_r23 1238
+#define _MATCH_SEQUENCE_r02 1239
+#define _MATCH_SEQUENCE_r12 1240
+#define _MATCH_SEQUENCE_r23 1241
+#define _MAYBE_EXPAND_METHOD_r00 1242
+#define _MAYBE_EXPAND_METHOD_KW_r11 1243
+#define _MONITOR_CALL_r00 1244
+#define _MONITOR_CALL_KW_r11 1245
+#define _MONITOR_JUMP_BACKWARD_r00 1246
+#define _MONITOR_JUMP_BACKWARD_r11 1247
+#define _MONITOR_JUMP_BACKWARD_r22 1248
+#define _MONITOR_JUMP_BACKWARD_r33 1249
+#define _MONITOR_RESUME_r00 1250
+#define _NOP_r00 1251
+#define _NOP_r11 1252
+#define _NOP_r22 1253
+#define _NOP_r33 1254
+#define _POP_CALL_r20 1255
+#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1256
+#define _POP_CALL_ONE_r30 1257
+#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1258
+#define _POP_CALL_TWO_r30 1259
+#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1260
+#define _POP_EXCEPT_r10 1261
+#define _POP_ITER_r20 1262
+#define _POP_JUMP_IF_FALSE_r00 1263
+#define _POP_JUMP_IF_FALSE_r10 1264
+#define _POP_JUMP_IF_FALSE_r21 1265
+#define _POP_JUMP_IF_FALSE_r32 1266
+#define _POP_JUMP_IF_TRUE_r00 1267
+#define _POP_JUMP_IF_TRUE_r10 1268
+#define _POP_JUMP_IF_TRUE_r21 1269
+#define _POP_JUMP_IF_TRUE_r32 1270
+#define _POP_TOP_r10 1271
+#define _POP_TOP_FLOAT_r00 1272
+#define _POP_TOP_FLOAT_r10 1273
+#define _POP_TOP_FLOAT_r21 1274
+#define _POP_TOP_FLOAT_r32 1275
+#define _POP_TOP_INT_r00 1276
+#define _POP_TOP_INT_r10 1277
+#define _POP_TOP_INT_r21 1278
+#define _POP_TOP_INT_r32 1279
+#define _POP_TOP_LOAD_CONST_INLINE_r11 1280
+#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1281
+#define _POP_TOP_NOP_r00 1282
+#define _POP_TOP_NOP_r10 1283
+#define _POP_TOP_NOP_r21 1284
+#define _POP_TOP_NOP_r32 1285
+#define _POP_TOP_UNICODE_r00 1286
+#define _POP_TOP_UNICODE_r10 1287
+#define _POP_TOP_UNICODE_r21 1288
+#define _POP_TOP_UNICODE_r32 1289
+#define _POP_TWO_r20 1290
+#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1291
+#define _PUSH_EXC_INFO_r02 1292
+#define _PUSH_EXC_INFO_r12 1293
+#define _PUSH_EXC_INFO_r23 1294
+#define _PUSH_FRAME_r10 1295
+#define _PUSH_NULL_r01 1296
+#define _PUSH_NULL_r12 1297
+#define _PUSH_NULL_r23 1298
+#define _PUSH_NULL_CONDITIONAL_r00 1299
+#define _PY_FRAME_EX_r31 1300
+#define _PY_FRAME_GENERAL_r01 1301
+#define _PY_FRAME_KW_r11 1302
+#define _QUICKEN_RESUME_r00 1303
+#define _QUICKEN_RESUME_r11 1304
+#define _QUICKEN_RESUME_r22 1305
+#define _QUICKEN_RESUME_r33 1306
+#define _REPLACE_WITH_TRUE_r02 1307
+#define _REPLACE_WITH_TRUE_r12 1308
+#define _REPLACE_WITH_TRUE_r23 1309
+#define _RESUME_CHECK_r00 1310
+#define _RESUME_CHECK_r11 1311
+#define _RESUME_CHECK_r22 1312
+#define _RESUME_CHECK_r33 1313
+#define _RETURN_GENERATOR_r01 1314
+#define _RETURN_VALUE_r11 1315
+#define _SAVE_RETURN_OFFSET_r00 1316
+#define _SAVE_RETURN_OFFSET_r11 1317
+#define _SAVE_RETURN_OFFSET_r22 1318
+#define _SAVE_RETURN_OFFSET_r33 1319
+#define _SEND_r22 1320
+#define _SEND_GEN_FRAME_r22 1321
+#define _SETUP_ANNOTATIONS_r00 1322
+#define _SET_ADD_r10 1323
+#define _SET_FUNCTION_ATTRIBUTE_r01 1324
+#define _SET_FUNCTION_ATTRIBUTE_r11 1325
+#define _SET_FUNCTION_ATTRIBUTE_r21 1326
+#define _SET_FUNCTION_ATTRIBUTE_r32 1327
+#define _SET_IP_r00 1328
+#define _SET_IP_r11 1329
+#define _SET_IP_r22 1330
+#define _SET_IP_r33 1331
+#define _SET_UPDATE_r10 1332
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1333
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1334
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1335
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1336
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1337
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1338
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1339
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1340
+#define _SPILL_OR_RELOAD_r01 1341
+#define _SPILL_OR_RELOAD_r02 1342
+#define _SPILL_OR_RELOAD_r03 1343
+#define _SPILL_OR_RELOAD_r10 1344
+#define _SPILL_OR_RELOAD_r12 1345
+#define _SPILL_OR_RELOAD_r13 1346
+#define _SPILL_OR_RELOAD_r20 1347
+#define _SPILL_OR_RELOAD_r21 1348
+#define _SPILL_OR_RELOAD_r23 1349
+#define _SPILL_OR_RELOAD_r30 1350
+#define _SPILL_OR_RELOAD_r31 1351
+#define _SPILL_OR_RELOAD_r32 1352
+#define _START_EXECUTOR_r00 1353
+#define _STORE_ATTR_r20 1354
+#define _STORE_ATTR_INSTANCE_VALUE_r21 1355
+#define _STORE_ATTR_SLOT_r21 1356
+#define _STORE_ATTR_WITH_HINT_r21 1357
+#define _STORE_DEREF_r10 1358
+#define _STORE_FAST_LOAD_FAST_r11 1359
+#define _STORE_FAST_STORE_FAST_r20 1360
+#define _STORE_GLOBAL_r10 1361
+#define _STORE_NAME_r10 1362
+#define _STORE_SLICE_r30 1363
+#define _STORE_SUBSCR_r30 1364
+#define _STORE_SUBSCR_DICT_r31 1365
+#define _STORE_SUBSCR_LIST_INT_r32 1366
+#define _SWAP_r11 1367
+#define _SWAP_2_r02 1368
+#define _SWAP_2_r12 1369
+#define _SWAP_2_r22 1370
+#define _SWAP_2_r33 1371
+#define _SWAP_3_r03 1372
+#define _SWAP_3_r13 1373
+#define _SWAP_3_r23 1374
+#define _SWAP_3_r33 1375
+#define _SWAP_FAST_r01 1376
+#define _SWAP_FAST_r11 1377
+#define _SWAP_FAST_r22 1378
+#define _SWAP_FAST_r33 1379
+#define _SWAP_FAST_0_r01 1380
+#define _SWAP_FAST_0_r11 1381
+#define _SWAP_FAST_0_r22 1382
+#define _SWAP_FAST_0_r33 1383
+#define _SWAP_FAST_1_r01 1384
+#define _SWAP_FAST_1_r11 1385
+#define _SWAP_FAST_1_r22 1386
+#define _SWAP_FAST_1_r33 1387
+#define _SWAP_FAST_2_r01 1388
+#define _SWAP_FAST_2_r11 1389
+#define _SWAP_FAST_2_r22 1390
+#define _SWAP_FAST_2_r33 1391
+#define _SWAP_FAST_3_r01 1392
+#define _SWAP_FAST_3_r11 1393
+#define _SWAP_FAST_3_r22 1394
+#define _SWAP_FAST_3_r33 1395
+#define _SWAP_FAST_4_r01 1396
+#define _SWAP_FAST_4_r11 1397
+#define _SWAP_FAST_4_r22 1398
+#define _SWAP_FAST_4_r33 1399
+#define _SWAP_FAST_5_r01 1400
+#define _SWAP_FAST_5_r11 1401
+#define _SWAP_FAST_5_r22 1402
+#define _SWAP_FAST_5_r33 1403
+#define _SWAP_FAST_6_r01 1404
+#define _SWAP_FAST_6_r11 1405
+#define _SWAP_FAST_6_r22 1406
+#define _SWAP_FAST_6_r33 1407
+#define _SWAP_FAST_7_r01 1408
+#define _SWAP_FAST_7_r11 1409
+#define _SWAP_FAST_7_r22 1410
+#define _SWAP_FAST_7_r33 1411
+#define _TIER2_RESUME_CHECK_r00 1412
+#define _TIER2_RESUME_CHECK_r11 1413
+#define _TIER2_RESUME_CHECK_r22 1414
+#define _TIER2_RESUME_CHECK_r33 1415
+#define _TO_BOOL_r11 1416
+#define _TO_BOOL_BOOL_r01 1417
+#define _TO_BOOL_BOOL_r11 1418
+#define _TO_BOOL_BOOL_r22 1419
+#define _TO_BOOL_BOOL_r33 1420
+#define _TO_BOOL_INT_r02 1421
+#define _TO_BOOL_INT_r12 1422
+#define _TO_BOOL_INT_r23 1423
+#define _TO_BOOL_LIST_r02 1424
+#define _TO_BOOL_LIST_r12 1425
+#define _TO_BOOL_LIST_r23 1426
+#define _TO_BOOL_NONE_r01 1427
+#define _TO_BOOL_NONE_r11 1428
+#define _TO_BOOL_NONE_r22 1429
+#define _TO_BOOL_NONE_r33 1430
+#define _TO_BOOL_STR_r02 1431
+#define _TO_BOOL_STR_r12 1432
+#define _TO_BOOL_STR_r23 1433
+#define _TRACE_RECORD_r00 1434
+#define _UNARY_INVERT_r12 1435
+#define _UNARY_NEGATIVE_r12 1436
+#define _UNARY_NOT_r01 1437
+#define _UNARY_NOT_r11 1438
+#define _UNARY_NOT_r22 1439
+#define _UNARY_NOT_r33 1440
+#define _UNPACK_EX_r10 1441
+#define _UNPACK_SEQUENCE_r10 1442
+#define _UNPACK_SEQUENCE_LIST_r10 1443
+#define _UNPACK_SEQUENCE_TUPLE_r10 1444
+#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1445
+#define _WITH_EXCEPT_START_r33 1446
+#define _YIELD_VALUE_r11 1447
+#define MAX_UOP_REGS_ID 1447
 
 #ifdef __cplusplus
 }
index 07c4f0aeb4a95d4f024a050169fc464c4a9001ba..85f2948ece4b4d3a707b88f86293238e0f40da6a 100644 (file)
@@ -374,6 +374,13 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = {
     [_GUARD_IP_YIELD_VALUE] = HAS_EXIT_FLAG,
     [_GUARD_IP_RETURN_VALUE] = HAS_EXIT_FLAG,
     [_GUARD_IP_RETURN_GENERATOR] = HAS_EXIT_FLAG,
+    [_RECORD_TOS] = HAS_RECORDS_VALUE_FLAG,
+    [_RECORD_TOS_TYPE] = HAS_RECORDS_VALUE_FLAG,
+    [_RECORD_NOS] = HAS_RECORDS_VALUE_FLAG,
+    [_RECORD_4OS] = HAS_RECORDS_VALUE_FLAG,
+    [_RECORD_CALLABLE] = HAS_ARG_FLAG | HAS_RECORDS_VALUE_FLAG,
+    [_RECORD_BOUND_METHOD] = HAS_ARG_FLAG | HAS_RECORDS_VALUE_FLAG,
+    [_RECORD_CALLER_CODE] = HAS_RECORDS_VALUE_FLAG,
 };
 
 const ReplicationRange _PyUop_Replication[MAX_UOP_ID+1] = {
@@ -5169,6 +5176,13 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
     [_PY_FRAME_GENERAL_r01] = "_PY_FRAME_GENERAL_r01",
     [_PY_FRAME_KW] = "_PY_FRAME_KW",
     [_PY_FRAME_KW_r11] = "_PY_FRAME_KW_r11",
+    [_RECORD_4OS] = "_RECORD_4OS",
+    [_RECORD_BOUND_METHOD] = "_RECORD_BOUND_METHOD",
+    [_RECORD_CALLABLE] = "_RECORD_CALLABLE",
+    [_RECORD_CALLER_CODE] = "_RECORD_CALLER_CODE",
+    [_RECORD_NOS] = "_RECORD_NOS",
+    [_RECORD_TOS] = "_RECORD_TOS",
+    [_RECORD_TOS_TYPE] = "_RECORD_TOS_TYPE",
     [_REPLACE_WITH_TRUE] = "_REPLACE_WITH_TRUE",
     [_REPLACE_WITH_TRUE_r02] = "_REPLACE_WITH_TRUE_r02",
     [_REPLACE_WITH_TRUE_r12] = "_REPLACE_WITH_TRUE_r12",
@@ -6043,6 +6057,20 @@ int _PyUop_num_popped(int opcode, int oparg)
             return 0;
         case _GUARD_IP_RETURN_GENERATOR:
             return 0;
+        case _RECORD_TOS:
+            return 0;
+        case _RECORD_TOS_TYPE:
+            return 0;
+        case _RECORD_NOS:
+            return 0;
+        case _RECORD_4OS:
+            return 0;
+        case _RECORD_CALLABLE:
+            return 0;
+        case _RECORD_BOUND_METHOD:
+            return 0;
+        case _RECORD_CALLER_CODE:
+            return 0;
         default:
             return -1;
     }
index 8531162943ae351ce7c8cd0cd2ecfb4760833aca..b362a4dfdc6894517ebb047d8c8b45e1bfbc89e8 100644 (file)
@@ -2149,7 +2149,7 @@ Objects/mimalloc/page.o: $(srcdir)/Objects/mimalloc/page-queue.c
 .PHONY: regen-cases
 regen-cases: \
         regen-opcode-ids regen-opcode-targets regen-uop-ids regen-opcode-metadata-py \
-               regen-generated-cases regen-executor-cases regen-optimizer-cases \
+               regen-generated-cases regen-executor-cases regen-optimizer-cases regen-record-functions \
                regen-opcode-metadata regen-uop-metadata regen-test-cases regen-test-opcode-targets
 
 .PHONY: regen-opcode-ids
@@ -2182,6 +2182,12 @@ regen-generated-cases:
            -o $(srcdir)/Python/generated_cases.c.h.new $(srcdir)/Python/bytecodes.c
        $(UPDATE_FILE) $(srcdir)/Python/generated_cases.c.h $(srcdir)/Python/generated_cases.c.h.new
 
+.PHONY: regen-record-functions
+regen-record-functions:
+       $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/record_function_generator.py \
+           -o $(srcdir)/Python/record_functions.c.h.new $(srcdir)/Python/bytecodes.c
+       $(UPDATE_FILE) $(srcdir)/Python/record_functions.c.h $(srcdir)/Python/record_functions.c.h.new
+
 .PHONY: regen-test-cases
 regen-test-cases:
        $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/tier1_generator.py \
@@ -2234,7 +2240,8 @@ Python/ceval.o: \
                $(srcdir)/Python/condvar.h \
                $(srcdir)/Python/generated_cases.c.h \
                $(srcdir)/Python/executor_cases.c.h \
-               $(srcdir)/Python/opcode_targets.h
+               $(srcdir)/Python/opcode_targets.h \
+               $(srcdir)/Python/record_functions.c.h
 
 Python/flowgraph.o: \
                $(srcdir)/Include/internal/pycore_opcode_metadata.h
index f4373a753ed566a76b7ca24ad04287435c37b60f..64c9ffeb4dc4112915323898eb38fb548f483454 100644 (file)
                         oparg >>= 8;
                         insert_exec_at--;
                     }
-                    int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, STACK_LEVEL(), 0, NULL, oparg, NULL);
+                    int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL);
                     if (succ) {
                         ENTER_TRACING();
                     }
             _PyStackRef attr;
             _PyStackRef *null;
             /* Skip 1 cache entry */
-            // _CHECK_ATTR_CLASS
+            // _GUARD_TYPE_VERSION
             {
                 owner = stack_pointer[-1];
                 uint32_t type_version = read_u32(&this_instr[2].cache);
-                PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
-                if (!PyType_Check(owner_o)) {
-                    UPDATE_MISS_STATS(LOAD_ATTR);
-                    assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    JUMP_TO_PREDICTED(LOAD_ATTR);
-                }
+                PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
                 assert(type_version != 0);
-                if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
+                if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
-            // _GUARD_TYPE_VERSION
+            // _CHECK_ATTR_CLASS
             {
                 uint32_t type_version = read_u32(&this_instr[4].cache);
-                PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
+                PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
+                if (!PyType_Check(owner_o)) {
+                    UPDATE_MISS_STATS(LOAD_ATTR);
+                    assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
+                    JUMP_TO_PREDICTED(LOAD_ATTR);
+                }
                 assert(type_version != 0);
-                if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
+                if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
                     JUMP_TO_PREDICTED(LOAD_ATTR);
             _PyStackRef owner;
             _PyStackRef new_frame;
             /* Skip 1 cache entry */
-            // _CHECK_PEP_523
-            {
-                if (IS_PEP523_HOOKED(tstate)) {
-                    UPDATE_MISS_STATS(LOAD_ATTR);
-                    assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    JUMP_TO_PREDICTED(LOAD_ATTR);
-                }
-            }
             // _GUARD_TYPE_VERSION
             {
                 owner = stack_pointer[-1];
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
+            // _CHECK_PEP_523
+            {
+                if (IS_PEP523_HOOKED(tstate)) {
+                    UPDATE_MISS_STATS(LOAD_ATTR);
+                    assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
+                    JUMP_TO_PREDICTED(LOAD_ATTR);
+                }
+            }
             /* Skip 2 cache entries */
             // _LOAD_ATTR_PROPERTY_FRAME
             {
             next_instr += 1;
             INSTRUCTION_STATS(RETURN_GENERATOR);
             _PyStackRef res;
-            assert(PyStackRef_FunctionCheck(frame->f_funcobj));
-            PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            if (gen == NULL) {
-                JUMP_TO_LABEL(error);
+            // _RETURN_GENERATOR
+            {
+                assert(PyStackRef_FunctionCheck(frame->f_funcobj));
+                PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                if (gen == NULL) {
+                    JUMP_TO_LABEL(error);
+                }
+                assert(STACK_LEVEL() <= 2);
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
+                frame->instr_ptr++;
+                _PyFrame_Copy(frame, gen_frame);
+                assert(frame->frame_obj == NULL);
+                gen->gi_frame_state = FRAME_CREATED;
+                gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
+                _Py_LeaveRecursiveCallPy(tstate);
+                _PyInterpreterFrame *prev = frame->previous;
+                _PyThreadState_PopFrame(tstate, frame);
+                frame = tstate->current_frame = prev;
+                LOAD_IP(frame->return_offset);
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
+                LLTRACE_RESUME_FRAME();
             }
-            assert(STACK_LEVEL() <= 2);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
-            frame->instr_ptr++;
-            _PyFrame_Copy(frame, gen_frame);
-            assert(frame->frame_obj == NULL);
-            gen->gi_frame_state = FRAME_CREATED;
-            gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
-            _Py_LeaveRecursiveCallPy(tstate);
-            _PyInterpreterFrame *prev = frame->previous;
-            _PyThreadState_PopFrame(tstate, frame);
-            frame = tstate->current_frame = prev;
-            LOAD_IP(frame->return_offset);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
-            LLTRACE_RESUME_FRAME();
             stack_pointer[0] = res;
             stack_pointer += 1;
             ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
             INSTRUCTION_STATS(RETURN_VALUE);
             _PyStackRef retval;
             _PyStackRef res;
-            retval = stack_pointer[-1];
-            assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
-            _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
-            stack_pointer += -1;
-            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            assert(STACK_LEVEL() == 0);
-            _Py_LeaveRecursiveCallPy(tstate);
-            _PyInterpreterFrame *dying = frame;
-            frame = tstate->current_frame = dying->previous;
-            _PyEval_FrameClearAndPop(tstate, dying);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            LOAD_IP(frame->return_offset);
-            res = temp;
-            LLTRACE_RESUME_FRAME();
+            // _RETURN_VALUE
+            {
+                retval = stack_pointer[-1];
+                assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
+                _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
+                stack_pointer += -1;
+                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                assert(STACK_LEVEL() == 0);
+                _Py_LeaveRecursiveCallPy(tstate);
+                _PyInterpreterFrame *dying = frame;
+                frame = tstate->current_frame = dying->previous;
+                _PyEval_FrameClearAndPop(tstate, dying);
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                LOAD_IP(frame->return_offset);
+                res = temp;
+                LLTRACE_RESUME_FRAME();
+            }
             stack_pointer[0] = res;
             stack_pointer += 1;
             ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                                  opcode == INTERPRETER_EXIT ||
                                  (opcode >= MIN_INSTRUMENTED_OPCODE && opcode != ENTER_EXECUTOR)
             );
+            _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
+            _PyJitTracerState *tracer = _tstate->jit_tracer_state;
+            assert(tracer != NULL);
             _PyFrame_SetStackPointer(frame, stack_pointer);
             int full = !_PyJit_translate_single_bytecode_to_trace(tstate, frame, next_instr, stop_tracing ? _DEOPT : 0);
             stack_pointer = _PyFrame_GetStackPointer(frame);
                 }
                 DISPATCH();
             }
-            _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
-            _PyJitTracerState *tracer = _tstate->jit_tracer_state;
-            assert(tracer != NULL);
+            _PyFrame_SetStackPointer(frame, stack_pointer);
+            Py_CLEAR(tracer->prev_state.recorded_value);
+            stack_pointer = _PyFrame_GetStackPointer(frame);
             tracer->prev_state.instr = next_instr;
             PyObject *prev_code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
             if (tracer->prev_state.instr_code != (PyCodeObject *)prev_code) {
             if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) {
                 (&next_instr[1])->counter = trigger_backoff_counter();
             }
+            uint8_t record_func_index = _PyOpcode_RecordFunctionIndices[opcode];
+            if (record_func_index) {
+                _Py_RecordFuncPtr doesnt_escape = _PyOpcode_RecordFunctions[record_func_index];
+                doesnt_escape(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
+            }
             DISPATCH_GOTO_NON_TRACING();
             #else
             (void)prev_instr;
             INSTRUCTION_STATS(YIELD_VALUE);
             _PyStackRef retval;
             _PyStackRef value;
-            retval = stack_pointer[-1];
-            assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
-            frame->instr_ptr++;
-            PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
-            assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
-            assert(oparg == 0 || oparg == 1);
-            _PyStackRef temp = retval;
-            stack_pointer += -1;
-            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            tstate->exc_info = gen->gi_exc_state.previous_item;
-            gen->gi_exc_state.previous_item = NULL;
-            _Py_LeaveRecursiveCallPy(tstate);
-            _PyInterpreterFrame *gen_frame = frame;
-            frame = tstate->current_frame = frame->previous;
-            gen_frame->previous = NULL;
-            ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
-            FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
-            assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
-            #if TIER_ONE
-            assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
+            // _YIELD_VALUE
+            {
+                retval = stack_pointer[-1];
+                assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
+                frame->instr_ptr++;
+                PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
+                assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
+                assert(oparg == 0 || oparg == 1);
+                _PyStackRef temp = retval;
+                stack_pointer += -1;
+                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                tstate->exc_info = gen->gi_exc_state.previous_item;
+                gen->gi_exc_state.previous_item = NULL;
+                _Py_LeaveRecursiveCallPy(tstate);
+                _PyInterpreterFrame *gen_frame = frame;
+                frame = tstate->current_frame = frame->previous;
+                gen_frame->previous = NULL;
+                ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
+                FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
+                assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
+                #if TIER_ONE
+                assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
                   frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == INTERPRETER_EXIT ||
                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR);
-            #endif
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
-            value = PyStackRef_MakeHeapSafe(temp);
-            LLTRACE_RESUME_FRAME();
+                #endif
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
+                value = PyStackRef_MakeHeapSafe(temp);
+                LLTRACE_RESUME_FRAME();
+            }
             stack_pointer[0] = value;
             stack_pointer += 1;
             ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
index 4c808016a00cb639840d05356f2a0442f92cb184..9e41382240ea5dbfaa2c04d4c4add6cd7f24336d 100644 (file)
@@ -568,6 +568,7 @@ dummy_func(
 
         macro(TO_BOOL_ALWAYS_TRUE) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _REPLACE_WITH_TRUE +
             POP_TOP;
@@ -1107,6 +1108,7 @@ dummy_func(
         }
 
         macro(BINARY_OP_SUBSCR_GETITEM) =
+            _RECORD_TOS +
             unused/5 + // Skip over the counter and cache
             _CHECK_PEP_523 +
             _BINARY_OP_SUBSCR_CHECK_FUNC +
@@ -1267,7 +1269,7 @@ dummy_func(
         // The stack effect here is a bit misleading.
         // retval is popped from the stack, but res
         // is pushed to a different frame, the callers' frame.
-        inst(RETURN_VALUE, (retval -- res)) {
+        op(_RETURN_VALUE, (retval -- res)) {
             assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
             _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
             DEAD(retval);
@@ -1291,9 +1293,13 @@ dummy_func(
             ERROR_IF(err);
         }
 
+        macro(RETURN_VALUE) =
+            _RECORD_CALLER_CODE +
+            _RETURN_VALUE;
+
         macro(INSTRUMENTED_RETURN_VALUE) =
             _RETURN_VALUE_EVENT +
-            RETURN_VALUE;
+            _RETURN_VALUE;
 
         inst(GET_AITER, (obj -- iter)) {
             unaryfunc getter = NULL;
@@ -1434,7 +1440,7 @@ dummy_func(
             _SEND_GEN_FRAME +
             _PUSH_FRAME;
 
-        inst(YIELD_VALUE, (retval -- value)) {
+        op(_YIELD_VALUE, (retval -- value)) {
             // NOTE: It's important that YIELD_VALUE never raises an exception!
             // The compiler treats any exception raised here as a failed close()
             // or throw() call.
@@ -1470,6 +1476,10 @@ dummy_func(
             LLTRACE_RESUME_FRAME();
         }
 
+        macro(YIELD_VALUE) =
+            _RECORD_CALLER_CODE +
+            _YIELD_VALUE;
+
         tier1 op(_YIELD_VALUE_EVENT, (val -- val)) {
             int err = _Py_call_instrumentation_arg(
                     tstate, PY_MONITORING_EVENT_PY_YIELD,
@@ -1485,7 +1495,7 @@ dummy_func(
 
         macro(INSTRUMENTED_YIELD_VALUE) =
             _YIELD_VALUE_EVENT +
-            YIELD_VALUE;
+            _YIELD_VALUE;
 
         inst(POP_EXCEPT, (exc_value -- )) {
             _PyErr_StackItem *exc_info = tstate->exc_info;
@@ -2445,6 +2455,7 @@ dummy_func(
 
         macro(LOAD_ATTR_INSTANCE_VALUE) =
             unused/1 + // Skip over the counter
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _CHECK_MANAGED_OBJECT_HAS_VALUES +
             _LOAD_ATTR_INSTANCE_VALUE +
@@ -2526,6 +2537,7 @@ dummy_func(
 
         macro(LOAD_ATTR_WITH_HINT) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _LOAD_ATTR_WITH_HINT +
             POP_TOP +
@@ -2551,6 +2563,7 @@ dummy_func(
 
         macro(LOAD_ATTR_SLOT) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _LOAD_ATTR_SLOT +  // NOTE: This action may also deopt
             POP_TOP +
@@ -2581,8 +2594,9 @@ dummy_func(
 
         macro(LOAD_ATTR_CLASS_WITH_METACLASS_CHECK) =
             unused/1 +
-            _CHECK_ATTR_CLASS +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
+            _CHECK_ATTR_CLASS +
             _LOAD_ATTR_CLASS +
             _PUSH_NULL_CONDITIONAL;
 
@@ -2604,8 +2618,9 @@ dummy_func(
 
         macro(LOAD_ATTR_PROPERTY) =
             unused/1 +
-            _CHECK_PEP_523 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
+            _CHECK_PEP_523 +
             unused/2 +
             _LOAD_ATTR_PROPERTY_FRAME +
             _SAVE_RETURN_OFFSET +
@@ -2715,6 +2730,7 @@ dummy_func(
 
         macro(STORE_ATTR_WITH_HINT) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _STORE_ATTR_WITH_HINT +
             POP_TOP;
@@ -2735,6 +2751,7 @@ dummy_func(
 
         macro(STORE_ATTR_SLOT) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _STORE_ATTR_SLOT +
             POP_TOP;
@@ -3021,7 +3038,7 @@ dummy_func(
                     oparg >>= 8;
                     insert_exec_at--;
                 }
-                int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, STACK_LEVEL(), 0, NULL, oparg, NULL);
+                int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL);
                 if (succ) {
                     ENTER_TRACING();
                 }
@@ -3506,6 +3523,7 @@ dummy_func(
         }
 
         macro(FOR_ITER_GEN) =
+            _RECORD_NOS +
             unused/1 +
             _CHECK_PEP_523 +
             _FOR_ITER_GEN_FRAME +
@@ -3640,6 +3658,7 @@ dummy_func(
 
         macro(LOAD_ATTR_METHOD_WITH_VALUES) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT +
             _GUARD_KEYS_VERSION +
@@ -3658,6 +3677,7 @@ dummy_func(
 
         macro(LOAD_ATTR_METHOD_NO_DICT) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             unused/2 +
             _LOAD_ATTR_METHOD_NO_DICT;
@@ -3672,6 +3692,7 @@ dummy_func(
 
         macro(LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT +
             _GUARD_KEYS_VERSION +
@@ -3688,6 +3709,7 @@ dummy_func(
 
         macro(LOAD_ATTR_NONDESCRIPTOR_NO_DICT) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             unused/2 +
             _LOAD_ATTR_NONDESCRIPTOR_NO_DICT;
@@ -3711,6 +3733,7 @@ dummy_func(
 
         macro(LOAD_ATTR_METHOD_LAZY_DICT) =
             unused/1 +
+            _RECORD_TOS_TYPE +
             _GUARD_TYPE_VERSION +
             _CHECK_ATTR_METHOD_LAZY_DICT +
             unused/1 +
@@ -3879,6 +3902,7 @@ dummy_func(
         }
 
         macro(CALL_PY_GENERAL) =
+            _RECORD_CALLABLE +
             unused/1 + // Skip over the counter
             _CHECK_PEP_523 +
             _CHECK_FUNCTION_VERSION +
@@ -3909,6 +3933,7 @@ dummy_func(
         }
 
         macro(CALL_BOUND_METHOD_GENERAL) =
+            _RECORD_BOUND_METHOD +
             unused/1 + // Skip over the counter
             _CHECK_PEP_523 +
             _CHECK_METHOD_VERSION +
@@ -3948,6 +3973,7 @@ dummy_func(
         }
 
         macro(CALL_NON_PY_GENERAL) =
+            _RECORD_CALLABLE +
             unused/1 + // Skip over the counter
             unused/2 +
             _CHECK_IS_NOT_PY_CALLABLE +
@@ -4021,6 +4047,7 @@ dummy_func(
         }
 
         macro(CALL_BOUND_METHOD_EXACT_ARGS) =
+            _RECORD_BOUND_METHOD +
             unused/1 + // Skip over the counter
             _CHECK_PEP_523 +
             _CHECK_CALL_BOUND_METHOD_EXACT_ARGS +
@@ -4035,6 +4062,7 @@ dummy_func(
             _PUSH_FRAME;
 
         macro(CALL_PY_EXACT_ARGS) =
+            _RECORD_CALLABLE +
             unused/1 + // Skip over the counter
             _CHECK_PEP_523 +
             _CHECK_FUNCTION_VERSION +
@@ -4187,6 +4215,7 @@ dummy_func(
         }
 
         macro(CALL_ALLOC_AND_ENTER_INIT) =
+            _RECORD_CALLABLE +
             unused/1 +
             _CHECK_PEP_523 +
             _CHECK_AND_ALLOCATE_OBJECT +
@@ -4227,6 +4256,7 @@ dummy_func(
         }
 
         macro(CALL_BUILTIN_CLASS) =
+            _RECORD_CALLABLE +
             unused/1 +
             unused/2 +
             _CALL_BUILTIN_CLASS +
@@ -4262,6 +4292,7 @@ dummy_func(
         }
 
         macro(CALL_BUILTIN_O) =
+            _RECORD_CALLABLE +
             unused/1 +
             unused/2 +
             _CALL_BUILTIN_O +
@@ -4294,6 +4325,7 @@ dummy_func(
         }
 
         macro(CALL_BUILTIN_FAST) =
+            _RECORD_CALLABLE +
             unused/1 +
             unused/2 +
             _CALL_BUILTIN_FAST +
@@ -4320,6 +4352,7 @@ dummy_func(
         }
 
         macro(CALL_BUILTIN_FAST_WITH_KEYWORDS) =
+            _RECORD_CALLABLE +
             unused/1 +
             unused/2 +
             _CALL_BUILTIN_FAST_WITH_KEYWORDS +
@@ -4463,6 +4496,7 @@ dummy_func(
         }
 
         macro(CALL_METHOD_DESCRIPTOR_O) =
+            _RECORD_CALLABLE +
             unused/1 +
             unused/2 +
             _CALL_METHOD_DESCRIPTOR_O +
@@ -4505,6 +4539,7 @@ dummy_func(
         }
 
         macro(CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS) =
+            _RECORD_CALLABLE +
             unused/1 +
             unused/2 +
             _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS +
@@ -4543,6 +4578,7 @@ dummy_func(
         }
 
         macro(CALL_METHOD_DESCRIPTOR_NOARGS) =
+            _RECORD_CALLABLE +
             unused/1 +
             unused/2 +
             _CALL_METHOD_DESCRIPTOR_NOARGS +
@@ -4968,6 +5004,7 @@ dummy_func(
         }
 
         macro(CALL_EX_PY) =
+            _RECORD_4OS +
             unused/1 +
             _CHECK_PEP_523 +
             _MAKE_CALLARGS_A_TUPLE +
@@ -5037,7 +5074,7 @@ dummy_func(
             *ptr = attr;
         }
 
-        inst(RETURN_GENERATOR, (-- res)) {
+        op(_RETURN_GENERATOR, (-- res)) {
             assert(PyStackRef_FunctionCheck(frame->f_funcobj));
             PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
             PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
@@ -5060,6 +5097,10 @@ dummy_func(
             LLTRACE_RESUME_FRAME();
         }
 
+        macro(RETURN_GENERATOR) =
+            _RECORD_CALLER_CODE +
+            _RETURN_GENERATOR;
+
         inst(BUILD_SLICE, (args[oparg] -- slice)) {
             PyObject *start_o = PyStackRef_AsPyObjectBorrow(args[0]);
             PyObject *stop_o = PyStackRef_AsPyObjectBorrow(args[1]);
@@ -5588,7 +5629,7 @@ dummy_func(
                 // Note: it's safe to use target->op.arg here instead of the oparg given by EXTENDED_ARG.
                 // The invariant in the optimizer is the deopt target always points back to the first EXTENDED_ARG.
                 // So setting it to anything else is wrong.
-                int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), chain_depth, exit, target->op.arg, previous_executor);
+                int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, stack_pointer, chain_depth, exit, target->op.arg, previous_executor);
                 exit->temperature = restart_backoff_counter(exit->temperature);
                 if (succ) {
                     GOTO_TIER_ONE_CONTINUE_TRACING(target);
@@ -5607,37 +5648,77 @@ dummy_func(
         }
 
         tier2 op(_GUARD_IP__PUSH_FRAME, (ip/4 --)) {
-            _Py_CODEUNIT *target = frame->instr_ptr + IP_OFFSET_OF(_PUSH_FRAME);
+            _Py_CODEUNIT *target = frame->instr_ptr;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += IP_OFFSET_OF(_PUSH_FRAME);
                 EXIT_IF(true);
             }
         }
 
         tier2 op(_GUARD_IP_YIELD_VALUE, (ip/4 --)) {
-            _Py_CODEUNIT *target = frame->instr_ptr + IP_OFFSET_OF(YIELD_VALUE);
+            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += IP_OFFSET_OF(YIELD_VALUE);
+                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                 EXIT_IF(true);
             }
         }
 
         tier2 op(_GUARD_IP_RETURN_VALUE, (ip/4 --)) {
-            _Py_CODEUNIT *target = frame->instr_ptr + IP_OFFSET_OF(RETURN_VALUE);
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += IP_OFFSET_OF(RETURN_VALUE);
+                frame->instr_ptr += frame->return_offset;
                 EXIT_IF(true);
             }
         }
 
         tier2 op(_GUARD_IP_RETURN_GENERATOR, (ip/4 --)) {
-            _Py_CODEUNIT *target = frame->instr_ptr +  IP_OFFSET_OF(RETURN_GENERATOR);
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += IP_OFFSET_OF(RETURN_GENERATOR);
+                frame->instr_ptr += frame->return_offset;
                 EXIT_IF(true);
             }
         }
 
+        /* Record ops for jit tracer.
+         *
+         * NOTE: These uops are NOPs for normal evaluation.
+         * They are only executed during trace recording */
+
+        tier2 op(_RECORD_TOS, (tos -- tos)) {
+            RECORD_VALUE(PyStackRef_AsPyObjectBorrow(tos));
+        }
+
+        tier2 op(_RECORD_TOS_TYPE, (tos -- tos)) {
+            RECORD_VALUE(Py_TYPE(PyStackRef_AsPyObjectBorrow(tos)));
+        }
+
+        tier2 op(_RECORD_NOS, (nos, tos -- nos, tos)) {
+            RECORD_VALUE(PyStackRef_AsPyObjectBorrow(nos));
+        }
+
+        tier2 op(_RECORD_4OS, (value, _3os, nos, tos -- value, _3os, nos, tos)) {
+            RECORD_VALUE(PyStackRef_AsPyObjectBorrow(value));
+        }
+
+        tier2 op(_RECORD_CALLABLE, (func, self, args[oparg] -- func, self, args[oparg])) {
+            RECORD_VALUE(PyStackRef_AsPyObjectBorrow(func));
+        }
+
+        tier2 op(_RECORD_BOUND_METHOD, (callable, self, args[oparg] -- callable, self, args[oparg])) {
+            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+            if (Py_TYPE(callable_o) == &PyMethod_Type) {
+                PyObject *func = ((PyMethodObject *)callable_o)->im_func;
+                RECORD_VALUE(func);
+            }
+        }
+
+        tier2 op(_RECORD_CALLER_CODE, ( -- )) {
+            _PyInterpreterFrame *caller_frame = frame->previous;
+            if (caller_frame->owner < FRAME_OWNED_BY_INTERPRETER) {
+                PyCodeObject *code = _PyFrame_GetCode(frame->previous);
+                RECORD_VALUE(code);
+            }
+        }
+
         label(pop_2_error) {
             stack_pointer -= 2;
             assert(WITHIN_STACK_BOUNDS());
@@ -5802,6 +5883,9 @@ dummy_func(
                 opcode == INTERPRETER_EXIT ||
                 (opcode >= MIN_INSTRUMENTED_OPCODE && opcode != ENTER_EXECUTOR)
             );
+            _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
+            _PyJitTracerState *tracer = _tstate->jit_tracer_state;
+            assert(tracer != NULL);
             int full = !_PyJit_translate_single_bytecode_to_trace(tstate, frame, next_instr, stop_tracing ? _DEOPT : 0);
             if (full) {
                 LEAVE_TRACING();
@@ -5809,13 +5893,7 @@ dummy_func(
                 ERROR_IF(err < 0);
                 DISPATCH();
             }
-            // Super instructions. Instruction deopted. There's a mismatch in what the stack expects
-            // in the optimizer. So we have to reflect in the trace correctly.
-            _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
-            // JIT should have disabled super instructions, as we can
-            // do these optimizations ourselves in the JIT.
-            _PyJitTracerState *tracer = _tstate->jit_tracer_state;
-            assert(tracer != NULL);
+            Py_CLEAR(tracer->prev_state.recorded_value);
             tracer->prev_state.instr = next_instr;
             PyObject *prev_code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
             if (tracer->prev_state.instr_code != (PyCodeObject *)prev_code) {
@@ -5828,6 +5906,12 @@ dummy_func(
             if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) {
                 (&next_instr[1])->counter = trigger_backoff_counter();
             }
+
+            uint8_t record_func_index = _PyOpcode_RecordFunctionIndices[opcode];
+            if (record_func_index) {
+                _Py_RecordFuncPtr doesnt_escape = _PyOpcode_RecordFunctions[record_func_index];
+                doesnt_escape(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
+            }
             DISPATCH_GOTO_NON_TRACING();
 #else
             (void)prev_instr;
index 8901c25952508103f93dce93dd69e254d9f3026b..339789b61d86aaf1cadd77282eb7e9d058f48b15 100644 (file)
                 _PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit);
                 assert(tstate->current_executor == (PyObject *)previous_executor);
                 int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow;
-                int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), chain_depth, exit, target->op.arg, previous_executor);
+                int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, stack_pointer, chain_depth, exit, target->op.arg, previous_executor);
                 exit->temperature = restart_backoff_counter(exit->temperature);
                 if (succ) {
                     GOTO_TIER_ONE_CONTINUE_TRACING(target);
         case _GUARD_IP__PUSH_FRAME_r00: {
             CHECK_CURRENT_CACHED_VALUES(0);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
-            #define OFFSET_OF__PUSH_FRAME ((0))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF__PUSH_FRAME;
+            _Py_CODEUNIT *target = frame->instr_ptr;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF__PUSH_FRAME;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     SET_CURRENT_CACHED_VALUES(0);
                 }
             }
             SET_CURRENT_CACHED_VALUES(0);
-            #undef OFFSET_OF__PUSH_FRAME
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             CHECK_CURRENT_CACHED_VALUES(1);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef _stack_item_0 = _tos_cache0;
-            #define OFFSET_OF__PUSH_FRAME ((0))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF__PUSH_FRAME;
+            _Py_CODEUNIT *target = frame->instr_ptr;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF__PUSH_FRAME;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache0 = _stack_item_0;
             }
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(1);
-            #undef OFFSET_OF__PUSH_FRAME
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef _stack_item_0 = _tos_cache0;
             _PyStackRef _stack_item_1 = _tos_cache1;
-            #define OFFSET_OF__PUSH_FRAME ((0))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF__PUSH_FRAME;
+            _Py_CODEUNIT *target = frame->instr_ptr;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF__PUSH_FRAME;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache1 = _stack_item_1;
             _tos_cache1 = _stack_item_1;
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(2);
-            #undef OFFSET_OF__PUSH_FRAME
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             _PyStackRef _stack_item_0 = _tos_cache0;
             _PyStackRef _stack_item_1 = _tos_cache1;
             _PyStackRef _stack_item_2 = _tos_cache2;
-            #define OFFSET_OF__PUSH_FRAME ((0))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF__PUSH_FRAME;
+            _Py_CODEUNIT *target = frame->instr_ptr;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF__PUSH_FRAME;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache2 = _stack_item_2;
             _tos_cache1 = _stack_item_1;
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(3);
-            #undef OFFSET_OF__PUSH_FRAME
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
         case _GUARD_IP_YIELD_VALUE_r00: {
             CHECK_CURRENT_CACHED_VALUES(0);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
-            #define OFFSET_OF_YIELD_VALUE ((1+INLINE_CACHE_ENTRIES_SEND))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_YIELD_VALUE;
+            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_YIELD_VALUE;
+                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     SET_CURRENT_CACHED_VALUES(0);
                 }
             }
             SET_CURRENT_CACHED_VALUES(0);
-            #undef OFFSET_OF_YIELD_VALUE
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             CHECK_CURRENT_CACHED_VALUES(1);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef _stack_item_0 = _tos_cache0;
-            #define OFFSET_OF_YIELD_VALUE ((1+INLINE_CACHE_ENTRIES_SEND))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_YIELD_VALUE;
+            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_YIELD_VALUE;
+                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache0 = _stack_item_0;
             }
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(1);
-            #undef OFFSET_OF_YIELD_VALUE
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef _stack_item_0 = _tos_cache0;
             _PyStackRef _stack_item_1 = _tos_cache1;
-            #define OFFSET_OF_YIELD_VALUE ((1+INLINE_CACHE_ENTRIES_SEND))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_YIELD_VALUE;
+            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_YIELD_VALUE;
+                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache1 = _stack_item_1;
             _tos_cache1 = _stack_item_1;
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(2);
-            #undef OFFSET_OF_YIELD_VALUE
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             _PyStackRef _stack_item_0 = _tos_cache0;
             _PyStackRef _stack_item_1 = _tos_cache1;
             _PyStackRef _stack_item_2 = _tos_cache2;
-            #define OFFSET_OF_YIELD_VALUE ((1+INLINE_CACHE_ENTRIES_SEND))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_YIELD_VALUE;
+            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_YIELD_VALUE;
+                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache2 = _stack_item_2;
             _tos_cache1 = _stack_item_1;
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(3);
-            #undef OFFSET_OF_YIELD_VALUE
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
         case _GUARD_IP_RETURN_VALUE_r00: {
             CHECK_CURRENT_CACHED_VALUES(0);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
-            #define OFFSET_OF_RETURN_VALUE ((frame->return_offset))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_VALUE;
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_RETURN_VALUE;
+                frame->instr_ptr += frame->return_offset;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     SET_CURRENT_CACHED_VALUES(0);
                 }
             }
             SET_CURRENT_CACHED_VALUES(0);
-            #undef OFFSET_OF_RETURN_VALUE
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             CHECK_CURRENT_CACHED_VALUES(1);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef _stack_item_0 = _tos_cache0;
-            #define OFFSET_OF_RETURN_VALUE ((frame->return_offset))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_VALUE;
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_RETURN_VALUE;
+                frame->instr_ptr += frame->return_offset;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache0 = _stack_item_0;
             }
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(1);
-            #undef OFFSET_OF_RETURN_VALUE
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef _stack_item_0 = _tos_cache0;
             _PyStackRef _stack_item_1 = _tos_cache1;
-            #define OFFSET_OF_RETURN_VALUE ((frame->return_offset))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_VALUE;
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_RETURN_VALUE;
+                frame->instr_ptr += frame->return_offset;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache1 = _stack_item_1;
             _tos_cache1 = _stack_item_1;
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(2);
-            #undef OFFSET_OF_RETURN_VALUE
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             _PyStackRef _stack_item_0 = _tos_cache0;
             _PyStackRef _stack_item_1 = _tos_cache1;
             _PyStackRef _stack_item_2 = _tos_cache2;
-            #define OFFSET_OF_RETURN_VALUE ((frame->return_offset))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_VALUE;
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_RETURN_VALUE;
+                frame->instr_ptr += frame->return_offset;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache2 = _stack_item_2;
             _tos_cache1 = _stack_item_1;
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(3);
-            #undef OFFSET_OF_RETURN_VALUE
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
         case _GUARD_IP_RETURN_GENERATOR_r00: {
             CHECK_CURRENT_CACHED_VALUES(0);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
-            #define OFFSET_OF_RETURN_GENERATOR ((frame->return_offset))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_GENERATOR;
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_RETURN_GENERATOR;
+                frame->instr_ptr += frame->return_offset;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     SET_CURRENT_CACHED_VALUES(0);
                 }
             }
             SET_CURRENT_CACHED_VALUES(0);
-            #undef OFFSET_OF_RETURN_GENERATOR
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             CHECK_CURRENT_CACHED_VALUES(1);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef _stack_item_0 = _tos_cache0;
-            #define OFFSET_OF_RETURN_GENERATOR ((frame->return_offset))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_GENERATOR;
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_RETURN_GENERATOR;
+                frame->instr_ptr += frame->return_offset;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache0 = _stack_item_0;
             }
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(1);
-            #undef OFFSET_OF_RETURN_GENERATOR
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef _stack_item_0 = _tos_cache0;
             _PyStackRef _stack_item_1 = _tos_cache1;
-            #define OFFSET_OF_RETURN_GENERATOR ((frame->return_offset))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_GENERATOR;
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_RETURN_GENERATOR;
+                frame->instr_ptr += frame->return_offset;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache1 = _stack_item_1;
             _tos_cache1 = _stack_item_1;
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(2);
-            #undef OFFSET_OF_RETURN_GENERATOR
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
             _PyStackRef _stack_item_0 = _tos_cache0;
             _PyStackRef _stack_item_1 = _tos_cache1;
             _PyStackRef _stack_item_2 = _tos_cache2;
-            #define OFFSET_OF_RETURN_GENERATOR ((frame->return_offset))
             PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_GENERATOR;
+            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_RETURN_GENERATOR;
+                frame->instr_ptr += frame->return_offset;
                 if (true) {
                     UOP_STAT_INC(uopcode, miss);
                     _tos_cache2 = _stack_item_2;
             _tos_cache1 = _stack_item_1;
             _tos_cache0 = _stack_item_0;
             SET_CURRENT_CACHED_VALUES(3);
-            #undef OFFSET_OF_RETURN_GENERATOR
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
index 77d9b182adae9613d4d8126fffa69320c003576c..d3c5f526efd6a860ad1c2663c414a98445c7f7bb 100644 (file)
                         oparg >>= 8;
                         insert_exec_at--;
                     }
-                    int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, STACK_LEVEL(), 0, NULL, oparg, NULL);
+                    int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL);
                     if (succ) {
                         ENTER_TRACING();
                     }
             _PyStackRef attr;
             _PyStackRef *null;
             /* Skip 1 cache entry */
-            // _CHECK_ATTR_CLASS
+            // _GUARD_TYPE_VERSION
             {
                 owner = stack_pointer[-1];
                 uint32_t type_version = read_u32(&this_instr[2].cache);
-                PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
-                if (!PyType_Check(owner_o)) {
-                    UPDATE_MISS_STATS(LOAD_ATTR);
-                    assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    JUMP_TO_PREDICTED(LOAD_ATTR);
-                }
+                PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
                 assert(type_version != 0);
-                if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
+                if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
-            // _GUARD_TYPE_VERSION
+            // _CHECK_ATTR_CLASS
             {
                 uint32_t type_version = read_u32(&this_instr[4].cache);
-                PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
+                PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
+                if (!PyType_Check(owner_o)) {
+                    UPDATE_MISS_STATS(LOAD_ATTR);
+                    assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
+                    JUMP_TO_PREDICTED(LOAD_ATTR);
+                }
                 assert(type_version != 0);
-                if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
+                if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
                     JUMP_TO_PREDICTED(LOAD_ATTR);
             _PyStackRef owner;
             _PyStackRef new_frame;
             /* Skip 1 cache entry */
-            // _CHECK_PEP_523
-            {
-                if (IS_PEP523_HOOKED(tstate)) {
-                    UPDATE_MISS_STATS(LOAD_ATTR);
-                    assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    JUMP_TO_PREDICTED(LOAD_ATTR);
-                }
-            }
             // _GUARD_TYPE_VERSION
             {
                 owner = stack_pointer[-1];
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
+            // _CHECK_PEP_523
+            {
+                if (IS_PEP523_HOOKED(tstate)) {
+                    UPDATE_MISS_STATS(LOAD_ATTR);
+                    assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
+                    JUMP_TO_PREDICTED(LOAD_ATTR);
+                }
+            }
             /* Skip 2 cache entries */
             // _LOAD_ATTR_PROPERTY_FRAME
             {
             next_instr += 1;
             INSTRUCTION_STATS(RETURN_GENERATOR);
             _PyStackRef res;
-            assert(PyStackRef_FunctionCheck(frame->f_funcobj));
-            PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            if (gen == NULL) {
-                JUMP_TO_LABEL(error);
+            // _RETURN_GENERATOR
+            {
+                assert(PyStackRef_FunctionCheck(frame->f_funcobj));
+                PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                if (gen == NULL) {
+                    JUMP_TO_LABEL(error);
+                }
+                assert(STACK_LEVEL() <= 2);
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
+                frame->instr_ptr++;
+                _PyFrame_Copy(frame, gen_frame);
+                assert(frame->frame_obj == NULL);
+                gen->gi_frame_state = FRAME_CREATED;
+                gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
+                _Py_LeaveRecursiveCallPy(tstate);
+                _PyInterpreterFrame *prev = frame->previous;
+                _PyThreadState_PopFrame(tstate, frame);
+                frame = tstate->current_frame = prev;
+                LOAD_IP(frame->return_offset);
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
+                LLTRACE_RESUME_FRAME();
             }
-            assert(STACK_LEVEL() <= 2);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
-            frame->instr_ptr++;
-            _PyFrame_Copy(frame, gen_frame);
-            assert(frame->frame_obj == NULL);
-            gen->gi_frame_state = FRAME_CREATED;
-            gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
-            _Py_LeaveRecursiveCallPy(tstate);
-            _PyInterpreterFrame *prev = frame->previous;
-            _PyThreadState_PopFrame(tstate, frame);
-            frame = tstate->current_frame = prev;
-            LOAD_IP(frame->return_offset);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
-            LLTRACE_RESUME_FRAME();
             stack_pointer[0] = res;
             stack_pointer += 1;
             ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
             INSTRUCTION_STATS(RETURN_VALUE);
             _PyStackRef retval;
             _PyStackRef res;
-            retval = stack_pointer[-1];
-            assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
-            _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
-            stack_pointer += -1;
-            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            assert(STACK_LEVEL() == 0);
-            _Py_LeaveRecursiveCallPy(tstate);
-            _PyInterpreterFrame *dying = frame;
-            frame = tstate->current_frame = dying->previous;
-            _PyEval_FrameClearAndPop(tstate, dying);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            LOAD_IP(frame->return_offset);
-            res = temp;
-            LLTRACE_RESUME_FRAME();
+            // _RETURN_VALUE
+            {
+                retval = stack_pointer[-1];
+                assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
+                _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
+                stack_pointer += -1;
+                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                assert(STACK_LEVEL() == 0);
+                _Py_LeaveRecursiveCallPy(tstate);
+                _PyInterpreterFrame *dying = frame;
+                frame = tstate->current_frame = dying->previous;
+                _PyEval_FrameClearAndPop(tstate, dying);
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                LOAD_IP(frame->return_offset);
+                res = temp;
+                LLTRACE_RESUME_FRAME();
+            }
             stack_pointer[0] = res;
             stack_pointer += 1;
             ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                                  opcode == INTERPRETER_EXIT ||
                                  (opcode >= MIN_INSTRUMENTED_OPCODE && opcode != ENTER_EXECUTOR)
             );
+            _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
+            _PyJitTracerState *tracer = _tstate->jit_tracer_state;
+            assert(tracer != NULL);
             _PyFrame_SetStackPointer(frame, stack_pointer);
             int full = !_PyJit_translate_single_bytecode_to_trace(tstate, frame, next_instr, stop_tracing ? _DEOPT : 0);
             stack_pointer = _PyFrame_GetStackPointer(frame);
                 }
                 DISPATCH();
             }
-            _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
-            _PyJitTracerState *tracer = _tstate->jit_tracer_state;
-            assert(tracer != NULL);
+            _PyFrame_SetStackPointer(frame, stack_pointer);
+            Py_CLEAR(tracer->prev_state.recorded_value);
+            stack_pointer = _PyFrame_GetStackPointer(frame);
             tracer->prev_state.instr = next_instr;
             PyObject *prev_code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
             if (tracer->prev_state.instr_code != (PyCodeObject *)prev_code) {
             if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) {
                 (&next_instr[1])->counter = trigger_backoff_counter();
             }
+            uint8_t record_func_index = _PyOpcode_RecordFunctionIndices[opcode];
+            if (record_func_index) {
+                _Py_RecordFuncPtr doesnt_escape = _PyOpcode_RecordFunctions[record_func_index];
+                doesnt_escape(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
+            }
             DISPATCH_GOTO_NON_TRACING();
             #else
             (void)prev_instr;
             INSTRUCTION_STATS(YIELD_VALUE);
             _PyStackRef retval;
             _PyStackRef value;
-            retval = stack_pointer[-1];
-            assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
-            frame->instr_ptr++;
-            PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
-            assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
-            assert(oparg == 0 || oparg == 1);
-            _PyStackRef temp = retval;
-            stack_pointer += -1;
-            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            tstate->exc_info = gen->gi_exc_state.previous_item;
-            gen->gi_exc_state.previous_item = NULL;
-            _Py_LeaveRecursiveCallPy(tstate);
-            _PyInterpreterFrame *gen_frame = frame;
-            frame = tstate->current_frame = frame->previous;
-            gen_frame->previous = NULL;
-            ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
-            FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
-            assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
-            #if TIER_ONE
-            assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
+            // _YIELD_VALUE
+            {
+                retval = stack_pointer[-1];
+                assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
+                frame->instr_ptr++;
+                PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
+                assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
+                assert(oparg == 0 || oparg == 1);
+                _PyStackRef temp = retval;
+                stack_pointer += -1;
+                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                tstate->exc_info = gen->gi_exc_state.previous_item;
+                gen->gi_exc_state.previous_item = NULL;
+                _Py_LeaveRecursiveCallPy(tstate);
+                _PyInterpreterFrame *gen_frame = frame;
+                frame = tstate->current_frame = frame->previous;
+                gen_frame->previous = NULL;
+                ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
+                FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
+                assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
+                #if TIER_ONE
+                assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
                   frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == INTERPRETER_EXIT ||
                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR);
-            #endif
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
-            value = PyStackRef_MakeHeapSafe(temp);
-            LLTRACE_RESUME_FRAME();
+                #endif
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
+                value = PyStackRef_MakeHeapSafe(temp);
+                LLTRACE_RESUME_FRAME();
+            }
             stack_pointer[0] = value;
             stack_pointer += 1;
             ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
index 2802ef17dbf5c2e735d098cee149612ea6b1ac35..e4e18f14bdc9b1b5cac3a05260094aa9c9651a13 100644 (file)
@@ -955,6 +955,11 @@ _PyJit_translate_single_bytecode_to_trace(
                     assert(next->op.code == STORE_FAST);
                     operand = next->op.arg;
                 }
+                else if (_PyUop_Flags[uop] & HAS_RECORDS_VALUE_FLAG) {
+                    PyObject *recorded_value = tracer->prev_state.recorded_value;
+                    tracer->prev_state.recorded_value = NULL;
+                    operand = (uintptr_t)recorded_value;
+                }
                 // All other instructions
                 ADD_TO_TRACE(uop, oparg, operand, target);
             }
@@ -997,7 +1002,7 @@ done:
 Py_NO_INLINE int
 _PyJit_TryInitializeTracing(
     PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *curr_instr,
-    _Py_CODEUNIT *start_instr, _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth,
+    _Py_CODEUNIT *start_instr, _Py_CODEUNIT *close_loop_instr, _PyStackRef *stack_pointer, int chain_depth,
     _PyExitData *exit, int oparg, _PyExecutorObject *current_executor)
 {
     _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
@@ -1048,14 +1053,20 @@ _PyJit_TryInitializeTracing(
     tracer->initial_state.func = (PyFunctionObject *)Py_NewRef(func);
     tracer->initial_state.executor = (_PyExecutorObject *)Py_XNewRef(current_executor);
     tracer->initial_state.exit = exit;
-    tracer->initial_state.stack_depth = curr_stackdepth;
+    tracer->initial_state.stack_depth = stack_pointer - _PyFrame_Stackbase(frame);
     tracer->initial_state.chain_depth = chain_depth;
     tracer->prev_state.dependencies_still_valid = true;
     tracer->prev_state.instr_code = (PyCodeObject *)Py_NewRef(_PyFrame_GetCode(frame));
     tracer->prev_state.instr = curr_instr;
     tracer->prev_state.instr_frame = frame;
     tracer->prev_state.instr_oparg = oparg;
-    tracer->prev_state.instr_stacklevel = curr_stackdepth;
+    tracer->prev_state.instr_stacklevel = tracer->initial_state.stack_depth;
+    tracer->prev_state.recorded_value = NULL;
+    uint8_t record_func_index = _PyOpcode_RecordFunctionIndices[curr_instr->op.code];
+    if (record_func_index) {
+        _Py_RecordFuncPtr record_func = _PyOpcode_RecordFunctions[record_func_index];
+        record_func(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
+    }
     assert(curr_instr->op.code == JUMP_BACKWARD_JIT || (exit != NULL));
     tracer->initial_state.jump_backward_instr = curr_instr;
 
@@ -1099,6 +1110,7 @@ _PyJit_FinalizeTracing(PyThreadState *tstate, int err)
     Py_CLEAR(tracer->initial_state.func);
     Py_CLEAR(tracer->initial_state.executor);
     Py_CLEAR(tracer->prev_state.instr_code);
+    Py_CLEAR(tracer->prev_state.recorded_value);
     uop_buffer_init(&tracer->code_buffer, &tracer->uop_array[0], UOP_MAX_TRACE_LENGTH);
     tracer->is_tracing = false;
 }
@@ -1526,6 +1538,10 @@ uop_optimize(
             buffer[pc].opcode = opcode + oparg + 1 - _PyUop_Replication[opcode].start;
             assert(strncmp(_PyOpcode_uop_name[buffer[pc].opcode], _PyOpcode_uop_name[opcode], strlen(_PyOpcode_uop_name[opcode])) == 0);
         }
+        else if (_PyUop_Flags[opcode] & HAS_RECORDS_VALUE_FLAG) {
+            Py_XDECREF((PyObject *)(uintptr_t)buffer[pc].operand0);
+            buffer[pc].opcode = _NOP;
+        }
         else if (is_terminator(&buffer[pc])) {
             break;
         }
@@ -1926,6 +1942,8 @@ error:
     _Py_Executors_InvalidateAll(interp, 0);
 }
 
+#include "record_functions.c.h"
+
 static int
 escape_angles(const char *input, Py_ssize_t size, char *buffer) {
     int written = 0;
index 5a3480ab31676b90a7fc0de3e3c97dfe17577edd..1f6a64026d8e153df63c12b0a58ff7890d0fa147 100644 (file)
@@ -177,6 +177,7 @@ dummy_func(void) {
 
     op(_GUARD_TYPE_VERSION, (type_version/2, owner -- owner)) {
         assert(type_version);
+        assert(this_instr[-1].opcode == _RECORD_TOS_TYPE);
         if (sym_matches_type_version(owner, type_version)) {
             ADD_OP(_NOP, 0, 0);
         } else {
index 9dc1da3c93bb69dd3beb90cd026a981b155b3c25..e7b31ad6ac02c3fcb42f5bb55f9ed32a41739e55 100644 (file)
             owner = stack_pointer[-1];
             uint32_t type_version = (uint32_t)this_instr->operand0;
             assert(type_version);
+            assert(this_instr[-1].opcode == _RECORD_TOS_TYPE);
             if (sym_matches_type_version(owner, type_version)) {
                 ADD_OP(_NOP, 0, 0);
             } else {
             break;
         }
 
+        case _RECORD_TOS: {
+            break;
+        }
+
+        case _RECORD_TOS_TYPE: {
+            break;
+        }
+
+        case _RECORD_NOS: {
+            break;
+        }
+
+        case _RECORD_4OS: {
+            break;
+        }
+
+        case _RECORD_CALLABLE: {
+            break;
+        }
+
+        case _RECORD_BOUND_METHOD: {
+            break;
+        }
+
+        case _RECORD_CALLER_CODE: {
+            break;
+        }
+
         /* _TRACE_RECORD is not a viable micro-op for tier 2 */
 
diff --git a/Python/record_functions.c.h b/Python/record_functions.c.h
new file mode 100644 (file)
index 0000000..ba85ed7
--- /dev/null
@@ -0,0 +1,115 @@
+// This file is generated by Tools/cases_generator/record_function_generator.py
+// from:
+//   Python/bytecodes.c
+// Do not edit!
+
+#ifdef TIER_ONE
+    #error "This file is for Tier 2 only"
+#endif
+void _PyOpcode_RecordFunction_TOS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+    _PyStackRef tos;
+    tos = stack_pointer[-1];
+    *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(tos);
+    Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_TOS_TYPE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+    _PyStackRef tos;
+    tos = stack_pointer[-1];
+    *recorded_value = (PyObject *)Py_TYPE(PyStackRef_AsPyObjectBorrow(tos));
+    Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_NOS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+    _PyStackRef nos;
+    nos = stack_pointer[-2];
+    *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(nos);
+    Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_4OS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+    _PyStackRef value;
+    value = stack_pointer[-4];
+    *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(value);
+    Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_CALLABLE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+    _PyStackRef func;
+    func = stack_pointer[-2 - oparg];
+    *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(func);
+    Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_BOUND_METHOD(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+    _PyStackRef callable;
+    callable = stack_pointer[-2 - oparg];
+    PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+    if (Py_TYPE(callable_o) == &PyMethod_Type) {
+        PyObject *func = ((PyMethodObject *)callable_o)->im_func;
+        *recorded_value = (PyObject *)func;
+        Py_INCREF(*recorded_value);
+    }
+}
+
+void _PyOpcode_RecordFunction_CALLER_CODE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+    _PyInterpreterFrame *caller_frame = frame->previous;
+    if (caller_frame->owner < FRAME_OWNED_BY_INTERPRETER) {
+        PyCodeObject *code = _PyFrame_GetCode(frame->previous);
+        *recorded_value = (PyObject *)code;
+        Py_INCREF(*recorded_value);
+    }
+}
+
+#define _RECORD_TOS_TYPE_INDEX 1
+#define _RECORD_TOS_INDEX 2
+#define _RECORD_CALLER_CODE_INDEX 3
+#define _RECORD_NOS_INDEX 4
+#define _RECORD_CALLABLE_INDEX 5
+#define _RECORD_BOUND_METHOD_INDEX 6
+#define _RECORD_4OS_INDEX 7
+const uint8_t _PyOpcode_RecordFunctionIndices[256] = {
+        [TO_BOOL_ALWAYS_TRUE] = _RECORD_TOS_TYPE_INDEX,
+        [BINARY_OP_SUBSCR_GETITEM] = _RECORD_TOS_INDEX,
+        [RETURN_VALUE] = _RECORD_CALLER_CODE_INDEX,
+        [YIELD_VALUE] = _RECORD_CALLER_CODE_INDEX,
+        [LOAD_ATTR_INSTANCE_VALUE] = _RECORD_TOS_TYPE_INDEX,
+        [LOAD_ATTR_WITH_HINT] = _RECORD_TOS_TYPE_INDEX,
+        [LOAD_ATTR_SLOT] = _RECORD_TOS_TYPE_INDEX,
+        [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = _RECORD_TOS_TYPE_INDEX,
+        [LOAD_ATTR_PROPERTY] = _RECORD_TOS_TYPE_INDEX,
+        [STORE_ATTR_WITH_HINT] = _RECORD_TOS_TYPE_INDEX,
+        [STORE_ATTR_SLOT] = _RECORD_TOS_TYPE_INDEX,
+        [FOR_ITER_GEN] = _RECORD_NOS_INDEX,
+        [LOAD_ATTR_METHOD_WITH_VALUES] = _RECORD_TOS_TYPE_INDEX,
+        [LOAD_ATTR_METHOD_NO_DICT] = _RECORD_TOS_TYPE_INDEX,
+        [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = _RECORD_TOS_TYPE_INDEX,
+        [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = _RECORD_TOS_TYPE_INDEX,
+        [LOAD_ATTR_METHOD_LAZY_DICT] = _RECORD_TOS_TYPE_INDEX,
+        [CALL_PY_GENERAL] = _RECORD_CALLABLE_INDEX,
+        [CALL_BOUND_METHOD_GENERAL] = _RECORD_BOUND_METHOD_INDEX,
+        [CALL_NON_PY_GENERAL] = _RECORD_CALLABLE_INDEX,
+        [CALL_BOUND_METHOD_EXACT_ARGS] = _RECORD_BOUND_METHOD_INDEX,
+        [CALL_PY_EXACT_ARGS] = _RECORD_CALLABLE_INDEX,
+        [CALL_ALLOC_AND_ENTER_INIT] = _RECORD_CALLABLE_INDEX,
+        [CALL_BUILTIN_CLASS] = _RECORD_CALLABLE_INDEX,
+        [CALL_BUILTIN_O] = _RECORD_CALLABLE_INDEX,
+        [CALL_BUILTIN_FAST] = _RECORD_CALLABLE_INDEX,
+        [CALL_BUILTIN_FAST_WITH_KEYWORDS] = _RECORD_CALLABLE_INDEX,
+        [CALL_METHOD_DESCRIPTOR_O] = _RECORD_CALLABLE_INDEX,
+        [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = _RECORD_CALLABLE_INDEX,
+        [CALL_METHOD_DESCRIPTOR_NOARGS] = _RECORD_CALLABLE_INDEX,
+        [CALL_EX_PY] = _RECORD_4OS_INDEX,
+        [RETURN_GENERATOR] = _RECORD_CALLER_CODE_INDEX,
+};
+
+const _Py_RecordFuncPtr _PyOpcode_RecordFunctions[8] = {
+        [0] = NULL,
+        [_RECORD_TOS_TYPE_INDEX] = _PyOpcode_RecordFunction_TOS_TYPE,
+        [_RECORD_TOS_INDEX] = _PyOpcode_RecordFunction_TOS,
+        [_RECORD_CALLER_CODE_INDEX] = _PyOpcode_RecordFunction_CALLER_CODE,
+        [_RECORD_NOS_INDEX] = _PyOpcode_RecordFunction_NOS,
+        [_RECORD_CALLABLE_INDEX] = _PyOpcode_RecordFunction_CALLABLE,
+        [_RECORD_BOUND_METHOD_INDEX] = _PyOpcode_RecordFunction_BOUND_METHOD,
+        [_RECORD_4OS_INDEX] = _PyOpcode_RecordFunction_4OS,
+};
index bad1a3eb048782b165c07903866960be3cef6087..890b0eb0bd70794c9a2b92e946af3f0aae0c938b 100644 (file)
@@ -80,6 +80,7 @@ EXCLUDED = format_conf_lines([
     'Python/generated_cases.c.h',
     'Python/executor_cases.c.h',
     'Python/optimizer_cases.c.h',
+    'Python/record_functions.c.h',
     'Python/opcode_targets.h',
     'Modules/_testinternalcapi/test_targets.h',
     'Modules/_testinternalcapi/test_cases.c.h',
index 2001fb7c37931abfef87c45348a1957bb7081772..89f843644329ec6b88c5ac7cb289381c8b56de52 100644 (file)
@@ -39,6 +39,7 @@ class Properties:
     uses_opcode: bool
     needs_guard_ip: bool
     unpredictable_jump: bool
+    records_value: bool
     tier: int | None = None
     const_oparg: int = -1
     needs_prev: bool = False
@@ -83,6 +84,7 @@ class Properties:
             no_save_ip=all(p.no_save_ip for p in properties),
             needs_guard_ip=any(p.needs_guard_ip for p in properties),
             unpredictable_jump=any(p.unpredictable_jump for p in properties),
+            records_value=any(p.records_value for p in properties),
         )
 
     @property
@@ -113,6 +115,7 @@ SKIP_PROPERTIES = Properties(
     no_save_ip=False,
     needs_guard_ip=False,
     unpredictable_jump=False,
+    records_value=False,
 )
 
 
@@ -710,6 +713,8 @@ NON_ESCAPING_FUNCTIONS = (
     "_Py_set_eval_breaker_bit",
     "trigger_backoff_counter",
     "_PyThreadState_PopCStackRefSteal",
+    "doesnt_escape",
+
 )
 
 
@@ -999,6 +1004,7 @@ def compute_properties(op: parser.CodeDef) -> Properties:
                        or variable_used(op, "LOAD_IP")
                        or variable_used(op, "DISPATCH_INLINED"),
         unpredictable_jump=unpredictable_jump,
+        records_value=variable_used(op, "RECORD_VALUE")
     )
 
 def expand(items: list[StackItem], oparg: int) -> list[StackItem]:
@@ -1124,6 +1130,7 @@ def add_macro(
     macro: parser.Macro, instructions: dict[str, Instruction], uops: dict[str, Uop]
 ) -> None:
     parts: list[Part] = []
+    first = True
     for part in macro.uops:
         match part:
             case parser.OpName():
@@ -1134,7 +1141,13 @@ def add_macro(
                         raise analysis_error(
                             f"No Uop named {part.name}", macro.tokens[0]
                         )
-                    parts.append(uops[part.name])
+                    uop = uops[part.name]
+                    if uop.properties.records_value and not first:
+                        raise analysis_error(
+                            f"Recording uop {part.name} must be first in macro",
+                            macro.tokens[0])
+                    parts.append(uop)
+                    first = False
             case parser.CacheEffect():
                 parts.append(Skip(part.size))
             case _:
index 89bd801c61a6d084005e44ae98e7fc6dd19fded8..bdc4324b6702006f92e0864dffe9987ce4bec1a8 100644 (file)
@@ -788,6 +788,8 @@ def cflags(p: Properties) -> str:
         flags.append("HAS_UNPREDICTABLE_JUMP_FLAG")
     if p.needs_guard_ip:
         flags.append("HAS_NEEDS_GUARD_IP_FLAG")
+    if p.records_value:
+        flags.append("HAS_RECORDS_VALUE_FLAG")
     if flags:
         return " | ".join(flags)
     else:
index a31f57850f6a0fa61fcb355ca8adb9c952826a55..21407ad7df1e9a57b6ce05e02556ef3880dbd5f1 100644 (file)
@@ -59,6 +59,7 @@ FLAGS = [
     "PERIODIC",
     "UNPREDICTABLE_JUMP",
     "NEEDS_GUARD_IP",
+    "RECORDS_VALUE",
 ]
 
 
diff --git a/Tools/cases_generator/record_function_generator.py b/Tools/cases_generator/record_function_generator.py
new file mode 100644 (file)
index 0000000..58d948f
--- /dev/null
@@ -0,0 +1,134 @@
+
+import argparse
+
+from analyzer import (
+    Analysis,
+    Instruction,
+    analyze_files,
+    CodeSection,
+)
+
+from generators_common import (
+    DEFAULT_INPUT,
+    ROOT,
+    write_header,
+    emit_to,
+    TokenIterator,
+)
+
+from cwriter import CWriter
+
+from tier1_generator import write_uop, Emitter, declare_variable
+from typing import TextIO
+from lexer import Token
+from stack import Stack, Storage
+
+DEFAULT_OUTPUT = ROOT / "Python/recorder_functions.c.h"
+
+
+class RecorderEmitter(Emitter):
+    def __init__(self, out: CWriter):
+        super().__init__(out, {})
+        self._replacers["RECORD_VALUE"] = self.record_value
+
+    def record_value(
+        self,
+        tkn: Token,
+        tkn_iter: TokenIterator,
+        uop: CodeSection,
+        storage: Storage,
+        inst: Instruction | None,
+    ) -> bool:
+        lparen = next(tkn_iter)
+        self.out.start_line()
+        self.emit("*recorded_value = (PyObject *)")
+        emit_to(self.out, tkn_iter, "RPAREN")
+        next(tkn_iter)  # Semi colon
+        self.emit(";\n")
+        self.emit("Py_INCREF(*recorded_value);\n")
+        return True
+
+
+def generate_recorder_functions(filenames: list[str], analysis: Analysis, out: CWriter) -> None:
+    write_header(__file__, filenames, outfile)
+    outfile.write(
+        """
+#ifdef TIER_ONE
+    #error "This file is for Tier 2 only"
+#endif
+"""
+    )
+    args = "_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value"
+    emitter = RecorderEmitter(out)
+    func_count = 0
+    nop = analysis.instructions["NOP"]
+    function_table: dict[str, int] = dict()
+    for name, uop in analysis.uops.items():
+        if not uop.properties.records_value:
+            continue
+        func_count += 1
+        out.emit(f"void _PyOpcode_RecordFunction{uop.name[7:]}({args}) {{\n")
+        seen = {"unused"}
+        for var in uop.stack.inputs:
+            if var.used and var.name not in seen:
+                seen.add(var.name)
+                declare_variable(var, out)
+        stack = Stack()
+        write_uop(uop, emitter, 0, stack, nop, False)
+        out.start_line()
+        out.emit("}")
+        out.emit("\n\n")
+
+def generate_recorder_tables(analysis: Analysis, out: CWriter) -> None:
+    record_function_indexes: dict[str, int] = dict()
+    record_table: dict[str, str] = {}
+    index = 1
+    for inst in analysis.instructions.values():
+        if not inst.properties.records_value:
+            continue
+        for part in inst.parts:
+            if not part.properties.records_value:
+                continue
+            if part.name not in record_function_indexes:
+                record_function_indexes[part.name] = index
+                index += 1
+            record_table[inst.name] = part.name
+            break
+    func_count = len(record_function_indexes)
+
+    for name, index in record_function_indexes.items():
+        out.emit(f"#define {name}_INDEX {index}\n")
+    args = "_PyJitTracerState *tracer, _PyInterpreterFrame *frame, _PyStackRef *stackpointer, int oparg"
+    out.emit("const uint8_t _PyOpcode_RecordFunctionIndices[256] = {\n")
+    for inst_name, record_name in record_table.items():
+        out.emit(f"    [{inst_name}] = {record_name}_INDEX,\n")
+    out.emit("};\n\n")
+    out.emit(f"const _Py_RecordFuncPtr _PyOpcode_RecordFunctions[{func_count+1}] = {{\n")
+    out.emit("    [0] = NULL,\n")
+    for name in record_function_indexes:
+        out.emit(f"    [{name}_INDEX] = _PyOpcode_RecordFunction{name[7:]},\n")
+    out.emit("};\n")
+
+
+arg_parser = argparse.ArgumentParser(
+    description="Generate the record functions for the trace recorder.",
+    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+)
+
+arg_parser.add_argument(
+    "-o", "--output", type=str, help="Generated code", default=DEFAULT_OUTPUT
+)
+
+arg_parser.add_argument(
+    "input", nargs=argparse.REMAINDER, help="Instruction definition file(s)"
+)
+
+if __name__ == "__main__":
+    args = arg_parser.parse_args()
+    if len(args.input) == 0:
+        args.input.append(DEFAULT_INPUT)
+    data = analyze_files(args.input)
+    with open(args.output, "w") as outfile:
+        out = CWriter(outfile, 0, False)
+        generate_recorder_functions(args.input, data, out)
+        generate_recorder_tables(data, out)
index c7ff5de681e6fa570e2dc6c5d8682297c731d8fe..0334bec724d305876f408f532ebe55bbacbc8aeb 100644 (file)
@@ -56,7 +56,7 @@ def declare_variables(inst: Instruction, out: CWriter) -> None:
         raise analysis_error(ex.args[0], inst.where) from None
     seen = {"unused"}
     for part in inst.parts:
-        if not isinstance(part, Uop):
+        if not isinstance(part, Uop) or part.properties.records_value:
             continue
         for var in part.stack.inputs:
             if var.used and var.name not in seen:
@@ -259,6 +259,8 @@ def generate_tier1_cases(
         offset = 1  # The instruction itself
         stack = Stack()
         for part in inst.parts:
+            if part.properties.records_value:
+                continue
             # Only emit braces if more than one uop
             insert_braces = len([p for p in inst.parts if isinstance(p, Uop)]) > 1
             reachable, offset, stack = write_uop(part, emitter, offset, stack, inst, insert_braces)
index 9dc529753deef81f7f8fd6c6395c9bdb9af3b65e..12da5bff254957c6e015eb9134614e070992e5f8 100644 (file)
@@ -207,12 +207,10 @@ class Tier2Emitter(Emitter):
         self.emit(f"SET_CURRENT_CACHED_VALUES({cached_items});\n")
 
 
-def write_uop(uop: Uop, emitter: Tier2Emitter, stack: Stack, offset_strs: dict[str, tuple[str, str]], cached_items: int = 0) -> tuple[bool, Stack]:
+def write_uop(uop: Uop, emitter: Tier2Emitter, stack: Stack, cached_items: int = 0) -> tuple[bool, Stack]:
     locals: dict[str, Local] = {}
     zero_regs = is_large(uop) or uop.properties.escapes
     try:
-        if name_offset_pair := offset_strs.get(uop.name):
-            emitter.emit(f"#define OFFSET_OF_{name_offset_pair[0]} ({name_offset_pair[1]})\n")
         emitter.out.start_line()
         if uop.properties.oparg:
             emitter.emit("oparg = CURRENT_OPARG();\n")
@@ -237,8 +235,6 @@ def write_uop(uop: Uop, emitter: Tier2Emitter, stack: Stack, offset_strs: dict[s
             storage.stack._print(emitter.out)
             emitter.cache_items(storage.stack, cached_items, zero_regs)
             storage.flush(emitter.out)
-        if name_offset_pair:
-            emitter.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n")
         return reachable, storage.stack
     except StackError as ex:
         raise analysis_error(ex.args[0], uop.body.open) from None
@@ -251,29 +247,6 @@ def is_for_iter_test(uop: Uop) -> bool:
         "_GUARD_NOT_EXHAUSTED_TUPLE", "_FOR_ITER_TIER_TWO"
     )
 
-def populate_offset_strs(analysis: Analysis) -> dict[str, tuple[str, str]]:
-    offset_strs: dict[str, tuple[str, str]] = {}
-    for name, uop in analysis.uops.items():
-        if not f"_GUARD_IP_{name}" in analysis.uops:
-            continue
-        tkn_iter = uop.body.tokens()
-        found = False
-        offset_str = ""
-        for token in tkn_iter:
-            if token.kind == "IDENTIFIER" and token.text == "LOAD_IP":
-                if found:
-                    raise analysis_error("Cannot have two LOAD_IP in a guarded single uop.", uop.body.open)
-                offset = []
-                while token.kind != "SEMI":
-                    offset.append(token.text)
-                    token = next(tkn_iter)
-                # 1: to remove the LOAD_IP text
-                offset_str = "".join(offset[1:])
-                found = True
-        assert offset_str
-        offset_strs[f"_GUARD_IP_{name}"] = (name, offset_str)
-    return offset_strs
-
 def generate_tier2(
     filenames: list[str], analysis: Analysis, outfile: TextIO, lines: bool
 ) -> None:
@@ -287,7 +260,6 @@ def generate_tier2(
 """
     )
     out = CWriter(outfile, 2, lines)
-    offset_strs = populate_offset_strs(analysis)
     out.emit("\n")
 
     for name, uop in analysis.uops.items():
@@ -295,6 +267,8 @@ def generate_tier2(
             continue
         if uop.is_super():
             continue
+        if uop.properties.records_value:
+            continue
         why_not_viable = uop.why_not_viable()
         if why_not_viable is not None:
             out.emit(
@@ -310,7 +284,7 @@ def generate_tier2(
             stack = Stack()
             stack.push_cache([f"_tos_cache{i}" for i in range(inputs)], out)
             stack._print(out)
-            reachable, stack = write_uop(uop, emitter, stack, offset_strs, outputs)
+            reachable, stack = write_uop(uop, emitter, stack, outputs)
             out.start_line()
             if reachable:
                 out.emit("assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());\n")
index 6992806a95b06cc800095a449777aa12bea9be8e..b059a4a169c1ae69e1200cb2a7d2982ee87548b2 100644 (file)
@@ -51,6 +51,8 @@ def generate_uop_ids(
         for name, uop in sorted(uops):
             if uop.properties.tier == 1:
                 continue
+            if uop.properties.records_value:
+                continue
             for inputs, outputs, _ in sorted(get_uop_cache_depths(uop)):
                 out.emit(f"#define {name}_r{inputs}{outputs} {next_id}\n")
                 next_id += 1
index bdecb18d1d56084936612514c43fc8326e9d7d9c..4c24435cbdbe058821d00ebfb0d2c74c2a9158d1 100644 (file)
@@ -28,6 +28,8 @@ DEFAULT_OUTPUT = ROOT / "Include/internal/pycore_uop_metadata.h"
 def uop_cache_info(uop: Uop) -> list[str] | None:
     if uop.name == "_SPILL_OR_RELOAD":
         return None
+    if uop.properties.records_value:
+        return None
     default = "{ -1, -1, -1 },\n"
     table_size = MAX_CACHED_REGISTER + 1
     entries = [ default ] * table_size
@@ -96,7 +98,7 @@ def generate_names_and_flags(analysis: Analysis, out: CWriter) -> None:
     out.emit("};\n\n")
     out.emit("const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {\n");
     for uop in analysis.uops.values():
-        if uop.is_viable() and uop.properties.tier != 1 and not uop.is_super():
+        if uop.is_viable() and uop.properties.tier != 1 and not uop.is_super() and not uop.properties.records_value:
             for inputs, outputs, _ in get_uop_cache_depths(uop):
                 out.emit(f"[{uop.name}_r{inputs}{outputs}] = {uop.name},\n")
     out.emit("};\n\n")
@@ -110,8 +112,9 @@ def generate_names_and_flags(analysis: Analysis, out: CWriter) -> None:
     for uop in sorted(analysis.uops.values(), key=lambda t: t.name):
         if uop.is_viable() and uop.properties.tier != 1 and not uop.is_super():
             out.emit(f'[{uop.name}] = "{uop.name}",\n')
-            for inputs, outputs, _ in get_uop_cache_depths(uop):
-                out.emit(f'[{uop.name}_r{inputs}{outputs}] = "{uop.name}_r{inputs}{outputs}",\n')
+            if not uop.properties.records_value:
+                for inputs, outputs, _ in get_uop_cache_depths(uop):
+                    out.emit(f'[{uop.name}_r{inputs}{outputs}] = "{uop.name}_r{inputs}{outputs}",\n')
     out.emit("};\n")
     out.emit("int _PyUop_num_popped(int opcode, int oparg)\n{\n")
     out.emit("switch(opcode) {\n")
@@ -132,7 +135,6 @@ def generate_names_and_flags(analysis: Analysis, out: CWriter) -> None:
     out.emit("}\n\n")
     out.emit("#endif // NEED_OPCODE_METADATA\n\n")
 
-
 def generate_uop_metadata(
     filenames: list[str], analysis: Analysis, outfile: TextIO
 ) -> None: