From 96236997a8d9f956c554ef81ab2988b3c2f9eb05 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 20:30:16 +0200 Subject: [PATCH 1/5] Add _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW --- Include/internal/pycore_uop_ids.h | 83 +++++++++++++------------- Include/internal/pycore_uop_metadata.h | 4 ++ Lib/test/test_capi/test_opt.py | 12 ++-- Python/bytecodes.c | 8 +++ Python/executor_cases.c.h | 38 ++++++++++++ Python/optimizer_bytecodes.c | 6 ++ Python/optimizer_cases.c.h | 12 ++++ 7 files changed, 118 insertions(+), 45 deletions(-) diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index 71a288a3a39179..1c3a7e3c7a340c 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -263,73 +263,74 @@ extern "C" { #define _MONITOR_JUMP_BACKWARD 478 #define _MONITOR_RESUME 479 #define _NOP NOP +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 480 #define _POP_EXCEPT POP_EXCEPT -#define _POP_JUMP_IF_FALSE 480 -#define _POP_JUMP_IF_TRUE 481 +#define _POP_JUMP_IF_FALSE 481 +#define _POP_JUMP_IF_TRUE 482 #define _POP_TOP POP_TOP -#define _POP_TOP_LOAD_CONST_INLINE 482 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 483 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 484 +#define _POP_TOP_LOAD_CONST_INLINE 483 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 484 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW 485 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 485 +#define _PUSH_FRAME 486 #define _PUSH_NULL PUSH_NULL -#define _PUSH_NULL_CONDITIONAL 486 -#define _PY_FRAME_GENERAL 487 -#define _PY_FRAME_KW 488 -#define _QUICKEN_RESUME 489 -#define _REPLACE_WITH_TRUE 490 +#define _PUSH_NULL_CONDITIONAL 487 +#define _PY_FRAME_GENERAL 488 +#define _PY_FRAME_KW 489 +#define _QUICKEN_RESUME 490 +#define _REPLACE_WITH_TRUE 491 #define _RESUME_CHECK RESUME_CHECK #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 491 -#define _SEND 492 -#define _SEND_GEN_FRAME 493 +#define _SAVE_RETURN_OFFSET 492 +#define _SEND 493 +#define _SEND_GEN_FRAME 494 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _START_EXECUTOR 494 -#define _STORE_ATTR 495 -#define _STORE_ATTR_INSTANCE_VALUE 496 -#define _STORE_ATTR_SLOT 497 -#define _STORE_ATTR_WITH_HINT 498 +#define _START_EXECUTOR 495 +#define _STORE_ATTR 496 +#define _STORE_ATTR_INSTANCE_VALUE 497 +#define _STORE_ATTR_SLOT 498 +#define _STORE_ATTR_WITH_HINT 499 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 499 -#define _STORE_FAST_0 500 -#define _STORE_FAST_1 501 -#define _STORE_FAST_2 502 -#define _STORE_FAST_3 503 -#define _STORE_FAST_4 504 -#define _STORE_FAST_5 505 -#define _STORE_FAST_6 506 -#define _STORE_FAST_7 507 +#define _STORE_FAST 500 +#define _STORE_FAST_0 501 +#define _STORE_FAST_1 502 +#define _STORE_FAST_2 503 +#define _STORE_FAST_3 504 +#define _STORE_FAST_4 505 +#define _STORE_FAST_5 506 +#define _STORE_FAST_6 507 +#define _STORE_FAST_7 508 #define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST #define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 508 -#define _STORE_SUBSCR 509 -#define _STORE_SUBSCR_DICT 510 -#define _STORE_SUBSCR_LIST_INT 511 +#define _STORE_SLICE 509 +#define _STORE_SUBSCR 510 +#define _STORE_SUBSCR_DICT 511 +#define _STORE_SUBSCR_LIST_INT 512 #define _SWAP SWAP -#define _TIER2_RESUME_CHECK 512 -#define _TO_BOOL 513 +#define _TIER2_RESUME_CHECK 513 +#define _TO_BOOL 514 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 514 +#define _TO_BOOL_LIST 515 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 515 +#define _TO_BOOL_STR 516 #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 516 -#define _UNPACK_SEQUENCE_LIST 517 -#define _UNPACK_SEQUENCE_TUPLE 518 -#define _UNPACK_SEQUENCE_TWO_TUPLE 519 +#define _UNPACK_SEQUENCE 517 +#define _UNPACK_SEQUENCE_LIST 518 +#define _UNPACK_SEQUENCE_TUPLE 519 +#define _UNPACK_SEQUENCE_TWO_TUPLE 520 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 519 +#define MAX_UOP_ID 520 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index 88a2e538447034..4cb380bc9359ad 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -303,6 +303,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { [_LOAD_CONST_INLINE_BORROW] = HAS_PURE_FLAG, [_POP_TOP_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG, [_POP_TWO_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG, + [_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG, [_CHECK_FUNCTION] = HAS_DEOPT_FLAG, [_START_EXECUTOR] = 0, [_MAKE_WARM] = 0, @@ -549,6 +550,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_MAYBE_EXPAND_METHOD] = "_MAYBE_EXPAND_METHOD", [_MAYBE_EXPAND_METHOD_KW] = "_MAYBE_EXPAND_METHOD_KW", [_NOP] = "_NOP", + [_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW] = "_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", [_POP_EXCEPT] = "_POP_EXCEPT", [_POP_TOP] = "_POP_TOP", [_POP_TOP_LOAD_CONST_INLINE] = "_POP_TOP_LOAD_CONST_INLINE", @@ -1184,6 +1186,8 @@ int _PyUop_num_popped(int opcode, int oparg) return 1; case _POP_TWO_LOAD_CONST_INLINE_BORROW: return 2; + case _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW: + return 4; case _CHECK_FUNCTION: return 0; case _START_EXECUTOR: diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 73ce55400adcdf..dccfb447c12a9e 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -1955,9 +1955,10 @@ def testfunc(n): self.assertEqual(res, TIER2_THRESHOLD) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_CALL_ISINSTANCE", uops) + self.assertNotIn("_CALL_ISINSTANCE", uops) self.assertNotIn("_GUARD_THIRD_NULL", uops) self.assertNotIn("_GUARD_CALLABLE_ISINSTANCE", uops) + self.assertIn("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", uops) def test_call_isinstance_is_true(self): def testfunc(n): @@ -1972,9 +1973,10 @@ def testfunc(n): self.assertEqual(res, TIER2_THRESHOLD) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_CALL_ISINSTANCE", uops) + self.assertNotIn("_CALL_ISINSTANCE", uops) self.assertNotIn("_TO_BOOL_BOOL", uops) self.assertNotIn("_GUARD_IS_TRUE_POP", uops) + self.assertIn("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", uops) def test_call_isinstance_is_false(self): def testfunc(n): @@ -1989,9 +1991,10 @@ def testfunc(n): self.assertEqual(res, TIER2_THRESHOLD) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_CALL_ISINSTANCE", uops) + self.assertNotIn("_CALL_ISINSTANCE", uops) self.assertNotIn("_TO_BOOL_BOOL", uops) self.assertNotIn("_GUARD_IS_FALSE_POP", uops) + self.assertIn("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", uops) def test_call_isinstance_subclass(self): def testfunc(n): @@ -2006,9 +2009,10 @@ def testfunc(n): self.assertEqual(res, TIER2_THRESHOLD) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_CALL_ISINSTANCE", uops) + self.assertNotIn("_CALL_ISINSTANCE", uops) self.assertNotIn("_TO_BOOL_BOOL", uops) self.assertNotIn("_GUARD_IS_TRUE_POP", uops) + self.assertIn("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", uops) def test_call_isinstance_unknown_object(self): def testfunc(n): diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 42e4f581894d1f..8f08636499193d 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5327,6 +5327,14 @@ dummy_func( value = PyStackRef_FromPyObjectImmortal(ptr); } + tier2 pure op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, pop1, pop2 -- value)) { + PyStackRef_CLOSE(pop2); + PyStackRef_CLOSE(pop1); + PyStackRef_CLOSE(null); + PyStackRef_CLOSE(callable); + value = PyStackRef_FromPyObjectImmortal(ptr); + } + tier2 op(_CHECK_FUNCTION, (func_version/2 -- )) { assert(PyStackRef_FunctionCheck(frame->f_funcobj)); PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj); diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 41c9bd5ba7089a..9567f456d53b93 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -7090,6 +7090,44 @@ break; } + case _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW: { + _PyStackRef pop2; + _PyStackRef pop1; + _PyStackRef null; + _PyStackRef callable; + _PyStackRef value; + pop2 = stack_pointer[-1]; + pop1 = stack_pointer[-2]; + null = stack_pointer[-3]; + callable = stack_pointer[-4]; + PyObject *ptr = (PyObject *)CURRENT_OPERAND0(); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(pop2); + stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(pop1); + stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(null); + stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(callable); + stack_pointer = _PyFrame_GetStackPointer(frame); + value = PyStackRef_FromPyObjectImmortal(ptr); + stack_pointer[0] = value; + stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); + break; + } + case _CHECK_FUNCTION: { uint32_t func_version = (uint32_t)CURRENT_OPERAND0(); assert(PyStackRef_FunctionCheck(frame->f_funcobj)); diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index ad25c68e62aab2..8b8693cd00853f 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -550,6 +550,10 @@ dummy_func(void) { value = sym_new_const(ctx, ptr); } + op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, unused, unused, unused, unused -- value)) { + value = sym_new_const(ctx, ptr); + } + op(_COPY, (bottom, unused[oparg-1] -- bottom, unused[oparg-1], top)) { assert(oparg > 0); top = bottom; @@ -903,9 +907,11 @@ dummy_func(void) { // The below check is equivalent to PyObject_TypeCheck(inst, cls) if (inst_type == cls_o || PyType_IsSubtype(inst_type, cls_o)) { sym_set_const(res, Py_True); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); } else { sym_set_const(res, Py_False); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_False); } } } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 5d469765203833..f9510e8f9eb598 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2135,9 +2135,11 @@ if (inst_type && cls_o && sym_matches_type(cls, &PyType_Type)) { if (inst_type == cls_o || PyType_IsSubtype(inst_type, cls_o)) { sym_set_const(res, Py_True); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); } else { sym_set_const(res, Py_False); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_False); } } stack_pointer[-4] = res; @@ -2535,6 +2537,16 @@ break; } + case _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW: { + JitOptSymbol *value; + PyObject *ptr = (PyObject *)this_instr->operand0; + value = sym_new_const(ctx, ptr); + stack_pointer[-4] = value; + stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); + break; + } + case _CHECK_FUNCTION: { break; } From bc41fc3ab33e05b5938b3273db18cf7e3ecbbff7 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 20:47:08 +0200 Subject: [PATCH 2/5] Mark null as DEAD --- Python/bytecodes.c | 3 ++- Python/executor_cases.c.h | 8 ++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 8f08636499193d..5c3b110e48c08d 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5330,7 +5330,8 @@ dummy_func( tier2 pure op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, pop1, pop2 -- value)) { PyStackRef_CLOSE(pop2); PyStackRef_CLOSE(pop1); - PyStackRef_CLOSE(null); + (void)null; // Silence compiler warnings about unused variables + DEAD(null); PyStackRef_CLOSE(callable); value = PyStackRef_FromPyObjectImmortal(ptr); } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 9567f456d53b93..287f53aa1b4d73 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -7111,12 +7111,8 @@ _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(pop1); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; - assert(WITHIN_STACK_BOUNDS()); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(null); - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; + (void)null; + stack_pointer += -2; assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(callable); From 421f4995377608d3cac27373eacd9d27d17cd721 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 20:50:06 +0200 Subject: [PATCH 3/5] Simplify logic --- Python/optimizer_bytecodes.c | 10 ++++------ Python/optimizer_cases.c.h | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 8b8693cd00853f..fa8183e66e1f38 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -905,14 +905,12 @@ dummy_func(void) { // known types, meaning we can deduce either True or False // The below check is equivalent to PyObject_TypeCheck(inst, cls) + PyObject *out = Py_False; if (inst_type == cls_o || PyType_IsSubtype(inst_type, cls_o)) { - sym_set_const(res, Py_True); - REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); - } - else { - sym_set_const(res, Py_False); - REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_False); + out = Py_True; } + sym_set_const(res, out); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)out); } } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index f9510e8f9eb598..aa381ae817532b 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2133,14 +2133,12 @@ PyTypeObject *inst_type = sym_get_type(instance); PyTypeObject *cls_o = (PyTypeObject *)sym_get_const(ctx, cls); if (inst_type && cls_o && sym_matches_type(cls, &PyType_Type)) { + PyObject *out = Py_False; if (inst_type == cls_o || PyType_IsSubtype(inst_type, cls_o)) { - sym_set_const(res, Py_True); - REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); - } - else { - sym_set_const(res, Py_False); - REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_False); + out = Py_True; } + sym_set_const(res, out); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)out); } stack_pointer[-4] = res; stack_pointer += -3; From 24b2632cdc3097989f9aa602b89a1a2f1bb94ee3 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 20:53:00 +0200 Subject: [PATCH 4/5] Add news entry --- .../2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst new file mode 100644 index 00000000000000..98d770cf054926 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst @@ -0,0 +1,2 @@ +Add ``_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW`` and use it to further +optimize ``CALL_ISINSTANCE``. From 070dbc7c493f3e282bd0f97a5470899a60906696 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 23:19:52 +0200 Subject: [PATCH 5/5] make regen-cases --- Include/internal/pycore_uop_ids.h | 125 ++++++++++-------------------- 1 file changed, 42 insertions(+), 83 deletions(-) diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index de994a62e0a904..322f3cc093f7bb 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -265,115 +265,74 @@ extern "C" { #define _MONITOR_JUMP_BACKWARD 481 #define _MONITOR_RESUME 482 #define _NOP NOP -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 480 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 483 #define _POP_EXCEPT POP_EXCEPT -#define _POP_JUMP_IF_FALSE 481 -#define _POP_JUMP_IF_TRUE 482 -#define _POP_JUMP_IF_FALSE 483 -#define _POP_JUMP_IF_TRUE 484 +#define _POP_JUMP_IF_FALSE 484 +#define _POP_JUMP_IF_TRUE 485 #define _POP_TOP POP_TOP -#define _POP_TOP_LOAD_CONST_INLINE 483 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 484 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 485 -#define _POP_TOP_LOAD_CONST_INLINE 485 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 486 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 487 +#define _POP_TOP_LOAD_CONST_INLINE 486 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 487 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW 488 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 486 -#define _PUSH_FRAME 488 +#define _PUSH_FRAME 489 #define _PUSH_NULL PUSH_NULL -#define _PUSH_NULL_CONDITIONAL 487 -#define _PY_FRAME_GENERAL 488 -#define _PY_FRAME_KW 489 -#define _QUICKEN_RESUME 490 -#define _REPLACE_WITH_TRUE 491 -#define _PUSH_NULL_CONDITIONAL 489 -#define _PY_FRAME_GENERAL 490 -#define _PY_FRAME_KW 491 -#define _QUICKEN_RESUME 492 -#define _REPLACE_WITH_TRUE 493 +#define _PUSH_NULL_CONDITIONAL 490 +#define _PY_FRAME_GENERAL 491 +#define _PY_FRAME_KW 492 +#define _QUICKEN_RESUME 493 +#define _REPLACE_WITH_TRUE 494 #define _RESUME_CHECK RESUME_CHECK #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 492 -#define _SEND 493 -#define _SEND_GEN_FRAME 494 -#define _SAVE_RETURN_OFFSET 494 -#define _SEND 495 -#define _SEND_GEN_FRAME 496 +#define _SAVE_RETURN_OFFSET 495 +#define _SEND 496 +#define _SEND_GEN_FRAME 497 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _START_EXECUTOR 495 -#define _STORE_ATTR 496 -#define _STORE_ATTR_INSTANCE_VALUE 497 -#define _STORE_ATTR_SLOT 498 -#define _STORE_ATTR_WITH_HINT 499 -#define _START_EXECUTOR 497 -#define _STORE_ATTR 498 -#define _STORE_ATTR_INSTANCE_VALUE 499 -#define _STORE_ATTR_SLOT 500 -#define _STORE_ATTR_WITH_HINT 501 +#define _START_EXECUTOR 498 +#define _STORE_ATTR 499 +#define _STORE_ATTR_INSTANCE_VALUE 500 +#define _STORE_ATTR_SLOT 501 +#define _STORE_ATTR_WITH_HINT 502 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 500 -#define _STORE_FAST_0 501 -#define _STORE_FAST_1 502 -#define _STORE_FAST_2 503 -#define _STORE_FAST_3 504 -#define _STORE_FAST_4 505 -#define _STORE_FAST_5 506 -#define _STORE_FAST_6 507 -#define _STORE_FAST_7 508 -#define _STORE_FAST 502 -#define _STORE_FAST_0 503 -#define _STORE_FAST_1 504 -#define _STORE_FAST_2 505 -#define _STORE_FAST_3 506 -#define _STORE_FAST_4 507 -#define _STORE_FAST_5 508 -#define _STORE_FAST_6 509 -#define _STORE_FAST_7 510 +#define _STORE_FAST 503 +#define _STORE_FAST_0 504 +#define _STORE_FAST_1 505 +#define _STORE_FAST_2 506 +#define _STORE_FAST_3 507 +#define _STORE_FAST_4 508 +#define _STORE_FAST_5 509 +#define _STORE_FAST_6 510 +#define _STORE_FAST_7 511 #define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST #define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 509 -#define _STORE_SUBSCR 510 -#define _STORE_SUBSCR_DICT 511 -#define _STORE_SUBSCR_LIST_INT 512 -#define _STORE_SLICE 511 -#define _STORE_SUBSCR 512 -#define _STORE_SUBSCR_DICT 513 -#define _STORE_SUBSCR_LIST_INT 514 +#define _STORE_SLICE 512 +#define _STORE_SUBSCR 513 +#define _STORE_SUBSCR_DICT 514 +#define _STORE_SUBSCR_LIST_INT 515 #define _SWAP SWAP -#define _TIER2_RESUME_CHECK 513 -#define _TO_BOOL 514 -#define _TIER2_RESUME_CHECK 515 -#define _TO_BOOL 516 +#define _TIER2_RESUME_CHECK 516 +#define _TO_BOOL 517 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 515 -#define _TO_BOOL_LIST 517 +#define _TO_BOOL_LIST 518 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 516 -#define _TO_BOOL_STR 518 +#define _TO_BOOL_STR 519 #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 517 -#define _UNPACK_SEQUENCE_LIST 518 -#define _UNPACK_SEQUENCE_TUPLE 519 -#define _UNPACK_SEQUENCE_TWO_TUPLE 520 -#define _UNPACK_SEQUENCE 519 -#define _UNPACK_SEQUENCE_LIST 520 -#define _UNPACK_SEQUENCE_TUPLE 521 -#define _UNPACK_SEQUENCE_TWO_TUPLE 522 +#define _UNPACK_SEQUENCE 520 +#define _UNPACK_SEQUENCE_LIST 521 +#define _UNPACK_SEQUENCE_TUPLE 522 +#define _UNPACK_SEQUENCE_TWO_TUPLE 523 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 520 -#define MAX_UOP_ID 522 +#define MAX_UOP_ID 523 #ifdef __cplusplus } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy