From 37121ef77ee54bd5bf12582392ecf55afa80f366 Mon Sep 17 00:00:00 2001 From: Sacul <183588943+Sacul0457@users.noreply.github.com> Date: Mon, 16 Mar 2026 19:58:12 +0800 Subject: [PATCH 1/9] gh-145866: Convert `CALL_INTRINSIC_1` to leave its inputs on the stack to be cleaned up by `_POP_TOP`. (GH-145964) --- Include/internal/pycore_opcode_metadata.h | 4 +- Include/internal/pycore_uop_ids.h | 2332 ++++++++++----------- Include/internal/pycore_uop_metadata.h | 8 +- Lib/test/test_capi/test_opt.py | 15 + Modules/_testinternalcapi/test_cases.c.h | 37 +- Python/bytecodes.c | 11 +- Python/executor_cases.c.h | 15 +- Python/generated_cases.c.h | 37 +- Python/optimizer_bytecodes.c | 5 + Python/optimizer_cases.c.h | 8 + 10 files changed, 1257 insertions(+), 1215 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index c64d4e8ba85b3d..fc5689c5afe13a 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1130,7 +1130,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [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 | 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_1] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [CALL_INTRINSIC_2] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [CALL_ISINSTANCE] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [CALL_KW] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, @@ -1380,7 +1380,7 @@ _PyOpcode_macro_expansion[256] = { [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 = 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_1] = { .nuops = 2, .uops = { { _CALL_INTRINSIC_1, OPARG_SIMPLE, 0 }, { _POP_TOP, 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 } } }, [CALL_KW_BOUND_METHOD] = { .nuops = 6, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_METHOD_VERSION_KW, 2, 1 }, { _EXPAND_METHOD_KW, OPARG_SIMPLE, 3 }, { _PY_FRAME_KW, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index 0fdeb56122ecc7..451c0dd5732d85 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -43,167 +43,167 @@ extern "C" { #define _CALL_BUILTIN_FAST_WITH_KEYWORDS 323 #define _CALL_BUILTIN_O 324 #define _CALL_FUNCTION_EX_NON_PY_GENERAL 325 -#define _CALL_INTRINSIC_1 CALL_INTRINSIC_1 +#define _CALL_INTRINSIC_1 326 #define _CALL_INTRINSIC_2 CALL_INTRINSIC_2 -#define _CALL_ISINSTANCE 326 -#define _CALL_KW_NON_PY 327 -#define _CALL_LEN 328 -#define _CALL_LIST_APPEND 329 -#define _CALL_METHOD_DESCRIPTOR_FAST 330 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 331 -#define _CALL_METHOD_DESCRIPTOR_NOARGS 332 -#define _CALL_METHOD_DESCRIPTOR_O 333 -#define _CALL_NON_PY_GENERAL 334 -#define _CALL_STR_1 335 -#define _CALL_TUPLE_1 336 -#define _CALL_TYPE_1 337 -#define _CHECK_AND_ALLOCATE_OBJECT 338 -#define _CHECK_ATTR_CLASS 339 -#define _CHECK_ATTR_METHOD_LAZY_DICT 340 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 341 +#define _CALL_ISINSTANCE 327 +#define _CALL_KW_NON_PY 328 +#define _CALL_LEN 329 +#define _CALL_LIST_APPEND 330 +#define _CALL_METHOD_DESCRIPTOR_FAST 331 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 332 +#define _CALL_METHOD_DESCRIPTOR_NOARGS 333 +#define _CALL_METHOD_DESCRIPTOR_O 334 +#define _CALL_NON_PY_GENERAL 335 +#define _CALL_STR_1 336 +#define _CALL_TUPLE_1 337 +#define _CALL_TYPE_1 338 +#define _CHECK_AND_ALLOCATE_OBJECT 339 +#define _CHECK_ATTR_CLASS 340 +#define _CHECK_ATTR_METHOD_LAZY_DICT 341 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 342 #define _CHECK_EG_MATCH CHECK_EG_MATCH #define _CHECK_EXC_MATCH CHECK_EXC_MATCH -#define _CHECK_FUNCTION_EXACT_ARGS 342 -#define _CHECK_FUNCTION_VERSION 343 -#define _CHECK_FUNCTION_VERSION_INLINE 344 -#define _CHECK_FUNCTION_VERSION_KW 345 -#define _CHECK_IS_NOT_PY_CALLABLE 346 -#define _CHECK_IS_NOT_PY_CALLABLE_EX 347 -#define _CHECK_IS_NOT_PY_CALLABLE_KW 348 -#define _CHECK_IS_PY_CALLABLE_EX 349 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES 350 -#define _CHECK_METHOD_VERSION 351 -#define _CHECK_METHOD_VERSION_KW 352 -#define _CHECK_PEP_523 353 -#define _CHECK_PERIODIC 354 -#define _CHECK_PERIODIC_AT_END 355 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 356 -#define _CHECK_RECURSION_REMAINING 357 -#define _CHECK_STACK_SPACE 358 -#define _CHECK_STACK_SPACE_OPERAND 359 -#define _CHECK_VALIDITY 360 -#define _COLD_DYNAMIC_EXIT 361 -#define _COLD_EXIT 362 -#define _COMPARE_OP 363 -#define _COMPARE_OP_FLOAT 364 -#define _COMPARE_OP_INT 365 -#define _COMPARE_OP_STR 366 -#define _CONTAINS_OP 367 -#define _CONTAINS_OP_DICT 368 -#define _CONTAINS_OP_SET 369 +#define _CHECK_FUNCTION_EXACT_ARGS 343 +#define _CHECK_FUNCTION_VERSION 344 +#define _CHECK_FUNCTION_VERSION_INLINE 345 +#define _CHECK_FUNCTION_VERSION_KW 346 +#define _CHECK_IS_NOT_PY_CALLABLE 347 +#define _CHECK_IS_NOT_PY_CALLABLE_EX 348 +#define _CHECK_IS_NOT_PY_CALLABLE_KW 349 +#define _CHECK_IS_PY_CALLABLE_EX 350 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES 351 +#define _CHECK_METHOD_VERSION 352 +#define _CHECK_METHOD_VERSION_KW 353 +#define _CHECK_PEP_523 354 +#define _CHECK_PERIODIC 355 +#define _CHECK_PERIODIC_AT_END 356 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 357 +#define _CHECK_RECURSION_REMAINING 358 +#define _CHECK_STACK_SPACE 359 +#define _CHECK_STACK_SPACE_OPERAND 360 +#define _CHECK_VALIDITY 361 +#define _COLD_DYNAMIC_EXIT 362 +#define _COLD_EXIT 363 +#define _COMPARE_OP 364 +#define _COMPARE_OP_FLOAT 365 +#define _COMPARE_OP_INT 366 +#define _COMPARE_OP_STR 367 +#define _CONTAINS_OP 368 +#define _CONTAINS_OP_DICT 369 +#define _CONTAINS_OP_SET 370 #define _CONVERT_VALUE CONVERT_VALUE -#define _COPY 370 -#define _COPY_1 371 -#define _COPY_2 372 -#define _COPY_3 373 +#define _COPY 371 +#define _COPY_1 372 +#define _COPY_2 373 +#define _COPY_3 374 #define _COPY_FREE_VARS COPY_FREE_VARS -#define _CREATE_INIT_FRAME 374 +#define _CREATE_INIT_FRAME 375 #define _DELETE_ATTR DELETE_ATTR #define _DELETE_DEREF DELETE_DEREF #define _DELETE_FAST DELETE_FAST #define _DELETE_GLOBAL DELETE_GLOBAL #define _DELETE_NAME DELETE_NAME #define _DELETE_SUBSCR DELETE_SUBSCR -#define _DEOPT 375 +#define _DEOPT 376 #define _DICT_MERGE DICT_MERGE #define _DICT_UPDATE DICT_UPDATE -#define _DO_CALL 376 -#define _DO_CALL_FUNCTION_EX 377 -#define _DO_CALL_KW 378 -#define _DYNAMIC_EXIT 379 +#define _DO_CALL 377 +#define _DO_CALL_FUNCTION_EX 378 +#define _DO_CALL_KW 379 +#define _DYNAMIC_EXIT 380 #define _END_FOR END_FOR #define _END_SEND END_SEND -#define _ERROR_POP_N 380 +#define _ERROR_POP_N 381 #define _EXIT_INIT_CHECK EXIT_INIT_CHECK -#define _EXPAND_METHOD 381 -#define _EXPAND_METHOD_KW 382 -#define _FATAL_ERROR 383 +#define _EXPAND_METHOD 382 +#define _EXPAND_METHOD_KW 383 +#define _FATAL_ERROR 384 #define _FORMAT_SIMPLE FORMAT_SIMPLE #define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC -#define _FOR_ITER 384 -#define _FOR_ITER_GEN_FRAME 385 -#define _FOR_ITER_TIER_TWO 386 +#define _FOR_ITER 385 +#define _FOR_ITER_GEN_FRAME 386 +#define _FOR_ITER_TIER_TWO 387 #define _GET_AITER GET_AITER #define _GET_ANEXT GET_ANEXT #define _GET_AWAITABLE GET_AWAITABLE #define _GET_ITER GET_ITER #define _GET_LEN GET_LEN #define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER -#define _GUARD_BINARY_OP_EXTEND 387 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS 388 -#define _GUARD_BIT_IS_SET_POP 389 -#define _GUARD_BIT_IS_SET_POP_4 390 -#define _GUARD_BIT_IS_SET_POP_5 391 -#define _GUARD_BIT_IS_SET_POP_6 392 -#define _GUARD_BIT_IS_SET_POP_7 393 -#define _GUARD_BIT_IS_UNSET_POP 394 -#define _GUARD_BIT_IS_UNSET_POP_4 395 -#define _GUARD_BIT_IS_UNSET_POP_5 396 -#define _GUARD_BIT_IS_UNSET_POP_6 397 -#define _GUARD_BIT_IS_UNSET_POP_7 398 -#define _GUARD_CALLABLE_ISINSTANCE 399 -#define _GUARD_CALLABLE_LEN 400 -#define _GUARD_CALLABLE_LIST_APPEND 401 -#define _GUARD_CALLABLE_STR_1 402 -#define _GUARD_CALLABLE_TUPLE_1 403 -#define _GUARD_CALLABLE_TYPE_1 404 -#define _GUARD_CODE_VERSION 405 -#define _GUARD_DORV_NO_DICT 406 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 407 -#define _GUARD_GLOBALS_VERSION 408 -#define _GUARD_IP_RETURN_GENERATOR 409 -#define _GUARD_IP_RETURN_VALUE 410 -#define _GUARD_IP_YIELD_VALUE 411 -#define _GUARD_IP__PUSH_FRAME 412 -#define _GUARD_IS_FALSE_POP 413 -#define _GUARD_IS_NONE_POP 414 -#define _GUARD_IS_NOT_NONE_POP 415 -#define _GUARD_IS_TRUE_POP 416 -#define _GUARD_KEYS_VERSION 417 -#define _GUARD_NOS_ANY_DICT 418 -#define _GUARD_NOS_COMPACT_ASCII 419 -#define _GUARD_NOS_DICT 420 -#define _GUARD_NOS_FLOAT 421 -#define _GUARD_NOS_INT 422 -#define _GUARD_NOS_LIST 423 -#define _GUARD_NOS_NOT_NULL 424 -#define _GUARD_NOS_NULL 425 -#define _GUARD_NOS_OVERFLOWED 426 -#define _GUARD_NOS_TUPLE 427 -#define _GUARD_NOS_UNICODE 428 -#define _GUARD_NOT_EXHAUSTED_LIST 429 -#define _GUARD_NOT_EXHAUSTED_RANGE 430 -#define _GUARD_NOT_EXHAUSTED_TUPLE 431 -#define _GUARD_THIRD_NULL 432 -#define _GUARD_TOS_ANY_DICT 433 -#define _GUARD_TOS_ANY_SET 434 -#define _GUARD_TOS_DICT 435 -#define _GUARD_TOS_FLOAT 436 -#define _GUARD_TOS_FROZENDICT 437 -#define _GUARD_TOS_FROZENSET 438 -#define _GUARD_TOS_INT 439 -#define _GUARD_TOS_LIST 440 -#define _GUARD_TOS_OVERFLOWED 441 -#define _GUARD_TOS_SET 442 -#define _GUARD_TOS_SLICE 443 -#define _GUARD_TOS_TUPLE 444 -#define _GUARD_TOS_UNICODE 445 -#define _GUARD_TYPE_VERSION 446 -#define _GUARD_TYPE_VERSION_LOCKED 447 -#define _HANDLE_PENDING_AND_DEOPT 448 +#define _GUARD_BINARY_OP_EXTEND 388 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS 389 +#define _GUARD_BIT_IS_SET_POP 390 +#define _GUARD_BIT_IS_SET_POP_4 391 +#define _GUARD_BIT_IS_SET_POP_5 392 +#define _GUARD_BIT_IS_SET_POP_6 393 +#define _GUARD_BIT_IS_SET_POP_7 394 +#define _GUARD_BIT_IS_UNSET_POP 395 +#define _GUARD_BIT_IS_UNSET_POP_4 396 +#define _GUARD_BIT_IS_UNSET_POP_5 397 +#define _GUARD_BIT_IS_UNSET_POP_6 398 +#define _GUARD_BIT_IS_UNSET_POP_7 399 +#define _GUARD_CALLABLE_ISINSTANCE 400 +#define _GUARD_CALLABLE_LEN 401 +#define _GUARD_CALLABLE_LIST_APPEND 402 +#define _GUARD_CALLABLE_STR_1 403 +#define _GUARD_CALLABLE_TUPLE_1 404 +#define _GUARD_CALLABLE_TYPE_1 405 +#define _GUARD_CODE_VERSION 406 +#define _GUARD_DORV_NO_DICT 407 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 408 +#define _GUARD_GLOBALS_VERSION 409 +#define _GUARD_IP_RETURN_GENERATOR 410 +#define _GUARD_IP_RETURN_VALUE 411 +#define _GUARD_IP_YIELD_VALUE 412 +#define _GUARD_IP__PUSH_FRAME 413 +#define _GUARD_IS_FALSE_POP 414 +#define _GUARD_IS_NONE_POP 415 +#define _GUARD_IS_NOT_NONE_POP 416 +#define _GUARD_IS_TRUE_POP 417 +#define _GUARD_KEYS_VERSION 418 +#define _GUARD_NOS_ANY_DICT 419 +#define _GUARD_NOS_COMPACT_ASCII 420 +#define _GUARD_NOS_DICT 421 +#define _GUARD_NOS_FLOAT 422 +#define _GUARD_NOS_INT 423 +#define _GUARD_NOS_LIST 424 +#define _GUARD_NOS_NOT_NULL 425 +#define _GUARD_NOS_NULL 426 +#define _GUARD_NOS_OVERFLOWED 427 +#define _GUARD_NOS_TUPLE 428 +#define _GUARD_NOS_UNICODE 429 +#define _GUARD_NOT_EXHAUSTED_LIST 430 +#define _GUARD_NOT_EXHAUSTED_RANGE 431 +#define _GUARD_NOT_EXHAUSTED_TUPLE 432 +#define _GUARD_THIRD_NULL 433 +#define _GUARD_TOS_ANY_DICT 434 +#define _GUARD_TOS_ANY_SET 435 +#define _GUARD_TOS_DICT 436 +#define _GUARD_TOS_FLOAT 437 +#define _GUARD_TOS_FROZENDICT 438 +#define _GUARD_TOS_FROZENSET 439 +#define _GUARD_TOS_INT 440 +#define _GUARD_TOS_LIST 441 +#define _GUARD_TOS_OVERFLOWED 442 +#define _GUARD_TOS_SET 443 +#define _GUARD_TOS_SLICE 444 +#define _GUARD_TOS_TUPLE 445 +#define _GUARD_TOS_UNICODE 446 +#define _GUARD_TYPE_VERSION 447 +#define _GUARD_TYPE_VERSION_LOCKED 448 +#define _HANDLE_PENDING_AND_DEOPT 449 #define _IMPORT_FROM IMPORT_FROM #define _IMPORT_NAME IMPORT_NAME -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 449 -#define _INIT_CALL_PY_EXACT_ARGS 450 -#define _INIT_CALL_PY_EXACT_ARGS_0 451 -#define _INIT_CALL_PY_EXACT_ARGS_1 452 -#define _INIT_CALL_PY_EXACT_ARGS_2 453 -#define _INIT_CALL_PY_EXACT_ARGS_3 454 -#define _INIT_CALL_PY_EXACT_ARGS_4 455 -#define _INSERT_1_LOAD_CONST_INLINE 456 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW 457 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW 458 -#define _INSERT_NULL 459 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 450 +#define _INIT_CALL_PY_EXACT_ARGS 451 +#define _INIT_CALL_PY_EXACT_ARGS_0 452 +#define _INIT_CALL_PY_EXACT_ARGS_1 453 +#define _INIT_CALL_PY_EXACT_ARGS_2 454 +#define _INIT_CALL_PY_EXACT_ARGS_3 455 +#define _INIT_CALL_PY_EXACT_ARGS_4 456 +#define _INSERT_1_LOAD_CONST_INLINE 457 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW 458 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW 459 +#define _INSERT_NULL 460 #define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER #define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION #define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD @@ -213,1080 +213,1080 @@ extern "C" { #define _INSTRUMENTED_POP_JUMP_IF_NONE INSTRUMENTED_POP_JUMP_IF_NONE #define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_NONE #define _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE -#define _IS_NONE 460 -#define _IS_OP 461 -#define _ITER_CHECK_LIST 462 -#define _ITER_CHECK_RANGE 463 -#define _ITER_CHECK_TUPLE 464 -#define _ITER_JUMP_LIST 465 -#define _ITER_JUMP_RANGE 466 -#define _ITER_JUMP_TUPLE 467 -#define _ITER_NEXT_LIST 468 -#define _ITER_NEXT_LIST_TIER_TWO 469 -#define _ITER_NEXT_RANGE 470 -#define _ITER_NEXT_TUPLE 471 +#define _IS_NONE 461 +#define _IS_OP 462 +#define _ITER_CHECK_LIST 463 +#define _ITER_CHECK_RANGE 464 +#define _ITER_CHECK_TUPLE 465 +#define _ITER_JUMP_LIST 466 +#define _ITER_JUMP_RANGE 467 +#define _ITER_JUMP_TUPLE 468 +#define _ITER_NEXT_LIST 469 +#define _ITER_NEXT_LIST_TIER_TWO 470 +#define _ITER_NEXT_RANGE 471 +#define _ITER_NEXT_TUPLE 472 #define _JUMP_BACKWARD_NO_INTERRUPT JUMP_BACKWARD_NO_INTERRUPT -#define _JUMP_TO_TOP 472 +#define _JUMP_TO_TOP 473 #define _LIST_APPEND LIST_APPEND #define _LIST_EXTEND LIST_EXTEND -#define _LOAD_ATTR 473 -#define _LOAD_ATTR_CLASS 474 +#define _LOAD_ATTR 474 +#define _LOAD_ATTR_CLASS 475 #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN -#define _LOAD_ATTR_INSTANCE_VALUE 475 -#define _LOAD_ATTR_METHOD_LAZY_DICT 476 -#define _LOAD_ATTR_METHOD_NO_DICT 477 -#define _LOAD_ATTR_METHOD_WITH_VALUES 478 -#define _LOAD_ATTR_MODULE 479 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 480 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 481 -#define _LOAD_ATTR_PROPERTY_FRAME 482 -#define _LOAD_ATTR_SLOT 483 -#define _LOAD_ATTR_WITH_HINT 484 +#define _LOAD_ATTR_INSTANCE_VALUE 476 +#define _LOAD_ATTR_METHOD_LAZY_DICT 477 +#define _LOAD_ATTR_METHOD_NO_DICT 478 +#define _LOAD_ATTR_METHOD_WITH_VALUES 479 +#define _LOAD_ATTR_MODULE 480 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 481 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 482 +#define _LOAD_ATTR_PROPERTY_FRAME 483 +#define _LOAD_ATTR_SLOT 484 +#define _LOAD_ATTR_WITH_HINT 485 #define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS -#define _LOAD_BYTECODE 485 +#define _LOAD_BYTECODE 486 #define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT #define _LOAD_CONST LOAD_CONST -#define _LOAD_CONST_INLINE 486 -#define _LOAD_CONST_INLINE_BORROW 487 -#define _LOAD_CONST_UNDER_INLINE 488 -#define _LOAD_CONST_UNDER_INLINE_BORROW 489 +#define _LOAD_CONST_INLINE 487 +#define _LOAD_CONST_INLINE_BORROW 488 +#define _LOAD_CONST_UNDER_INLINE 489 +#define _LOAD_CONST_UNDER_INLINE_BORROW 490 #define _LOAD_DEREF LOAD_DEREF -#define _LOAD_FAST 490 -#define _LOAD_FAST_0 491 -#define _LOAD_FAST_1 492 -#define _LOAD_FAST_2 493 -#define _LOAD_FAST_3 494 -#define _LOAD_FAST_4 495 -#define _LOAD_FAST_5 496 -#define _LOAD_FAST_6 497 -#define _LOAD_FAST_7 498 +#define _LOAD_FAST 491 +#define _LOAD_FAST_0 492 +#define _LOAD_FAST_1 493 +#define _LOAD_FAST_2 494 +#define _LOAD_FAST_3 495 +#define _LOAD_FAST_4 496 +#define _LOAD_FAST_5 497 +#define _LOAD_FAST_6 498 +#define _LOAD_FAST_7 499 #define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR -#define _LOAD_FAST_BORROW 499 -#define _LOAD_FAST_BORROW_0 500 -#define _LOAD_FAST_BORROW_1 501 -#define _LOAD_FAST_BORROW_2 502 -#define _LOAD_FAST_BORROW_3 503 -#define _LOAD_FAST_BORROW_4 504 -#define _LOAD_FAST_BORROW_5 505 -#define _LOAD_FAST_BORROW_6 506 -#define _LOAD_FAST_BORROW_7 507 +#define _LOAD_FAST_BORROW 500 +#define _LOAD_FAST_BORROW_0 501 +#define _LOAD_FAST_BORROW_1 502 +#define _LOAD_FAST_BORROW_2 503 +#define _LOAD_FAST_BORROW_3 504 +#define _LOAD_FAST_BORROW_4 505 +#define _LOAD_FAST_BORROW_5 506 +#define _LOAD_FAST_BORROW_6 507 +#define _LOAD_FAST_BORROW_7 508 #define _LOAD_FAST_CHECK LOAD_FAST_CHECK #define _LOAD_FROM_DICT_OR_DEREF LOAD_FROM_DICT_OR_DEREF #define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS -#define _LOAD_GLOBAL 508 -#define _LOAD_GLOBAL_BUILTINS 509 -#define _LOAD_GLOBAL_MODULE 510 +#define _LOAD_GLOBAL 509 +#define _LOAD_GLOBAL_BUILTINS 510 +#define _LOAD_GLOBAL_MODULE 511 #define _LOAD_LOCALS LOAD_LOCALS #define _LOAD_NAME LOAD_NAME -#define _LOAD_SMALL_INT 511 -#define _LOAD_SMALL_INT_0 512 -#define _LOAD_SMALL_INT_1 513 -#define _LOAD_SMALL_INT_2 514 -#define _LOAD_SMALL_INT_3 515 -#define _LOAD_SPECIAL 516 +#define _LOAD_SMALL_INT 512 +#define _LOAD_SMALL_INT_0 513 +#define _LOAD_SMALL_INT_1 514 +#define _LOAD_SMALL_INT_2 515 +#define _LOAD_SMALL_INT_3 516 +#define _LOAD_SPECIAL 517 #define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR #define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD -#define _LOCK_OBJECT 517 -#define _MAKE_CALLARGS_A_TUPLE 518 +#define _LOCK_OBJECT 518 +#define _MAKE_CALLARGS_A_TUPLE 519 #define _MAKE_CELL MAKE_CELL #define _MAKE_FUNCTION MAKE_FUNCTION -#define _MAKE_HEAP_SAFE 519 -#define _MAKE_WARM 520 +#define _MAKE_HEAP_SAFE 520 +#define _MAKE_WARM 521 #define _MAP_ADD MAP_ADD -#define _MATCH_CLASS 521 +#define _MATCH_CLASS 522 #define _MATCH_KEYS MATCH_KEYS #define _MATCH_MAPPING MATCH_MAPPING #define _MATCH_SEQUENCE MATCH_SEQUENCE -#define _MAYBE_EXPAND_METHOD 522 -#define _MAYBE_EXPAND_METHOD_KW 523 -#define _MONITOR_CALL 524 -#define _MONITOR_CALL_KW 525 -#define _MONITOR_JUMP_BACKWARD 526 -#define _MONITOR_RESUME 527 +#define _MAYBE_EXPAND_METHOD 523 +#define _MAYBE_EXPAND_METHOD_KW 524 +#define _MONITOR_CALL 525 +#define _MONITOR_CALL_KW 526 +#define _MONITOR_JUMP_BACKWARD 527 +#define _MONITOR_RESUME 528 #define _NOP NOP -#define _POP_CALL 528 -#define _POP_CALL_LOAD_CONST_INLINE_BORROW 529 -#define _POP_CALL_ONE 530 -#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW 531 -#define _POP_CALL_TWO 532 -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 533 +#define _POP_CALL 529 +#define _POP_CALL_LOAD_CONST_INLINE_BORROW 530 +#define _POP_CALL_ONE 531 +#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW 532 +#define _POP_CALL_TWO 533 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 534 #define _POP_EXCEPT POP_EXCEPT #define _POP_ITER POP_ITER -#define _POP_JUMP_IF_FALSE 534 -#define _POP_JUMP_IF_TRUE 535 +#define _POP_JUMP_IF_FALSE 535 +#define _POP_JUMP_IF_TRUE 536 #define _POP_TOP POP_TOP -#define _POP_TOP_FLOAT 536 -#define _POP_TOP_INT 537 -#define _POP_TOP_LOAD_CONST_INLINE 538 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 539 -#define _POP_TOP_NOP 540 -#define _POP_TOP_UNICODE 541 -#define _POP_TWO 542 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 543 +#define _POP_TOP_FLOAT 537 +#define _POP_TOP_INT 538 +#define _POP_TOP_LOAD_CONST_INLINE 539 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 540 +#define _POP_TOP_NOP 541 +#define _POP_TOP_UNICODE 542 +#define _POP_TWO 543 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW 544 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 544 +#define _PUSH_FRAME 545 #define _PUSH_NULL PUSH_NULL -#define _PUSH_NULL_CONDITIONAL 545 -#define _PY_FRAME_EX 546 -#define _PY_FRAME_GENERAL 547 -#define _PY_FRAME_KW 548 -#define _QUICKEN_RESUME 549 -#define _RECORD_4OS 550 -#define _RECORD_BOUND_METHOD 551 -#define _RECORD_CALLABLE 552 -#define _RECORD_CODE 553 -#define _RECORD_NOS 554 -#define _RECORD_NOS_GEN_FUNC 555 -#define _RECORD_TOS 556 -#define _RECORD_TOS_TYPE 557 -#define _REPLACE_WITH_TRUE 558 +#define _PUSH_NULL_CONDITIONAL 546 +#define _PY_FRAME_EX 547 +#define _PY_FRAME_GENERAL 548 +#define _PY_FRAME_KW 549 +#define _QUICKEN_RESUME 550 +#define _RECORD_4OS 551 +#define _RECORD_BOUND_METHOD 552 +#define _RECORD_CALLABLE 553 +#define _RECORD_CODE 554 +#define _RECORD_NOS 555 +#define _RECORD_NOS_GEN_FUNC 556 +#define _RECORD_TOS 557 +#define _RECORD_TOS_TYPE 558 +#define _REPLACE_WITH_TRUE 559 #define _RESUME_CHECK RESUME_CHECK #define _RETURN_GENERATOR RETURN_GENERATOR -#define _RETURN_VALUE 559 -#define _SAVE_RETURN_OFFSET 560 -#define _SEND 561 -#define _SEND_GEN_FRAME 562 +#define _RETURN_VALUE 560 +#define _SAVE_RETURN_OFFSET 561 +#define _SEND 562 +#define _SEND_GEN_FRAME 563 #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 563 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 564 -#define _SPILL_OR_RELOAD 565 -#define _START_EXECUTOR 566 -#define _STORE_ATTR 567 -#define _STORE_ATTR_INSTANCE_VALUE 568 -#define _STORE_ATTR_SLOT 569 -#define _STORE_ATTR_WITH_HINT 570 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 564 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 565 +#define _SPILL_OR_RELOAD 566 +#define _START_EXECUTOR 567 +#define _STORE_ATTR 568 +#define _STORE_ATTR_INSTANCE_VALUE 569 +#define _STORE_ATTR_SLOT 570 +#define _STORE_ATTR_WITH_HINT 571 #define _STORE_DEREF STORE_DEREF #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 571 -#define _STORE_SUBSCR 572 -#define _STORE_SUBSCR_DICT 573 -#define _STORE_SUBSCR_LIST_INT 574 -#define _SWAP 575 -#define _SWAP_2 576 -#define _SWAP_3 577 -#define _SWAP_FAST 578 -#define _SWAP_FAST_0 579 -#define _SWAP_FAST_1 580 -#define _SWAP_FAST_2 581 -#define _SWAP_FAST_3 582 -#define _SWAP_FAST_4 583 -#define _SWAP_FAST_5 584 -#define _SWAP_FAST_6 585 -#define _SWAP_FAST_7 586 -#define _TIER2_RESUME_CHECK 587 -#define _TO_BOOL 588 +#define _STORE_SLICE 572 +#define _STORE_SUBSCR 573 +#define _STORE_SUBSCR_DICT 574 +#define _STORE_SUBSCR_LIST_INT 575 +#define _SWAP 576 +#define _SWAP_2 577 +#define _SWAP_3 578 +#define _SWAP_FAST 579 +#define _SWAP_FAST_0 580 +#define _SWAP_FAST_1 581 +#define _SWAP_FAST_2 582 +#define _SWAP_FAST_3 583 +#define _SWAP_FAST_4 584 +#define _SWAP_FAST_5 585 +#define _SWAP_FAST_6 586 +#define _SWAP_FAST_7 587 +#define _TIER2_RESUME_CHECK 588 +#define _TO_BOOL 589 #define _TO_BOOL_BOOL TO_BOOL_BOOL -#define _TO_BOOL_INT 589 -#define _TO_BOOL_LIST 590 +#define _TO_BOOL_INT 590 +#define _TO_BOOL_LIST 591 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 591 +#define _TO_BOOL_STR 592 #define _TRACE_RECORD TRACE_RECORD -#define _UNARY_INVERT 592 -#define _UNARY_NEGATIVE 593 +#define _UNARY_INVERT 593 +#define _UNARY_NEGATIVE 594 #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 594 -#define _UNPACK_SEQUENCE_LIST 595 -#define _UNPACK_SEQUENCE_TUPLE 596 -#define _UNPACK_SEQUENCE_TWO_TUPLE 597 +#define _UNPACK_SEQUENCE 595 +#define _UNPACK_SEQUENCE_LIST 596 +#define _UNPACK_SEQUENCE_TUPLE 597 +#define _UNPACK_SEQUENCE_TWO_TUPLE 598 #define _WITH_EXCEPT_START WITH_EXCEPT_START -#define _YIELD_VALUE 598 -#define MAX_UOP_ID 598 -#define _BINARY_OP_r23 599 -#define _BINARY_OP_ADD_FLOAT_r03 600 -#define _BINARY_OP_ADD_FLOAT_r13 601 -#define _BINARY_OP_ADD_FLOAT_r23 602 -#define _BINARY_OP_ADD_INT_r03 603 -#define _BINARY_OP_ADD_INT_r13 604 -#define _BINARY_OP_ADD_INT_r23 605 -#define _BINARY_OP_ADD_UNICODE_r03 606 -#define _BINARY_OP_ADD_UNICODE_r13 607 -#define _BINARY_OP_ADD_UNICODE_r23 608 -#define _BINARY_OP_EXTEND_r23 609 -#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 610 -#define _BINARY_OP_MULTIPLY_FLOAT_r03 611 -#define _BINARY_OP_MULTIPLY_FLOAT_r13 612 -#define _BINARY_OP_MULTIPLY_FLOAT_r23 613 -#define _BINARY_OP_MULTIPLY_INT_r03 614 -#define _BINARY_OP_MULTIPLY_INT_r13 615 -#define _BINARY_OP_MULTIPLY_INT_r23 616 -#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 617 -#define _BINARY_OP_SUBSCR_DICT_r23 618 -#define _BINARY_OP_SUBSCR_INIT_CALL_r01 619 -#define _BINARY_OP_SUBSCR_INIT_CALL_r11 620 -#define _BINARY_OP_SUBSCR_INIT_CALL_r21 621 -#define _BINARY_OP_SUBSCR_INIT_CALL_r31 622 -#define _BINARY_OP_SUBSCR_LIST_INT_r23 623 -#define _BINARY_OP_SUBSCR_LIST_SLICE_r23 624 -#define _BINARY_OP_SUBSCR_STR_INT_r23 625 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 626 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 627 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 628 -#define _BINARY_OP_SUBSCR_USTR_INT_r23 629 -#define _BINARY_OP_SUBTRACT_FLOAT_r03 630 -#define _BINARY_OP_SUBTRACT_FLOAT_r13 631 -#define _BINARY_OP_SUBTRACT_FLOAT_r23 632 -#define _BINARY_OP_SUBTRACT_INT_r03 633 -#define _BINARY_OP_SUBTRACT_INT_r13 634 -#define _BINARY_OP_SUBTRACT_INT_r23 635 -#define _BINARY_SLICE_r31 636 -#define _BUILD_INTERPOLATION_r01 637 -#define _BUILD_LIST_r01 638 -#define _BUILD_MAP_r01 639 -#define _BUILD_SET_r01 640 -#define _BUILD_SLICE_r01 641 -#define _BUILD_STRING_r01 642 -#define _BUILD_TEMPLATE_r21 643 -#define _BUILD_TUPLE_r01 644 -#define _CALL_BUILTIN_CLASS_r01 645 -#define _CALL_BUILTIN_FAST_r01 646 -#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 647 -#define _CALL_BUILTIN_O_r03 648 -#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 649 -#define _CALL_INTRINSIC_1_r11 650 -#define _CALL_INTRINSIC_2_r21 651 -#define _CALL_ISINSTANCE_r31 652 -#define _CALL_KW_NON_PY_r11 653 -#define _CALL_LEN_r33 654 -#define _CALL_LIST_APPEND_r03 655 -#define _CALL_LIST_APPEND_r13 656 -#define _CALL_LIST_APPEND_r23 657 -#define _CALL_LIST_APPEND_r33 658 -#define _CALL_METHOD_DESCRIPTOR_FAST_r01 659 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 660 -#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 661 -#define _CALL_METHOD_DESCRIPTOR_O_r03 662 -#define _CALL_NON_PY_GENERAL_r01 663 -#define _CALL_STR_1_r32 664 -#define _CALL_TUPLE_1_r32 665 -#define _CALL_TYPE_1_r02 666 -#define _CALL_TYPE_1_r12 667 -#define _CALL_TYPE_1_r22 668 -#define _CALL_TYPE_1_r32 669 -#define _CHECK_AND_ALLOCATE_OBJECT_r00 670 -#define _CHECK_ATTR_CLASS_r01 671 -#define _CHECK_ATTR_CLASS_r11 672 -#define _CHECK_ATTR_CLASS_r22 673 -#define _CHECK_ATTR_CLASS_r33 674 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 675 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 676 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 677 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 678 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 679 -#define _CHECK_EG_MATCH_r22 680 -#define _CHECK_EXC_MATCH_r22 681 -#define _CHECK_FUNCTION_EXACT_ARGS_r00 682 -#define _CHECK_FUNCTION_VERSION_r00 683 -#define _CHECK_FUNCTION_VERSION_INLINE_r00 684 -#define _CHECK_FUNCTION_VERSION_INLINE_r11 685 -#define _CHECK_FUNCTION_VERSION_INLINE_r22 686 -#define _CHECK_FUNCTION_VERSION_INLINE_r33 687 -#define _CHECK_FUNCTION_VERSION_KW_r11 688 -#define _CHECK_IS_NOT_PY_CALLABLE_r00 689 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 690 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 691 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 692 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 693 -#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 694 -#define _CHECK_IS_PY_CALLABLE_EX_r03 695 -#define _CHECK_IS_PY_CALLABLE_EX_r13 696 -#define _CHECK_IS_PY_CALLABLE_EX_r23 697 -#define _CHECK_IS_PY_CALLABLE_EX_r33 698 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 699 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 700 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 701 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 702 -#define _CHECK_METHOD_VERSION_r00 703 -#define _CHECK_METHOD_VERSION_KW_r11 704 -#define _CHECK_PEP_523_r00 705 -#define _CHECK_PEP_523_r11 706 -#define _CHECK_PEP_523_r22 707 -#define _CHECK_PEP_523_r33 708 -#define _CHECK_PERIODIC_r00 709 -#define _CHECK_PERIODIC_AT_END_r00 710 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 711 -#define _CHECK_RECURSION_REMAINING_r00 712 -#define _CHECK_RECURSION_REMAINING_r11 713 -#define _CHECK_RECURSION_REMAINING_r22 714 -#define _CHECK_RECURSION_REMAINING_r33 715 -#define _CHECK_STACK_SPACE_r00 716 -#define _CHECK_STACK_SPACE_OPERAND_r00 717 -#define _CHECK_STACK_SPACE_OPERAND_r11 718 -#define _CHECK_STACK_SPACE_OPERAND_r22 719 -#define _CHECK_STACK_SPACE_OPERAND_r33 720 -#define _CHECK_VALIDITY_r00 721 -#define _CHECK_VALIDITY_r11 722 -#define _CHECK_VALIDITY_r22 723 -#define _CHECK_VALIDITY_r33 724 -#define _COLD_DYNAMIC_EXIT_r00 725 -#define _COLD_EXIT_r00 726 -#define _COMPARE_OP_r21 727 -#define _COMPARE_OP_FLOAT_r03 728 -#define _COMPARE_OP_FLOAT_r13 729 -#define _COMPARE_OP_FLOAT_r23 730 -#define _COMPARE_OP_INT_r23 731 -#define _COMPARE_OP_STR_r23 732 -#define _CONTAINS_OP_r23 733 -#define _CONTAINS_OP_DICT_r23 734 -#define _CONTAINS_OP_SET_r23 735 -#define _CONVERT_VALUE_r11 736 -#define _COPY_r01 737 -#define _COPY_1_r02 738 -#define _COPY_1_r12 739 -#define _COPY_1_r23 740 -#define _COPY_2_r03 741 -#define _COPY_2_r13 742 -#define _COPY_2_r23 743 -#define _COPY_3_r03 744 -#define _COPY_3_r13 745 -#define _COPY_3_r23 746 -#define _COPY_3_r33 747 -#define _COPY_FREE_VARS_r00 748 -#define _COPY_FREE_VARS_r11 749 -#define _COPY_FREE_VARS_r22 750 -#define _COPY_FREE_VARS_r33 751 -#define _CREATE_INIT_FRAME_r01 752 -#define _DELETE_ATTR_r10 753 -#define _DELETE_DEREF_r00 754 -#define _DELETE_FAST_r00 755 -#define _DELETE_GLOBAL_r00 756 -#define _DELETE_NAME_r00 757 -#define _DELETE_SUBSCR_r20 758 -#define _DEOPT_r00 759 -#define _DEOPT_r10 760 -#define _DEOPT_r20 761 -#define _DEOPT_r30 762 -#define _DICT_MERGE_r10 763 -#define _DICT_UPDATE_r10 764 -#define _DO_CALL_r01 765 -#define _DO_CALL_FUNCTION_EX_r31 766 -#define _DO_CALL_KW_r11 767 -#define _DYNAMIC_EXIT_r00 768 -#define _DYNAMIC_EXIT_r10 769 -#define _DYNAMIC_EXIT_r20 770 -#define _DYNAMIC_EXIT_r30 771 -#define _END_FOR_r10 772 -#define _END_SEND_r21 773 -#define _ERROR_POP_N_r00 774 -#define _EXIT_INIT_CHECK_r10 775 -#define _EXIT_TRACE_r00 776 -#define _EXIT_TRACE_r10 777 -#define _EXIT_TRACE_r20 778 -#define _EXIT_TRACE_r30 779 -#define _EXPAND_METHOD_r00 780 -#define _EXPAND_METHOD_KW_r11 781 -#define _FATAL_ERROR_r00 782 -#define _FATAL_ERROR_r11 783 -#define _FATAL_ERROR_r22 784 -#define _FATAL_ERROR_r33 785 -#define _FORMAT_SIMPLE_r11 786 -#define _FORMAT_WITH_SPEC_r21 787 -#define _FOR_ITER_r23 788 -#define _FOR_ITER_GEN_FRAME_r03 789 -#define _FOR_ITER_GEN_FRAME_r13 790 -#define _FOR_ITER_GEN_FRAME_r23 791 -#define _FOR_ITER_TIER_TWO_r23 792 -#define _GET_AITER_r11 793 -#define _GET_ANEXT_r12 794 -#define _GET_AWAITABLE_r11 795 -#define _GET_ITER_r12 796 -#define _GET_LEN_r12 797 -#define _GET_YIELD_FROM_ITER_r11 798 -#define _GUARD_BINARY_OP_EXTEND_r22 799 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 800 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 801 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 802 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 803 -#define _GUARD_BIT_IS_SET_POP_r00 804 -#define _GUARD_BIT_IS_SET_POP_r10 805 -#define _GUARD_BIT_IS_SET_POP_r21 806 -#define _GUARD_BIT_IS_SET_POP_r32 807 -#define _GUARD_BIT_IS_SET_POP_4_r00 808 -#define _GUARD_BIT_IS_SET_POP_4_r10 809 -#define _GUARD_BIT_IS_SET_POP_4_r21 810 -#define _GUARD_BIT_IS_SET_POP_4_r32 811 -#define _GUARD_BIT_IS_SET_POP_5_r00 812 -#define _GUARD_BIT_IS_SET_POP_5_r10 813 -#define _GUARD_BIT_IS_SET_POP_5_r21 814 -#define _GUARD_BIT_IS_SET_POP_5_r32 815 -#define _GUARD_BIT_IS_SET_POP_6_r00 816 -#define _GUARD_BIT_IS_SET_POP_6_r10 817 -#define _GUARD_BIT_IS_SET_POP_6_r21 818 -#define _GUARD_BIT_IS_SET_POP_6_r32 819 -#define _GUARD_BIT_IS_SET_POP_7_r00 820 -#define _GUARD_BIT_IS_SET_POP_7_r10 821 -#define _GUARD_BIT_IS_SET_POP_7_r21 822 -#define _GUARD_BIT_IS_SET_POP_7_r32 823 -#define _GUARD_BIT_IS_UNSET_POP_r00 824 -#define _GUARD_BIT_IS_UNSET_POP_r10 825 -#define _GUARD_BIT_IS_UNSET_POP_r21 826 -#define _GUARD_BIT_IS_UNSET_POP_r32 827 -#define _GUARD_BIT_IS_UNSET_POP_4_r00 828 -#define _GUARD_BIT_IS_UNSET_POP_4_r10 829 -#define _GUARD_BIT_IS_UNSET_POP_4_r21 830 -#define _GUARD_BIT_IS_UNSET_POP_4_r32 831 -#define _GUARD_BIT_IS_UNSET_POP_5_r00 832 -#define _GUARD_BIT_IS_UNSET_POP_5_r10 833 -#define _GUARD_BIT_IS_UNSET_POP_5_r21 834 -#define _GUARD_BIT_IS_UNSET_POP_5_r32 835 -#define _GUARD_BIT_IS_UNSET_POP_6_r00 836 -#define _GUARD_BIT_IS_UNSET_POP_6_r10 837 -#define _GUARD_BIT_IS_UNSET_POP_6_r21 838 -#define _GUARD_BIT_IS_UNSET_POP_6_r32 839 -#define _GUARD_BIT_IS_UNSET_POP_7_r00 840 -#define _GUARD_BIT_IS_UNSET_POP_7_r10 841 -#define _GUARD_BIT_IS_UNSET_POP_7_r21 842 -#define _GUARD_BIT_IS_UNSET_POP_7_r32 843 -#define _GUARD_CALLABLE_ISINSTANCE_r03 844 -#define _GUARD_CALLABLE_ISINSTANCE_r13 845 -#define _GUARD_CALLABLE_ISINSTANCE_r23 846 -#define _GUARD_CALLABLE_ISINSTANCE_r33 847 -#define _GUARD_CALLABLE_LEN_r03 848 -#define _GUARD_CALLABLE_LEN_r13 849 -#define _GUARD_CALLABLE_LEN_r23 850 -#define _GUARD_CALLABLE_LEN_r33 851 -#define _GUARD_CALLABLE_LIST_APPEND_r03 852 -#define _GUARD_CALLABLE_LIST_APPEND_r13 853 -#define _GUARD_CALLABLE_LIST_APPEND_r23 854 -#define _GUARD_CALLABLE_LIST_APPEND_r33 855 -#define _GUARD_CALLABLE_STR_1_r03 856 -#define _GUARD_CALLABLE_STR_1_r13 857 -#define _GUARD_CALLABLE_STR_1_r23 858 -#define _GUARD_CALLABLE_STR_1_r33 859 -#define _GUARD_CALLABLE_TUPLE_1_r03 860 -#define _GUARD_CALLABLE_TUPLE_1_r13 861 -#define _GUARD_CALLABLE_TUPLE_1_r23 862 -#define _GUARD_CALLABLE_TUPLE_1_r33 863 -#define _GUARD_CALLABLE_TYPE_1_r03 864 -#define _GUARD_CALLABLE_TYPE_1_r13 865 -#define _GUARD_CALLABLE_TYPE_1_r23 866 -#define _GUARD_CALLABLE_TYPE_1_r33 867 -#define _GUARD_CODE_VERSION_r00 868 -#define _GUARD_CODE_VERSION_r11 869 -#define _GUARD_CODE_VERSION_r22 870 -#define _GUARD_CODE_VERSION_r33 871 -#define _GUARD_DORV_NO_DICT_r01 872 -#define _GUARD_DORV_NO_DICT_r11 873 -#define _GUARD_DORV_NO_DICT_r22 874 -#define _GUARD_DORV_NO_DICT_r33 875 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 876 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 877 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 878 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 879 -#define _GUARD_GLOBALS_VERSION_r00 880 -#define _GUARD_GLOBALS_VERSION_r11 881 -#define _GUARD_GLOBALS_VERSION_r22 882 -#define _GUARD_GLOBALS_VERSION_r33 883 -#define _GUARD_IP_RETURN_GENERATOR_r00 884 -#define _GUARD_IP_RETURN_GENERATOR_r11 885 -#define _GUARD_IP_RETURN_GENERATOR_r22 886 -#define _GUARD_IP_RETURN_GENERATOR_r33 887 -#define _GUARD_IP_RETURN_VALUE_r00 888 -#define _GUARD_IP_RETURN_VALUE_r11 889 -#define _GUARD_IP_RETURN_VALUE_r22 890 -#define _GUARD_IP_RETURN_VALUE_r33 891 -#define _GUARD_IP_YIELD_VALUE_r00 892 -#define _GUARD_IP_YIELD_VALUE_r11 893 -#define _GUARD_IP_YIELD_VALUE_r22 894 -#define _GUARD_IP_YIELD_VALUE_r33 895 -#define _GUARD_IP__PUSH_FRAME_r00 896 -#define _GUARD_IP__PUSH_FRAME_r11 897 -#define _GUARD_IP__PUSH_FRAME_r22 898 -#define _GUARD_IP__PUSH_FRAME_r33 899 -#define _GUARD_IS_FALSE_POP_r00 900 -#define _GUARD_IS_FALSE_POP_r10 901 -#define _GUARD_IS_FALSE_POP_r21 902 -#define _GUARD_IS_FALSE_POP_r32 903 -#define _GUARD_IS_NONE_POP_r00 904 -#define _GUARD_IS_NONE_POP_r10 905 -#define _GUARD_IS_NONE_POP_r21 906 -#define _GUARD_IS_NONE_POP_r32 907 -#define _GUARD_IS_NOT_NONE_POP_r10 908 -#define _GUARD_IS_TRUE_POP_r00 909 -#define _GUARD_IS_TRUE_POP_r10 910 -#define _GUARD_IS_TRUE_POP_r21 911 -#define _GUARD_IS_TRUE_POP_r32 912 -#define _GUARD_KEYS_VERSION_r01 913 -#define _GUARD_KEYS_VERSION_r11 914 -#define _GUARD_KEYS_VERSION_r22 915 -#define _GUARD_KEYS_VERSION_r33 916 -#define _GUARD_NOS_ANY_DICT_r02 917 -#define _GUARD_NOS_ANY_DICT_r12 918 -#define _GUARD_NOS_ANY_DICT_r22 919 -#define _GUARD_NOS_ANY_DICT_r33 920 -#define _GUARD_NOS_COMPACT_ASCII_r02 921 -#define _GUARD_NOS_COMPACT_ASCII_r12 922 -#define _GUARD_NOS_COMPACT_ASCII_r22 923 -#define _GUARD_NOS_COMPACT_ASCII_r33 924 -#define _GUARD_NOS_DICT_r02 925 -#define _GUARD_NOS_DICT_r12 926 -#define _GUARD_NOS_DICT_r22 927 -#define _GUARD_NOS_DICT_r33 928 -#define _GUARD_NOS_FLOAT_r02 929 -#define _GUARD_NOS_FLOAT_r12 930 -#define _GUARD_NOS_FLOAT_r22 931 -#define _GUARD_NOS_FLOAT_r33 932 -#define _GUARD_NOS_INT_r02 933 -#define _GUARD_NOS_INT_r12 934 -#define _GUARD_NOS_INT_r22 935 -#define _GUARD_NOS_INT_r33 936 -#define _GUARD_NOS_LIST_r02 937 -#define _GUARD_NOS_LIST_r12 938 -#define _GUARD_NOS_LIST_r22 939 -#define _GUARD_NOS_LIST_r33 940 -#define _GUARD_NOS_NOT_NULL_r02 941 -#define _GUARD_NOS_NOT_NULL_r12 942 -#define _GUARD_NOS_NOT_NULL_r22 943 -#define _GUARD_NOS_NOT_NULL_r33 944 -#define _GUARD_NOS_NULL_r02 945 -#define _GUARD_NOS_NULL_r12 946 -#define _GUARD_NOS_NULL_r22 947 -#define _GUARD_NOS_NULL_r33 948 -#define _GUARD_NOS_OVERFLOWED_r02 949 -#define _GUARD_NOS_OVERFLOWED_r12 950 -#define _GUARD_NOS_OVERFLOWED_r22 951 -#define _GUARD_NOS_OVERFLOWED_r33 952 -#define _GUARD_NOS_TUPLE_r02 953 -#define _GUARD_NOS_TUPLE_r12 954 -#define _GUARD_NOS_TUPLE_r22 955 -#define _GUARD_NOS_TUPLE_r33 956 -#define _GUARD_NOS_UNICODE_r02 957 -#define _GUARD_NOS_UNICODE_r12 958 -#define _GUARD_NOS_UNICODE_r22 959 -#define _GUARD_NOS_UNICODE_r33 960 -#define _GUARD_NOT_EXHAUSTED_LIST_r02 961 -#define _GUARD_NOT_EXHAUSTED_LIST_r12 962 -#define _GUARD_NOT_EXHAUSTED_LIST_r22 963 -#define _GUARD_NOT_EXHAUSTED_LIST_r33 964 -#define _GUARD_NOT_EXHAUSTED_RANGE_r02 965 -#define _GUARD_NOT_EXHAUSTED_RANGE_r12 966 -#define _GUARD_NOT_EXHAUSTED_RANGE_r22 967 -#define _GUARD_NOT_EXHAUSTED_RANGE_r33 968 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 969 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 970 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 971 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 972 -#define _GUARD_THIRD_NULL_r03 973 -#define _GUARD_THIRD_NULL_r13 974 -#define _GUARD_THIRD_NULL_r23 975 -#define _GUARD_THIRD_NULL_r33 976 -#define _GUARD_TOS_ANY_DICT_r01 977 -#define _GUARD_TOS_ANY_DICT_r11 978 -#define _GUARD_TOS_ANY_DICT_r22 979 -#define _GUARD_TOS_ANY_DICT_r33 980 -#define _GUARD_TOS_ANY_SET_r01 981 -#define _GUARD_TOS_ANY_SET_r11 982 -#define _GUARD_TOS_ANY_SET_r22 983 -#define _GUARD_TOS_ANY_SET_r33 984 -#define _GUARD_TOS_DICT_r01 985 -#define _GUARD_TOS_DICT_r11 986 -#define _GUARD_TOS_DICT_r22 987 -#define _GUARD_TOS_DICT_r33 988 -#define _GUARD_TOS_FLOAT_r01 989 -#define _GUARD_TOS_FLOAT_r11 990 -#define _GUARD_TOS_FLOAT_r22 991 -#define _GUARD_TOS_FLOAT_r33 992 -#define _GUARD_TOS_FROZENDICT_r01 993 -#define _GUARD_TOS_FROZENDICT_r11 994 -#define _GUARD_TOS_FROZENDICT_r22 995 -#define _GUARD_TOS_FROZENDICT_r33 996 -#define _GUARD_TOS_FROZENSET_r01 997 -#define _GUARD_TOS_FROZENSET_r11 998 -#define _GUARD_TOS_FROZENSET_r22 999 -#define _GUARD_TOS_FROZENSET_r33 1000 -#define _GUARD_TOS_INT_r01 1001 -#define _GUARD_TOS_INT_r11 1002 -#define _GUARD_TOS_INT_r22 1003 -#define _GUARD_TOS_INT_r33 1004 -#define _GUARD_TOS_LIST_r01 1005 -#define _GUARD_TOS_LIST_r11 1006 -#define _GUARD_TOS_LIST_r22 1007 -#define _GUARD_TOS_LIST_r33 1008 -#define _GUARD_TOS_OVERFLOWED_r01 1009 -#define _GUARD_TOS_OVERFLOWED_r11 1010 -#define _GUARD_TOS_OVERFLOWED_r22 1011 -#define _GUARD_TOS_OVERFLOWED_r33 1012 -#define _GUARD_TOS_SET_r01 1013 -#define _GUARD_TOS_SET_r11 1014 -#define _GUARD_TOS_SET_r22 1015 -#define _GUARD_TOS_SET_r33 1016 -#define _GUARD_TOS_SLICE_r01 1017 -#define _GUARD_TOS_SLICE_r11 1018 -#define _GUARD_TOS_SLICE_r22 1019 -#define _GUARD_TOS_SLICE_r33 1020 -#define _GUARD_TOS_TUPLE_r01 1021 -#define _GUARD_TOS_TUPLE_r11 1022 -#define _GUARD_TOS_TUPLE_r22 1023 -#define _GUARD_TOS_TUPLE_r33 1024 -#define _GUARD_TOS_UNICODE_r01 1025 -#define _GUARD_TOS_UNICODE_r11 1026 -#define _GUARD_TOS_UNICODE_r22 1027 -#define _GUARD_TOS_UNICODE_r33 1028 -#define _GUARD_TYPE_VERSION_r01 1029 -#define _GUARD_TYPE_VERSION_r11 1030 -#define _GUARD_TYPE_VERSION_r22 1031 -#define _GUARD_TYPE_VERSION_r33 1032 -#define _GUARD_TYPE_VERSION_LOCKED_r01 1033 -#define _GUARD_TYPE_VERSION_LOCKED_r11 1034 -#define _GUARD_TYPE_VERSION_LOCKED_r22 1035 -#define _GUARD_TYPE_VERSION_LOCKED_r33 1036 -#define _HANDLE_PENDING_AND_DEOPT_r00 1037 -#define _HANDLE_PENDING_AND_DEOPT_r10 1038 -#define _HANDLE_PENDING_AND_DEOPT_r20 1039 -#define _HANDLE_PENDING_AND_DEOPT_r30 1040 -#define _IMPORT_FROM_r12 1041 -#define _IMPORT_NAME_r21 1042 -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1043 -#define _INIT_CALL_PY_EXACT_ARGS_r01 1044 -#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1045 -#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1046 -#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1047 -#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1048 -#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1049 -#define _INSERT_1_LOAD_CONST_INLINE_r02 1050 -#define _INSERT_1_LOAD_CONST_INLINE_r12 1051 -#define _INSERT_1_LOAD_CONST_INLINE_r23 1052 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1053 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1054 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1055 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1056 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1057 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1058 -#define _INSERT_NULL_r10 1059 -#define _INSTRUMENTED_FOR_ITER_r23 1060 -#define _INSTRUMENTED_INSTRUCTION_r00 1061 -#define _INSTRUMENTED_JUMP_FORWARD_r00 1062 -#define _INSTRUMENTED_JUMP_FORWARD_r11 1063 -#define _INSTRUMENTED_JUMP_FORWARD_r22 1064 -#define _INSTRUMENTED_JUMP_FORWARD_r33 1065 -#define _INSTRUMENTED_LINE_r00 1066 -#define _INSTRUMENTED_NOT_TAKEN_r00 1067 -#define _INSTRUMENTED_NOT_TAKEN_r11 1068 -#define _INSTRUMENTED_NOT_TAKEN_r22 1069 -#define _INSTRUMENTED_NOT_TAKEN_r33 1070 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1071 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1072 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1073 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1074 -#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1075 -#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1076 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1077 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1078 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1079 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1080 -#define _IS_NONE_r11 1081 -#define _IS_OP_r03 1082 -#define _IS_OP_r13 1083 -#define _IS_OP_r23 1084 -#define _ITER_CHECK_LIST_r02 1085 -#define _ITER_CHECK_LIST_r12 1086 -#define _ITER_CHECK_LIST_r22 1087 -#define _ITER_CHECK_LIST_r33 1088 -#define _ITER_CHECK_RANGE_r02 1089 -#define _ITER_CHECK_RANGE_r12 1090 -#define _ITER_CHECK_RANGE_r22 1091 -#define _ITER_CHECK_RANGE_r33 1092 -#define _ITER_CHECK_TUPLE_r02 1093 -#define _ITER_CHECK_TUPLE_r12 1094 -#define _ITER_CHECK_TUPLE_r22 1095 -#define _ITER_CHECK_TUPLE_r33 1096 -#define _ITER_JUMP_LIST_r02 1097 -#define _ITER_JUMP_LIST_r12 1098 -#define _ITER_JUMP_LIST_r22 1099 -#define _ITER_JUMP_LIST_r33 1100 -#define _ITER_JUMP_RANGE_r02 1101 -#define _ITER_JUMP_RANGE_r12 1102 -#define _ITER_JUMP_RANGE_r22 1103 -#define _ITER_JUMP_RANGE_r33 1104 -#define _ITER_JUMP_TUPLE_r02 1105 -#define _ITER_JUMP_TUPLE_r12 1106 -#define _ITER_JUMP_TUPLE_r22 1107 -#define _ITER_JUMP_TUPLE_r33 1108 -#define _ITER_NEXT_LIST_r23 1109 -#define _ITER_NEXT_LIST_TIER_TWO_r23 1110 -#define _ITER_NEXT_RANGE_r03 1111 -#define _ITER_NEXT_RANGE_r13 1112 -#define _ITER_NEXT_RANGE_r23 1113 -#define _ITER_NEXT_TUPLE_r03 1114 -#define _ITER_NEXT_TUPLE_r13 1115 -#define _ITER_NEXT_TUPLE_r23 1116 -#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1117 -#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1118 -#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1119 -#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1120 -#define _JUMP_TO_TOP_r00 1121 -#define _LIST_APPEND_r10 1122 -#define _LIST_EXTEND_r10 1123 -#define _LOAD_ATTR_r10 1124 -#define _LOAD_ATTR_CLASS_r11 1125 -#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1126 -#define _LOAD_ATTR_INSTANCE_VALUE_r02 1127 -#define _LOAD_ATTR_INSTANCE_VALUE_r12 1128 -#define _LOAD_ATTR_INSTANCE_VALUE_r23 1129 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1130 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1131 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1132 -#define _LOAD_ATTR_METHOD_NO_DICT_r02 1133 -#define _LOAD_ATTR_METHOD_NO_DICT_r12 1134 -#define _LOAD_ATTR_METHOD_NO_DICT_r23 1135 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1136 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1137 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1138 -#define _LOAD_ATTR_MODULE_r12 1139 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1140 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1141 -#define _LOAD_ATTR_PROPERTY_FRAME_r11 1142 -#define _LOAD_ATTR_SLOT_r02 1143 -#define _LOAD_ATTR_SLOT_r12 1144 -#define _LOAD_ATTR_SLOT_r23 1145 -#define _LOAD_ATTR_WITH_HINT_r12 1146 -#define _LOAD_BUILD_CLASS_r01 1147 -#define _LOAD_BYTECODE_r00 1148 -#define _LOAD_COMMON_CONSTANT_r01 1149 -#define _LOAD_COMMON_CONSTANT_r12 1150 -#define _LOAD_COMMON_CONSTANT_r23 1151 -#define _LOAD_CONST_r01 1152 -#define _LOAD_CONST_r12 1153 -#define _LOAD_CONST_r23 1154 -#define _LOAD_CONST_INLINE_r01 1155 -#define _LOAD_CONST_INLINE_r12 1156 -#define _LOAD_CONST_INLINE_r23 1157 -#define _LOAD_CONST_INLINE_BORROW_r01 1158 -#define _LOAD_CONST_INLINE_BORROW_r12 1159 -#define _LOAD_CONST_INLINE_BORROW_r23 1160 -#define _LOAD_CONST_UNDER_INLINE_r02 1161 -#define _LOAD_CONST_UNDER_INLINE_r12 1162 -#define _LOAD_CONST_UNDER_INLINE_r23 1163 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1164 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1165 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1166 -#define _LOAD_DEREF_r01 1167 -#define _LOAD_FAST_r01 1168 -#define _LOAD_FAST_r12 1169 -#define _LOAD_FAST_r23 1170 -#define _LOAD_FAST_0_r01 1171 -#define _LOAD_FAST_0_r12 1172 -#define _LOAD_FAST_0_r23 1173 -#define _LOAD_FAST_1_r01 1174 -#define _LOAD_FAST_1_r12 1175 -#define _LOAD_FAST_1_r23 1176 -#define _LOAD_FAST_2_r01 1177 -#define _LOAD_FAST_2_r12 1178 -#define _LOAD_FAST_2_r23 1179 -#define _LOAD_FAST_3_r01 1180 -#define _LOAD_FAST_3_r12 1181 -#define _LOAD_FAST_3_r23 1182 -#define _LOAD_FAST_4_r01 1183 -#define _LOAD_FAST_4_r12 1184 -#define _LOAD_FAST_4_r23 1185 -#define _LOAD_FAST_5_r01 1186 -#define _LOAD_FAST_5_r12 1187 -#define _LOAD_FAST_5_r23 1188 -#define _LOAD_FAST_6_r01 1189 -#define _LOAD_FAST_6_r12 1190 -#define _LOAD_FAST_6_r23 1191 -#define _LOAD_FAST_7_r01 1192 -#define _LOAD_FAST_7_r12 1193 -#define _LOAD_FAST_7_r23 1194 -#define _LOAD_FAST_AND_CLEAR_r01 1195 -#define _LOAD_FAST_AND_CLEAR_r12 1196 -#define _LOAD_FAST_AND_CLEAR_r23 1197 -#define _LOAD_FAST_BORROW_r01 1198 -#define _LOAD_FAST_BORROW_r12 1199 -#define _LOAD_FAST_BORROW_r23 1200 -#define _LOAD_FAST_BORROW_0_r01 1201 -#define _LOAD_FAST_BORROW_0_r12 1202 -#define _LOAD_FAST_BORROW_0_r23 1203 -#define _LOAD_FAST_BORROW_1_r01 1204 -#define _LOAD_FAST_BORROW_1_r12 1205 -#define _LOAD_FAST_BORROW_1_r23 1206 -#define _LOAD_FAST_BORROW_2_r01 1207 -#define _LOAD_FAST_BORROW_2_r12 1208 -#define _LOAD_FAST_BORROW_2_r23 1209 -#define _LOAD_FAST_BORROW_3_r01 1210 -#define _LOAD_FAST_BORROW_3_r12 1211 -#define _LOAD_FAST_BORROW_3_r23 1212 -#define _LOAD_FAST_BORROW_4_r01 1213 -#define _LOAD_FAST_BORROW_4_r12 1214 -#define _LOAD_FAST_BORROW_4_r23 1215 -#define _LOAD_FAST_BORROW_5_r01 1216 -#define _LOAD_FAST_BORROW_5_r12 1217 -#define _LOAD_FAST_BORROW_5_r23 1218 -#define _LOAD_FAST_BORROW_6_r01 1219 -#define _LOAD_FAST_BORROW_6_r12 1220 -#define _LOAD_FAST_BORROW_6_r23 1221 -#define _LOAD_FAST_BORROW_7_r01 1222 -#define _LOAD_FAST_BORROW_7_r12 1223 -#define _LOAD_FAST_BORROW_7_r23 1224 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1225 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1226 -#define _LOAD_FAST_CHECK_r01 1227 -#define _LOAD_FAST_CHECK_r12 1228 -#define _LOAD_FAST_CHECK_r23 1229 -#define _LOAD_FAST_LOAD_FAST_r02 1230 -#define _LOAD_FAST_LOAD_FAST_r13 1231 -#define _LOAD_FROM_DICT_OR_DEREF_r11 1232 -#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1233 -#define _LOAD_GLOBAL_r00 1234 -#define _LOAD_GLOBAL_BUILTINS_r01 1235 -#define _LOAD_GLOBAL_MODULE_r01 1236 -#define _LOAD_LOCALS_r01 1237 -#define _LOAD_LOCALS_r12 1238 -#define _LOAD_LOCALS_r23 1239 -#define _LOAD_NAME_r01 1240 -#define _LOAD_SMALL_INT_r01 1241 -#define _LOAD_SMALL_INT_r12 1242 -#define _LOAD_SMALL_INT_r23 1243 -#define _LOAD_SMALL_INT_0_r01 1244 -#define _LOAD_SMALL_INT_0_r12 1245 -#define _LOAD_SMALL_INT_0_r23 1246 -#define _LOAD_SMALL_INT_1_r01 1247 -#define _LOAD_SMALL_INT_1_r12 1248 -#define _LOAD_SMALL_INT_1_r23 1249 -#define _LOAD_SMALL_INT_2_r01 1250 -#define _LOAD_SMALL_INT_2_r12 1251 -#define _LOAD_SMALL_INT_2_r23 1252 -#define _LOAD_SMALL_INT_3_r01 1253 -#define _LOAD_SMALL_INT_3_r12 1254 -#define _LOAD_SMALL_INT_3_r23 1255 -#define _LOAD_SPECIAL_r00 1256 -#define _LOAD_SUPER_ATTR_ATTR_r31 1257 -#define _LOAD_SUPER_ATTR_METHOD_r32 1258 -#define _LOCK_OBJECT_r01 1259 -#define _LOCK_OBJECT_r11 1260 -#define _LOCK_OBJECT_r22 1261 -#define _LOCK_OBJECT_r33 1262 -#define _MAKE_CALLARGS_A_TUPLE_r33 1263 -#define _MAKE_CELL_r00 1264 -#define _MAKE_FUNCTION_r11 1265 -#define _MAKE_HEAP_SAFE_r01 1266 -#define _MAKE_HEAP_SAFE_r11 1267 -#define _MAKE_HEAP_SAFE_r22 1268 -#define _MAKE_HEAP_SAFE_r33 1269 -#define _MAKE_WARM_r00 1270 -#define _MAKE_WARM_r11 1271 -#define _MAKE_WARM_r22 1272 -#define _MAKE_WARM_r33 1273 -#define _MAP_ADD_r20 1274 -#define _MATCH_CLASS_r33 1275 -#define _MATCH_KEYS_r23 1276 -#define _MATCH_MAPPING_r02 1277 -#define _MATCH_MAPPING_r12 1278 -#define _MATCH_MAPPING_r23 1279 -#define _MATCH_SEQUENCE_r02 1280 -#define _MATCH_SEQUENCE_r12 1281 -#define _MATCH_SEQUENCE_r23 1282 -#define _MAYBE_EXPAND_METHOD_r00 1283 -#define _MAYBE_EXPAND_METHOD_KW_r11 1284 -#define _MONITOR_CALL_r00 1285 -#define _MONITOR_CALL_KW_r11 1286 -#define _MONITOR_JUMP_BACKWARD_r00 1287 -#define _MONITOR_JUMP_BACKWARD_r11 1288 -#define _MONITOR_JUMP_BACKWARD_r22 1289 -#define _MONITOR_JUMP_BACKWARD_r33 1290 -#define _MONITOR_RESUME_r00 1291 -#define _NOP_r00 1292 -#define _NOP_r11 1293 -#define _NOP_r22 1294 -#define _NOP_r33 1295 -#define _POP_CALL_r20 1296 -#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1297 -#define _POP_CALL_ONE_r30 1298 -#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1299 -#define _POP_CALL_TWO_r30 1300 -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1301 -#define _POP_EXCEPT_r10 1302 -#define _POP_ITER_r20 1303 -#define _POP_JUMP_IF_FALSE_r00 1304 -#define _POP_JUMP_IF_FALSE_r10 1305 -#define _POP_JUMP_IF_FALSE_r21 1306 -#define _POP_JUMP_IF_FALSE_r32 1307 -#define _POP_JUMP_IF_TRUE_r00 1308 -#define _POP_JUMP_IF_TRUE_r10 1309 -#define _POP_JUMP_IF_TRUE_r21 1310 -#define _POP_JUMP_IF_TRUE_r32 1311 -#define _POP_TOP_r10 1312 -#define _POP_TOP_FLOAT_r00 1313 -#define _POP_TOP_FLOAT_r10 1314 -#define _POP_TOP_FLOAT_r21 1315 -#define _POP_TOP_FLOAT_r32 1316 -#define _POP_TOP_INT_r00 1317 -#define _POP_TOP_INT_r10 1318 -#define _POP_TOP_INT_r21 1319 -#define _POP_TOP_INT_r32 1320 -#define _POP_TOP_LOAD_CONST_INLINE_r11 1321 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1322 -#define _POP_TOP_NOP_r00 1323 -#define _POP_TOP_NOP_r10 1324 -#define _POP_TOP_NOP_r21 1325 -#define _POP_TOP_NOP_r32 1326 -#define _POP_TOP_UNICODE_r00 1327 -#define _POP_TOP_UNICODE_r10 1328 -#define _POP_TOP_UNICODE_r21 1329 -#define _POP_TOP_UNICODE_r32 1330 -#define _POP_TWO_r20 1331 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1332 -#define _PUSH_EXC_INFO_r02 1333 -#define _PUSH_EXC_INFO_r12 1334 -#define _PUSH_EXC_INFO_r23 1335 -#define _PUSH_FRAME_r10 1336 -#define _PUSH_NULL_r01 1337 -#define _PUSH_NULL_r12 1338 -#define _PUSH_NULL_r23 1339 -#define _PUSH_NULL_CONDITIONAL_r00 1340 -#define _PY_FRAME_EX_r31 1341 -#define _PY_FRAME_GENERAL_r01 1342 -#define _PY_FRAME_KW_r11 1343 -#define _QUICKEN_RESUME_r00 1344 -#define _QUICKEN_RESUME_r11 1345 -#define _QUICKEN_RESUME_r22 1346 -#define _QUICKEN_RESUME_r33 1347 -#define _REPLACE_WITH_TRUE_r02 1348 -#define _REPLACE_WITH_TRUE_r12 1349 -#define _REPLACE_WITH_TRUE_r23 1350 -#define _RESUME_CHECK_r00 1351 -#define _RESUME_CHECK_r11 1352 -#define _RESUME_CHECK_r22 1353 -#define _RESUME_CHECK_r33 1354 -#define _RETURN_GENERATOR_r01 1355 -#define _RETURN_VALUE_r11 1356 -#define _SAVE_RETURN_OFFSET_r00 1357 -#define _SAVE_RETURN_OFFSET_r11 1358 -#define _SAVE_RETURN_OFFSET_r22 1359 -#define _SAVE_RETURN_OFFSET_r33 1360 -#define _SEND_r22 1361 -#define _SEND_GEN_FRAME_r22 1362 -#define _SETUP_ANNOTATIONS_r00 1363 -#define _SET_ADD_r10 1364 -#define _SET_FUNCTION_ATTRIBUTE_r01 1365 -#define _SET_FUNCTION_ATTRIBUTE_r11 1366 -#define _SET_FUNCTION_ATTRIBUTE_r21 1367 -#define _SET_FUNCTION_ATTRIBUTE_r32 1368 -#define _SET_IP_r00 1369 -#define _SET_IP_r11 1370 -#define _SET_IP_r22 1371 -#define _SET_IP_r33 1372 -#define _SET_UPDATE_r10 1373 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1374 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1375 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1376 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1377 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1378 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1379 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1380 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1381 -#define _SPILL_OR_RELOAD_r01 1382 -#define _SPILL_OR_RELOAD_r02 1383 -#define _SPILL_OR_RELOAD_r03 1384 -#define _SPILL_OR_RELOAD_r10 1385 -#define _SPILL_OR_RELOAD_r12 1386 -#define _SPILL_OR_RELOAD_r13 1387 -#define _SPILL_OR_RELOAD_r20 1388 -#define _SPILL_OR_RELOAD_r21 1389 -#define _SPILL_OR_RELOAD_r23 1390 -#define _SPILL_OR_RELOAD_r30 1391 -#define _SPILL_OR_RELOAD_r31 1392 -#define _SPILL_OR_RELOAD_r32 1393 -#define _START_EXECUTOR_r00 1394 -#define _STORE_ATTR_r20 1395 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1396 -#define _STORE_ATTR_SLOT_r21 1397 -#define _STORE_ATTR_WITH_HINT_r21 1398 -#define _STORE_DEREF_r10 1399 -#define _STORE_FAST_LOAD_FAST_r11 1400 -#define _STORE_FAST_STORE_FAST_r20 1401 -#define _STORE_GLOBAL_r10 1402 -#define _STORE_NAME_r10 1403 -#define _STORE_SLICE_r30 1404 -#define _STORE_SUBSCR_r30 1405 -#define _STORE_SUBSCR_DICT_r31 1406 -#define _STORE_SUBSCR_LIST_INT_r32 1407 -#define _SWAP_r11 1408 -#define _SWAP_2_r02 1409 -#define _SWAP_2_r12 1410 -#define _SWAP_2_r22 1411 -#define _SWAP_2_r33 1412 -#define _SWAP_3_r03 1413 -#define _SWAP_3_r13 1414 -#define _SWAP_3_r23 1415 -#define _SWAP_3_r33 1416 -#define _SWAP_FAST_r01 1417 -#define _SWAP_FAST_r11 1418 -#define _SWAP_FAST_r22 1419 -#define _SWAP_FAST_r33 1420 -#define _SWAP_FAST_0_r01 1421 -#define _SWAP_FAST_0_r11 1422 -#define _SWAP_FAST_0_r22 1423 -#define _SWAP_FAST_0_r33 1424 -#define _SWAP_FAST_1_r01 1425 -#define _SWAP_FAST_1_r11 1426 -#define _SWAP_FAST_1_r22 1427 -#define _SWAP_FAST_1_r33 1428 -#define _SWAP_FAST_2_r01 1429 -#define _SWAP_FAST_2_r11 1430 -#define _SWAP_FAST_2_r22 1431 -#define _SWAP_FAST_2_r33 1432 -#define _SWAP_FAST_3_r01 1433 -#define _SWAP_FAST_3_r11 1434 -#define _SWAP_FAST_3_r22 1435 -#define _SWAP_FAST_3_r33 1436 -#define _SWAP_FAST_4_r01 1437 -#define _SWAP_FAST_4_r11 1438 -#define _SWAP_FAST_4_r22 1439 -#define _SWAP_FAST_4_r33 1440 -#define _SWAP_FAST_5_r01 1441 -#define _SWAP_FAST_5_r11 1442 -#define _SWAP_FAST_5_r22 1443 -#define _SWAP_FAST_5_r33 1444 -#define _SWAP_FAST_6_r01 1445 -#define _SWAP_FAST_6_r11 1446 -#define _SWAP_FAST_6_r22 1447 -#define _SWAP_FAST_6_r33 1448 -#define _SWAP_FAST_7_r01 1449 -#define _SWAP_FAST_7_r11 1450 -#define _SWAP_FAST_7_r22 1451 -#define _SWAP_FAST_7_r33 1452 -#define _TIER2_RESUME_CHECK_r00 1453 -#define _TIER2_RESUME_CHECK_r11 1454 -#define _TIER2_RESUME_CHECK_r22 1455 -#define _TIER2_RESUME_CHECK_r33 1456 -#define _TO_BOOL_r11 1457 -#define _TO_BOOL_BOOL_r01 1458 -#define _TO_BOOL_BOOL_r11 1459 -#define _TO_BOOL_BOOL_r22 1460 -#define _TO_BOOL_BOOL_r33 1461 -#define _TO_BOOL_INT_r02 1462 -#define _TO_BOOL_INT_r12 1463 -#define _TO_BOOL_INT_r23 1464 -#define _TO_BOOL_LIST_r02 1465 -#define _TO_BOOL_LIST_r12 1466 -#define _TO_BOOL_LIST_r23 1467 -#define _TO_BOOL_NONE_r01 1468 -#define _TO_BOOL_NONE_r11 1469 -#define _TO_BOOL_NONE_r22 1470 -#define _TO_BOOL_NONE_r33 1471 -#define _TO_BOOL_STR_r02 1472 -#define _TO_BOOL_STR_r12 1473 -#define _TO_BOOL_STR_r23 1474 -#define _TRACE_RECORD_r00 1475 -#define _UNARY_INVERT_r12 1476 -#define _UNARY_NEGATIVE_r12 1477 -#define _UNARY_NOT_r01 1478 -#define _UNARY_NOT_r11 1479 -#define _UNARY_NOT_r22 1480 -#define _UNARY_NOT_r33 1481 -#define _UNPACK_EX_r10 1482 -#define _UNPACK_SEQUENCE_r10 1483 -#define _UNPACK_SEQUENCE_LIST_r10 1484 -#define _UNPACK_SEQUENCE_TUPLE_r10 1485 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1486 -#define _WITH_EXCEPT_START_r33 1487 -#define _YIELD_VALUE_r11 1488 -#define MAX_UOP_REGS_ID 1488 +#define _YIELD_VALUE 599 +#define MAX_UOP_ID 599 +#define _BINARY_OP_r23 600 +#define _BINARY_OP_ADD_FLOAT_r03 601 +#define _BINARY_OP_ADD_FLOAT_r13 602 +#define _BINARY_OP_ADD_FLOAT_r23 603 +#define _BINARY_OP_ADD_INT_r03 604 +#define _BINARY_OP_ADD_INT_r13 605 +#define _BINARY_OP_ADD_INT_r23 606 +#define _BINARY_OP_ADD_UNICODE_r03 607 +#define _BINARY_OP_ADD_UNICODE_r13 608 +#define _BINARY_OP_ADD_UNICODE_r23 609 +#define _BINARY_OP_EXTEND_r23 610 +#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 611 +#define _BINARY_OP_MULTIPLY_FLOAT_r03 612 +#define _BINARY_OP_MULTIPLY_FLOAT_r13 613 +#define _BINARY_OP_MULTIPLY_FLOAT_r23 614 +#define _BINARY_OP_MULTIPLY_INT_r03 615 +#define _BINARY_OP_MULTIPLY_INT_r13 616 +#define _BINARY_OP_MULTIPLY_INT_r23 617 +#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 618 +#define _BINARY_OP_SUBSCR_DICT_r23 619 +#define _BINARY_OP_SUBSCR_INIT_CALL_r01 620 +#define _BINARY_OP_SUBSCR_INIT_CALL_r11 621 +#define _BINARY_OP_SUBSCR_INIT_CALL_r21 622 +#define _BINARY_OP_SUBSCR_INIT_CALL_r31 623 +#define _BINARY_OP_SUBSCR_LIST_INT_r23 624 +#define _BINARY_OP_SUBSCR_LIST_SLICE_r23 625 +#define _BINARY_OP_SUBSCR_STR_INT_r23 626 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 627 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 628 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 629 +#define _BINARY_OP_SUBSCR_USTR_INT_r23 630 +#define _BINARY_OP_SUBTRACT_FLOAT_r03 631 +#define _BINARY_OP_SUBTRACT_FLOAT_r13 632 +#define _BINARY_OP_SUBTRACT_FLOAT_r23 633 +#define _BINARY_OP_SUBTRACT_INT_r03 634 +#define _BINARY_OP_SUBTRACT_INT_r13 635 +#define _BINARY_OP_SUBTRACT_INT_r23 636 +#define _BINARY_SLICE_r31 637 +#define _BUILD_INTERPOLATION_r01 638 +#define _BUILD_LIST_r01 639 +#define _BUILD_MAP_r01 640 +#define _BUILD_SET_r01 641 +#define _BUILD_SLICE_r01 642 +#define _BUILD_STRING_r01 643 +#define _BUILD_TEMPLATE_r21 644 +#define _BUILD_TUPLE_r01 645 +#define _CALL_BUILTIN_CLASS_r01 646 +#define _CALL_BUILTIN_FAST_r01 647 +#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 648 +#define _CALL_BUILTIN_O_r03 649 +#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 650 +#define _CALL_INTRINSIC_1_r12 651 +#define _CALL_INTRINSIC_2_r21 652 +#define _CALL_ISINSTANCE_r31 653 +#define _CALL_KW_NON_PY_r11 654 +#define _CALL_LEN_r33 655 +#define _CALL_LIST_APPEND_r03 656 +#define _CALL_LIST_APPEND_r13 657 +#define _CALL_LIST_APPEND_r23 658 +#define _CALL_LIST_APPEND_r33 659 +#define _CALL_METHOD_DESCRIPTOR_FAST_r01 660 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 661 +#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 662 +#define _CALL_METHOD_DESCRIPTOR_O_r03 663 +#define _CALL_NON_PY_GENERAL_r01 664 +#define _CALL_STR_1_r32 665 +#define _CALL_TUPLE_1_r32 666 +#define _CALL_TYPE_1_r02 667 +#define _CALL_TYPE_1_r12 668 +#define _CALL_TYPE_1_r22 669 +#define _CALL_TYPE_1_r32 670 +#define _CHECK_AND_ALLOCATE_OBJECT_r00 671 +#define _CHECK_ATTR_CLASS_r01 672 +#define _CHECK_ATTR_CLASS_r11 673 +#define _CHECK_ATTR_CLASS_r22 674 +#define _CHECK_ATTR_CLASS_r33 675 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 676 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 677 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 678 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 679 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 680 +#define _CHECK_EG_MATCH_r22 681 +#define _CHECK_EXC_MATCH_r22 682 +#define _CHECK_FUNCTION_EXACT_ARGS_r00 683 +#define _CHECK_FUNCTION_VERSION_r00 684 +#define _CHECK_FUNCTION_VERSION_INLINE_r00 685 +#define _CHECK_FUNCTION_VERSION_INLINE_r11 686 +#define _CHECK_FUNCTION_VERSION_INLINE_r22 687 +#define _CHECK_FUNCTION_VERSION_INLINE_r33 688 +#define _CHECK_FUNCTION_VERSION_KW_r11 689 +#define _CHECK_IS_NOT_PY_CALLABLE_r00 690 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 691 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 692 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 693 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 694 +#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 695 +#define _CHECK_IS_PY_CALLABLE_EX_r03 696 +#define _CHECK_IS_PY_CALLABLE_EX_r13 697 +#define _CHECK_IS_PY_CALLABLE_EX_r23 698 +#define _CHECK_IS_PY_CALLABLE_EX_r33 699 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 700 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 701 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 702 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 703 +#define _CHECK_METHOD_VERSION_r00 704 +#define _CHECK_METHOD_VERSION_KW_r11 705 +#define _CHECK_PEP_523_r00 706 +#define _CHECK_PEP_523_r11 707 +#define _CHECK_PEP_523_r22 708 +#define _CHECK_PEP_523_r33 709 +#define _CHECK_PERIODIC_r00 710 +#define _CHECK_PERIODIC_AT_END_r00 711 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 712 +#define _CHECK_RECURSION_REMAINING_r00 713 +#define _CHECK_RECURSION_REMAINING_r11 714 +#define _CHECK_RECURSION_REMAINING_r22 715 +#define _CHECK_RECURSION_REMAINING_r33 716 +#define _CHECK_STACK_SPACE_r00 717 +#define _CHECK_STACK_SPACE_OPERAND_r00 718 +#define _CHECK_STACK_SPACE_OPERAND_r11 719 +#define _CHECK_STACK_SPACE_OPERAND_r22 720 +#define _CHECK_STACK_SPACE_OPERAND_r33 721 +#define _CHECK_VALIDITY_r00 722 +#define _CHECK_VALIDITY_r11 723 +#define _CHECK_VALIDITY_r22 724 +#define _CHECK_VALIDITY_r33 725 +#define _COLD_DYNAMIC_EXIT_r00 726 +#define _COLD_EXIT_r00 727 +#define _COMPARE_OP_r21 728 +#define _COMPARE_OP_FLOAT_r03 729 +#define _COMPARE_OP_FLOAT_r13 730 +#define _COMPARE_OP_FLOAT_r23 731 +#define _COMPARE_OP_INT_r23 732 +#define _COMPARE_OP_STR_r23 733 +#define _CONTAINS_OP_r23 734 +#define _CONTAINS_OP_DICT_r23 735 +#define _CONTAINS_OP_SET_r23 736 +#define _CONVERT_VALUE_r11 737 +#define _COPY_r01 738 +#define _COPY_1_r02 739 +#define _COPY_1_r12 740 +#define _COPY_1_r23 741 +#define _COPY_2_r03 742 +#define _COPY_2_r13 743 +#define _COPY_2_r23 744 +#define _COPY_3_r03 745 +#define _COPY_3_r13 746 +#define _COPY_3_r23 747 +#define _COPY_3_r33 748 +#define _COPY_FREE_VARS_r00 749 +#define _COPY_FREE_VARS_r11 750 +#define _COPY_FREE_VARS_r22 751 +#define _COPY_FREE_VARS_r33 752 +#define _CREATE_INIT_FRAME_r01 753 +#define _DELETE_ATTR_r10 754 +#define _DELETE_DEREF_r00 755 +#define _DELETE_FAST_r00 756 +#define _DELETE_GLOBAL_r00 757 +#define _DELETE_NAME_r00 758 +#define _DELETE_SUBSCR_r20 759 +#define _DEOPT_r00 760 +#define _DEOPT_r10 761 +#define _DEOPT_r20 762 +#define _DEOPT_r30 763 +#define _DICT_MERGE_r10 764 +#define _DICT_UPDATE_r10 765 +#define _DO_CALL_r01 766 +#define _DO_CALL_FUNCTION_EX_r31 767 +#define _DO_CALL_KW_r11 768 +#define _DYNAMIC_EXIT_r00 769 +#define _DYNAMIC_EXIT_r10 770 +#define _DYNAMIC_EXIT_r20 771 +#define _DYNAMIC_EXIT_r30 772 +#define _END_FOR_r10 773 +#define _END_SEND_r21 774 +#define _ERROR_POP_N_r00 775 +#define _EXIT_INIT_CHECK_r10 776 +#define _EXIT_TRACE_r00 777 +#define _EXIT_TRACE_r10 778 +#define _EXIT_TRACE_r20 779 +#define _EXIT_TRACE_r30 780 +#define _EXPAND_METHOD_r00 781 +#define _EXPAND_METHOD_KW_r11 782 +#define _FATAL_ERROR_r00 783 +#define _FATAL_ERROR_r11 784 +#define _FATAL_ERROR_r22 785 +#define _FATAL_ERROR_r33 786 +#define _FORMAT_SIMPLE_r11 787 +#define _FORMAT_WITH_SPEC_r21 788 +#define _FOR_ITER_r23 789 +#define _FOR_ITER_GEN_FRAME_r03 790 +#define _FOR_ITER_GEN_FRAME_r13 791 +#define _FOR_ITER_GEN_FRAME_r23 792 +#define _FOR_ITER_TIER_TWO_r23 793 +#define _GET_AITER_r11 794 +#define _GET_ANEXT_r12 795 +#define _GET_AWAITABLE_r11 796 +#define _GET_ITER_r12 797 +#define _GET_LEN_r12 798 +#define _GET_YIELD_FROM_ITER_r11 799 +#define _GUARD_BINARY_OP_EXTEND_r22 800 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 801 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 802 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 803 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 804 +#define _GUARD_BIT_IS_SET_POP_r00 805 +#define _GUARD_BIT_IS_SET_POP_r10 806 +#define _GUARD_BIT_IS_SET_POP_r21 807 +#define _GUARD_BIT_IS_SET_POP_r32 808 +#define _GUARD_BIT_IS_SET_POP_4_r00 809 +#define _GUARD_BIT_IS_SET_POP_4_r10 810 +#define _GUARD_BIT_IS_SET_POP_4_r21 811 +#define _GUARD_BIT_IS_SET_POP_4_r32 812 +#define _GUARD_BIT_IS_SET_POP_5_r00 813 +#define _GUARD_BIT_IS_SET_POP_5_r10 814 +#define _GUARD_BIT_IS_SET_POP_5_r21 815 +#define _GUARD_BIT_IS_SET_POP_5_r32 816 +#define _GUARD_BIT_IS_SET_POP_6_r00 817 +#define _GUARD_BIT_IS_SET_POP_6_r10 818 +#define _GUARD_BIT_IS_SET_POP_6_r21 819 +#define _GUARD_BIT_IS_SET_POP_6_r32 820 +#define _GUARD_BIT_IS_SET_POP_7_r00 821 +#define _GUARD_BIT_IS_SET_POP_7_r10 822 +#define _GUARD_BIT_IS_SET_POP_7_r21 823 +#define _GUARD_BIT_IS_SET_POP_7_r32 824 +#define _GUARD_BIT_IS_UNSET_POP_r00 825 +#define _GUARD_BIT_IS_UNSET_POP_r10 826 +#define _GUARD_BIT_IS_UNSET_POP_r21 827 +#define _GUARD_BIT_IS_UNSET_POP_r32 828 +#define _GUARD_BIT_IS_UNSET_POP_4_r00 829 +#define _GUARD_BIT_IS_UNSET_POP_4_r10 830 +#define _GUARD_BIT_IS_UNSET_POP_4_r21 831 +#define _GUARD_BIT_IS_UNSET_POP_4_r32 832 +#define _GUARD_BIT_IS_UNSET_POP_5_r00 833 +#define _GUARD_BIT_IS_UNSET_POP_5_r10 834 +#define _GUARD_BIT_IS_UNSET_POP_5_r21 835 +#define _GUARD_BIT_IS_UNSET_POP_5_r32 836 +#define _GUARD_BIT_IS_UNSET_POP_6_r00 837 +#define _GUARD_BIT_IS_UNSET_POP_6_r10 838 +#define _GUARD_BIT_IS_UNSET_POP_6_r21 839 +#define _GUARD_BIT_IS_UNSET_POP_6_r32 840 +#define _GUARD_BIT_IS_UNSET_POP_7_r00 841 +#define _GUARD_BIT_IS_UNSET_POP_7_r10 842 +#define _GUARD_BIT_IS_UNSET_POP_7_r21 843 +#define _GUARD_BIT_IS_UNSET_POP_7_r32 844 +#define _GUARD_CALLABLE_ISINSTANCE_r03 845 +#define _GUARD_CALLABLE_ISINSTANCE_r13 846 +#define _GUARD_CALLABLE_ISINSTANCE_r23 847 +#define _GUARD_CALLABLE_ISINSTANCE_r33 848 +#define _GUARD_CALLABLE_LEN_r03 849 +#define _GUARD_CALLABLE_LEN_r13 850 +#define _GUARD_CALLABLE_LEN_r23 851 +#define _GUARD_CALLABLE_LEN_r33 852 +#define _GUARD_CALLABLE_LIST_APPEND_r03 853 +#define _GUARD_CALLABLE_LIST_APPEND_r13 854 +#define _GUARD_CALLABLE_LIST_APPEND_r23 855 +#define _GUARD_CALLABLE_LIST_APPEND_r33 856 +#define _GUARD_CALLABLE_STR_1_r03 857 +#define _GUARD_CALLABLE_STR_1_r13 858 +#define _GUARD_CALLABLE_STR_1_r23 859 +#define _GUARD_CALLABLE_STR_1_r33 860 +#define _GUARD_CALLABLE_TUPLE_1_r03 861 +#define _GUARD_CALLABLE_TUPLE_1_r13 862 +#define _GUARD_CALLABLE_TUPLE_1_r23 863 +#define _GUARD_CALLABLE_TUPLE_1_r33 864 +#define _GUARD_CALLABLE_TYPE_1_r03 865 +#define _GUARD_CALLABLE_TYPE_1_r13 866 +#define _GUARD_CALLABLE_TYPE_1_r23 867 +#define _GUARD_CALLABLE_TYPE_1_r33 868 +#define _GUARD_CODE_VERSION_r00 869 +#define _GUARD_CODE_VERSION_r11 870 +#define _GUARD_CODE_VERSION_r22 871 +#define _GUARD_CODE_VERSION_r33 872 +#define _GUARD_DORV_NO_DICT_r01 873 +#define _GUARD_DORV_NO_DICT_r11 874 +#define _GUARD_DORV_NO_DICT_r22 875 +#define _GUARD_DORV_NO_DICT_r33 876 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 877 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 878 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 879 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 880 +#define _GUARD_GLOBALS_VERSION_r00 881 +#define _GUARD_GLOBALS_VERSION_r11 882 +#define _GUARD_GLOBALS_VERSION_r22 883 +#define _GUARD_GLOBALS_VERSION_r33 884 +#define _GUARD_IP_RETURN_GENERATOR_r00 885 +#define _GUARD_IP_RETURN_GENERATOR_r11 886 +#define _GUARD_IP_RETURN_GENERATOR_r22 887 +#define _GUARD_IP_RETURN_GENERATOR_r33 888 +#define _GUARD_IP_RETURN_VALUE_r00 889 +#define _GUARD_IP_RETURN_VALUE_r11 890 +#define _GUARD_IP_RETURN_VALUE_r22 891 +#define _GUARD_IP_RETURN_VALUE_r33 892 +#define _GUARD_IP_YIELD_VALUE_r00 893 +#define _GUARD_IP_YIELD_VALUE_r11 894 +#define _GUARD_IP_YIELD_VALUE_r22 895 +#define _GUARD_IP_YIELD_VALUE_r33 896 +#define _GUARD_IP__PUSH_FRAME_r00 897 +#define _GUARD_IP__PUSH_FRAME_r11 898 +#define _GUARD_IP__PUSH_FRAME_r22 899 +#define _GUARD_IP__PUSH_FRAME_r33 900 +#define _GUARD_IS_FALSE_POP_r00 901 +#define _GUARD_IS_FALSE_POP_r10 902 +#define _GUARD_IS_FALSE_POP_r21 903 +#define _GUARD_IS_FALSE_POP_r32 904 +#define _GUARD_IS_NONE_POP_r00 905 +#define _GUARD_IS_NONE_POP_r10 906 +#define _GUARD_IS_NONE_POP_r21 907 +#define _GUARD_IS_NONE_POP_r32 908 +#define _GUARD_IS_NOT_NONE_POP_r10 909 +#define _GUARD_IS_TRUE_POP_r00 910 +#define _GUARD_IS_TRUE_POP_r10 911 +#define _GUARD_IS_TRUE_POP_r21 912 +#define _GUARD_IS_TRUE_POP_r32 913 +#define _GUARD_KEYS_VERSION_r01 914 +#define _GUARD_KEYS_VERSION_r11 915 +#define _GUARD_KEYS_VERSION_r22 916 +#define _GUARD_KEYS_VERSION_r33 917 +#define _GUARD_NOS_ANY_DICT_r02 918 +#define _GUARD_NOS_ANY_DICT_r12 919 +#define _GUARD_NOS_ANY_DICT_r22 920 +#define _GUARD_NOS_ANY_DICT_r33 921 +#define _GUARD_NOS_COMPACT_ASCII_r02 922 +#define _GUARD_NOS_COMPACT_ASCII_r12 923 +#define _GUARD_NOS_COMPACT_ASCII_r22 924 +#define _GUARD_NOS_COMPACT_ASCII_r33 925 +#define _GUARD_NOS_DICT_r02 926 +#define _GUARD_NOS_DICT_r12 927 +#define _GUARD_NOS_DICT_r22 928 +#define _GUARD_NOS_DICT_r33 929 +#define _GUARD_NOS_FLOAT_r02 930 +#define _GUARD_NOS_FLOAT_r12 931 +#define _GUARD_NOS_FLOAT_r22 932 +#define _GUARD_NOS_FLOAT_r33 933 +#define _GUARD_NOS_INT_r02 934 +#define _GUARD_NOS_INT_r12 935 +#define _GUARD_NOS_INT_r22 936 +#define _GUARD_NOS_INT_r33 937 +#define _GUARD_NOS_LIST_r02 938 +#define _GUARD_NOS_LIST_r12 939 +#define _GUARD_NOS_LIST_r22 940 +#define _GUARD_NOS_LIST_r33 941 +#define _GUARD_NOS_NOT_NULL_r02 942 +#define _GUARD_NOS_NOT_NULL_r12 943 +#define _GUARD_NOS_NOT_NULL_r22 944 +#define _GUARD_NOS_NOT_NULL_r33 945 +#define _GUARD_NOS_NULL_r02 946 +#define _GUARD_NOS_NULL_r12 947 +#define _GUARD_NOS_NULL_r22 948 +#define _GUARD_NOS_NULL_r33 949 +#define _GUARD_NOS_OVERFLOWED_r02 950 +#define _GUARD_NOS_OVERFLOWED_r12 951 +#define _GUARD_NOS_OVERFLOWED_r22 952 +#define _GUARD_NOS_OVERFLOWED_r33 953 +#define _GUARD_NOS_TUPLE_r02 954 +#define _GUARD_NOS_TUPLE_r12 955 +#define _GUARD_NOS_TUPLE_r22 956 +#define _GUARD_NOS_TUPLE_r33 957 +#define _GUARD_NOS_UNICODE_r02 958 +#define _GUARD_NOS_UNICODE_r12 959 +#define _GUARD_NOS_UNICODE_r22 960 +#define _GUARD_NOS_UNICODE_r33 961 +#define _GUARD_NOT_EXHAUSTED_LIST_r02 962 +#define _GUARD_NOT_EXHAUSTED_LIST_r12 963 +#define _GUARD_NOT_EXHAUSTED_LIST_r22 964 +#define _GUARD_NOT_EXHAUSTED_LIST_r33 965 +#define _GUARD_NOT_EXHAUSTED_RANGE_r02 966 +#define _GUARD_NOT_EXHAUSTED_RANGE_r12 967 +#define _GUARD_NOT_EXHAUSTED_RANGE_r22 968 +#define _GUARD_NOT_EXHAUSTED_RANGE_r33 969 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 970 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 971 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 972 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 973 +#define _GUARD_THIRD_NULL_r03 974 +#define _GUARD_THIRD_NULL_r13 975 +#define _GUARD_THIRD_NULL_r23 976 +#define _GUARD_THIRD_NULL_r33 977 +#define _GUARD_TOS_ANY_DICT_r01 978 +#define _GUARD_TOS_ANY_DICT_r11 979 +#define _GUARD_TOS_ANY_DICT_r22 980 +#define _GUARD_TOS_ANY_DICT_r33 981 +#define _GUARD_TOS_ANY_SET_r01 982 +#define _GUARD_TOS_ANY_SET_r11 983 +#define _GUARD_TOS_ANY_SET_r22 984 +#define _GUARD_TOS_ANY_SET_r33 985 +#define _GUARD_TOS_DICT_r01 986 +#define _GUARD_TOS_DICT_r11 987 +#define _GUARD_TOS_DICT_r22 988 +#define _GUARD_TOS_DICT_r33 989 +#define _GUARD_TOS_FLOAT_r01 990 +#define _GUARD_TOS_FLOAT_r11 991 +#define _GUARD_TOS_FLOAT_r22 992 +#define _GUARD_TOS_FLOAT_r33 993 +#define _GUARD_TOS_FROZENDICT_r01 994 +#define _GUARD_TOS_FROZENDICT_r11 995 +#define _GUARD_TOS_FROZENDICT_r22 996 +#define _GUARD_TOS_FROZENDICT_r33 997 +#define _GUARD_TOS_FROZENSET_r01 998 +#define _GUARD_TOS_FROZENSET_r11 999 +#define _GUARD_TOS_FROZENSET_r22 1000 +#define _GUARD_TOS_FROZENSET_r33 1001 +#define _GUARD_TOS_INT_r01 1002 +#define _GUARD_TOS_INT_r11 1003 +#define _GUARD_TOS_INT_r22 1004 +#define _GUARD_TOS_INT_r33 1005 +#define _GUARD_TOS_LIST_r01 1006 +#define _GUARD_TOS_LIST_r11 1007 +#define _GUARD_TOS_LIST_r22 1008 +#define _GUARD_TOS_LIST_r33 1009 +#define _GUARD_TOS_OVERFLOWED_r01 1010 +#define _GUARD_TOS_OVERFLOWED_r11 1011 +#define _GUARD_TOS_OVERFLOWED_r22 1012 +#define _GUARD_TOS_OVERFLOWED_r33 1013 +#define _GUARD_TOS_SET_r01 1014 +#define _GUARD_TOS_SET_r11 1015 +#define _GUARD_TOS_SET_r22 1016 +#define _GUARD_TOS_SET_r33 1017 +#define _GUARD_TOS_SLICE_r01 1018 +#define _GUARD_TOS_SLICE_r11 1019 +#define _GUARD_TOS_SLICE_r22 1020 +#define _GUARD_TOS_SLICE_r33 1021 +#define _GUARD_TOS_TUPLE_r01 1022 +#define _GUARD_TOS_TUPLE_r11 1023 +#define _GUARD_TOS_TUPLE_r22 1024 +#define _GUARD_TOS_TUPLE_r33 1025 +#define _GUARD_TOS_UNICODE_r01 1026 +#define _GUARD_TOS_UNICODE_r11 1027 +#define _GUARD_TOS_UNICODE_r22 1028 +#define _GUARD_TOS_UNICODE_r33 1029 +#define _GUARD_TYPE_VERSION_r01 1030 +#define _GUARD_TYPE_VERSION_r11 1031 +#define _GUARD_TYPE_VERSION_r22 1032 +#define _GUARD_TYPE_VERSION_r33 1033 +#define _GUARD_TYPE_VERSION_LOCKED_r01 1034 +#define _GUARD_TYPE_VERSION_LOCKED_r11 1035 +#define _GUARD_TYPE_VERSION_LOCKED_r22 1036 +#define _GUARD_TYPE_VERSION_LOCKED_r33 1037 +#define _HANDLE_PENDING_AND_DEOPT_r00 1038 +#define _HANDLE_PENDING_AND_DEOPT_r10 1039 +#define _HANDLE_PENDING_AND_DEOPT_r20 1040 +#define _HANDLE_PENDING_AND_DEOPT_r30 1041 +#define _IMPORT_FROM_r12 1042 +#define _IMPORT_NAME_r21 1043 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1044 +#define _INIT_CALL_PY_EXACT_ARGS_r01 1045 +#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1046 +#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1047 +#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1048 +#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1049 +#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1050 +#define _INSERT_1_LOAD_CONST_INLINE_r02 1051 +#define _INSERT_1_LOAD_CONST_INLINE_r12 1052 +#define _INSERT_1_LOAD_CONST_INLINE_r23 1053 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1054 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1055 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1056 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1057 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1058 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1059 +#define _INSERT_NULL_r10 1060 +#define _INSTRUMENTED_FOR_ITER_r23 1061 +#define _INSTRUMENTED_INSTRUCTION_r00 1062 +#define _INSTRUMENTED_JUMP_FORWARD_r00 1063 +#define _INSTRUMENTED_JUMP_FORWARD_r11 1064 +#define _INSTRUMENTED_JUMP_FORWARD_r22 1065 +#define _INSTRUMENTED_JUMP_FORWARD_r33 1066 +#define _INSTRUMENTED_LINE_r00 1067 +#define _INSTRUMENTED_NOT_TAKEN_r00 1068 +#define _INSTRUMENTED_NOT_TAKEN_r11 1069 +#define _INSTRUMENTED_NOT_TAKEN_r22 1070 +#define _INSTRUMENTED_NOT_TAKEN_r33 1071 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1072 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1073 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1074 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1075 +#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1076 +#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1077 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1078 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1079 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1080 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1081 +#define _IS_NONE_r11 1082 +#define _IS_OP_r03 1083 +#define _IS_OP_r13 1084 +#define _IS_OP_r23 1085 +#define _ITER_CHECK_LIST_r02 1086 +#define _ITER_CHECK_LIST_r12 1087 +#define _ITER_CHECK_LIST_r22 1088 +#define _ITER_CHECK_LIST_r33 1089 +#define _ITER_CHECK_RANGE_r02 1090 +#define _ITER_CHECK_RANGE_r12 1091 +#define _ITER_CHECK_RANGE_r22 1092 +#define _ITER_CHECK_RANGE_r33 1093 +#define _ITER_CHECK_TUPLE_r02 1094 +#define _ITER_CHECK_TUPLE_r12 1095 +#define _ITER_CHECK_TUPLE_r22 1096 +#define _ITER_CHECK_TUPLE_r33 1097 +#define _ITER_JUMP_LIST_r02 1098 +#define _ITER_JUMP_LIST_r12 1099 +#define _ITER_JUMP_LIST_r22 1100 +#define _ITER_JUMP_LIST_r33 1101 +#define _ITER_JUMP_RANGE_r02 1102 +#define _ITER_JUMP_RANGE_r12 1103 +#define _ITER_JUMP_RANGE_r22 1104 +#define _ITER_JUMP_RANGE_r33 1105 +#define _ITER_JUMP_TUPLE_r02 1106 +#define _ITER_JUMP_TUPLE_r12 1107 +#define _ITER_JUMP_TUPLE_r22 1108 +#define _ITER_JUMP_TUPLE_r33 1109 +#define _ITER_NEXT_LIST_r23 1110 +#define _ITER_NEXT_LIST_TIER_TWO_r23 1111 +#define _ITER_NEXT_RANGE_r03 1112 +#define _ITER_NEXT_RANGE_r13 1113 +#define _ITER_NEXT_RANGE_r23 1114 +#define _ITER_NEXT_TUPLE_r03 1115 +#define _ITER_NEXT_TUPLE_r13 1116 +#define _ITER_NEXT_TUPLE_r23 1117 +#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1118 +#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1119 +#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1120 +#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1121 +#define _JUMP_TO_TOP_r00 1122 +#define _LIST_APPEND_r10 1123 +#define _LIST_EXTEND_r10 1124 +#define _LOAD_ATTR_r10 1125 +#define _LOAD_ATTR_CLASS_r11 1126 +#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1127 +#define _LOAD_ATTR_INSTANCE_VALUE_r02 1128 +#define _LOAD_ATTR_INSTANCE_VALUE_r12 1129 +#define _LOAD_ATTR_INSTANCE_VALUE_r23 1130 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1131 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1132 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1133 +#define _LOAD_ATTR_METHOD_NO_DICT_r02 1134 +#define _LOAD_ATTR_METHOD_NO_DICT_r12 1135 +#define _LOAD_ATTR_METHOD_NO_DICT_r23 1136 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1137 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1138 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1139 +#define _LOAD_ATTR_MODULE_r12 1140 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1141 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1142 +#define _LOAD_ATTR_PROPERTY_FRAME_r11 1143 +#define _LOAD_ATTR_SLOT_r02 1144 +#define _LOAD_ATTR_SLOT_r12 1145 +#define _LOAD_ATTR_SLOT_r23 1146 +#define _LOAD_ATTR_WITH_HINT_r12 1147 +#define _LOAD_BUILD_CLASS_r01 1148 +#define _LOAD_BYTECODE_r00 1149 +#define _LOAD_COMMON_CONSTANT_r01 1150 +#define _LOAD_COMMON_CONSTANT_r12 1151 +#define _LOAD_COMMON_CONSTANT_r23 1152 +#define _LOAD_CONST_r01 1153 +#define _LOAD_CONST_r12 1154 +#define _LOAD_CONST_r23 1155 +#define _LOAD_CONST_INLINE_r01 1156 +#define _LOAD_CONST_INLINE_r12 1157 +#define _LOAD_CONST_INLINE_r23 1158 +#define _LOAD_CONST_INLINE_BORROW_r01 1159 +#define _LOAD_CONST_INLINE_BORROW_r12 1160 +#define _LOAD_CONST_INLINE_BORROW_r23 1161 +#define _LOAD_CONST_UNDER_INLINE_r02 1162 +#define _LOAD_CONST_UNDER_INLINE_r12 1163 +#define _LOAD_CONST_UNDER_INLINE_r23 1164 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1165 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1166 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1167 +#define _LOAD_DEREF_r01 1168 +#define _LOAD_FAST_r01 1169 +#define _LOAD_FAST_r12 1170 +#define _LOAD_FAST_r23 1171 +#define _LOAD_FAST_0_r01 1172 +#define _LOAD_FAST_0_r12 1173 +#define _LOAD_FAST_0_r23 1174 +#define _LOAD_FAST_1_r01 1175 +#define _LOAD_FAST_1_r12 1176 +#define _LOAD_FAST_1_r23 1177 +#define _LOAD_FAST_2_r01 1178 +#define _LOAD_FAST_2_r12 1179 +#define _LOAD_FAST_2_r23 1180 +#define _LOAD_FAST_3_r01 1181 +#define _LOAD_FAST_3_r12 1182 +#define _LOAD_FAST_3_r23 1183 +#define _LOAD_FAST_4_r01 1184 +#define _LOAD_FAST_4_r12 1185 +#define _LOAD_FAST_4_r23 1186 +#define _LOAD_FAST_5_r01 1187 +#define _LOAD_FAST_5_r12 1188 +#define _LOAD_FAST_5_r23 1189 +#define _LOAD_FAST_6_r01 1190 +#define _LOAD_FAST_6_r12 1191 +#define _LOAD_FAST_6_r23 1192 +#define _LOAD_FAST_7_r01 1193 +#define _LOAD_FAST_7_r12 1194 +#define _LOAD_FAST_7_r23 1195 +#define _LOAD_FAST_AND_CLEAR_r01 1196 +#define _LOAD_FAST_AND_CLEAR_r12 1197 +#define _LOAD_FAST_AND_CLEAR_r23 1198 +#define _LOAD_FAST_BORROW_r01 1199 +#define _LOAD_FAST_BORROW_r12 1200 +#define _LOAD_FAST_BORROW_r23 1201 +#define _LOAD_FAST_BORROW_0_r01 1202 +#define _LOAD_FAST_BORROW_0_r12 1203 +#define _LOAD_FAST_BORROW_0_r23 1204 +#define _LOAD_FAST_BORROW_1_r01 1205 +#define _LOAD_FAST_BORROW_1_r12 1206 +#define _LOAD_FAST_BORROW_1_r23 1207 +#define _LOAD_FAST_BORROW_2_r01 1208 +#define _LOAD_FAST_BORROW_2_r12 1209 +#define _LOAD_FAST_BORROW_2_r23 1210 +#define _LOAD_FAST_BORROW_3_r01 1211 +#define _LOAD_FAST_BORROW_3_r12 1212 +#define _LOAD_FAST_BORROW_3_r23 1213 +#define _LOAD_FAST_BORROW_4_r01 1214 +#define _LOAD_FAST_BORROW_4_r12 1215 +#define _LOAD_FAST_BORROW_4_r23 1216 +#define _LOAD_FAST_BORROW_5_r01 1217 +#define _LOAD_FAST_BORROW_5_r12 1218 +#define _LOAD_FAST_BORROW_5_r23 1219 +#define _LOAD_FAST_BORROW_6_r01 1220 +#define _LOAD_FAST_BORROW_6_r12 1221 +#define _LOAD_FAST_BORROW_6_r23 1222 +#define _LOAD_FAST_BORROW_7_r01 1223 +#define _LOAD_FAST_BORROW_7_r12 1224 +#define _LOAD_FAST_BORROW_7_r23 1225 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1226 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1227 +#define _LOAD_FAST_CHECK_r01 1228 +#define _LOAD_FAST_CHECK_r12 1229 +#define _LOAD_FAST_CHECK_r23 1230 +#define _LOAD_FAST_LOAD_FAST_r02 1231 +#define _LOAD_FAST_LOAD_FAST_r13 1232 +#define _LOAD_FROM_DICT_OR_DEREF_r11 1233 +#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1234 +#define _LOAD_GLOBAL_r00 1235 +#define _LOAD_GLOBAL_BUILTINS_r01 1236 +#define _LOAD_GLOBAL_MODULE_r01 1237 +#define _LOAD_LOCALS_r01 1238 +#define _LOAD_LOCALS_r12 1239 +#define _LOAD_LOCALS_r23 1240 +#define _LOAD_NAME_r01 1241 +#define _LOAD_SMALL_INT_r01 1242 +#define _LOAD_SMALL_INT_r12 1243 +#define _LOAD_SMALL_INT_r23 1244 +#define _LOAD_SMALL_INT_0_r01 1245 +#define _LOAD_SMALL_INT_0_r12 1246 +#define _LOAD_SMALL_INT_0_r23 1247 +#define _LOAD_SMALL_INT_1_r01 1248 +#define _LOAD_SMALL_INT_1_r12 1249 +#define _LOAD_SMALL_INT_1_r23 1250 +#define _LOAD_SMALL_INT_2_r01 1251 +#define _LOAD_SMALL_INT_2_r12 1252 +#define _LOAD_SMALL_INT_2_r23 1253 +#define _LOAD_SMALL_INT_3_r01 1254 +#define _LOAD_SMALL_INT_3_r12 1255 +#define _LOAD_SMALL_INT_3_r23 1256 +#define _LOAD_SPECIAL_r00 1257 +#define _LOAD_SUPER_ATTR_ATTR_r31 1258 +#define _LOAD_SUPER_ATTR_METHOD_r32 1259 +#define _LOCK_OBJECT_r01 1260 +#define _LOCK_OBJECT_r11 1261 +#define _LOCK_OBJECT_r22 1262 +#define _LOCK_OBJECT_r33 1263 +#define _MAKE_CALLARGS_A_TUPLE_r33 1264 +#define _MAKE_CELL_r00 1265 +#define _MAKE_FUNCTION_r11 1266 +#define _MAKE_HEAP_SAFE_r01 1267 +#define _MAKE_HEAP_SAFE_r11 1268 +#define _MAKE_HEAP_SAFE_r22 1269 +#define _MAKE_HEAP_SAFE_r33 1270 +#define _MAKE_WARM_r00 1271 +#define _MAKE_WARM_r11 1272 +#define _MAKE_WARM_r22 1273 +#define _MAKE_WARM_r33 1274 +#define _MAP_ADD_r20 1275 +#define _MATCH_CLASS_r33 1276 +#define _MATCH_KEYS_r23 1277 +#define _MATCH_MAPPING_r02 1278 +#define _MATCH_MAPPING_r12 1279 +#define _MATCH_MAPPING_r23 1280 +#define _MATCH_SEQUENCE_r02 1281 +#define _MATCH_SEQUENCE_r12 1282 +#define _MATCH_SEQUENCE_r23 1283 +#define _MAYBE_EXPAND_METHOD_r00 1284 +#define _MAYBE_EXPAND_METHOD_KW_r11 1285 +#define _MONITOR_CALL_r00 1286 +#define _MONITOR_CALL_KW_r11 1287 +#define _MONITOR_JUMP_BACKWARD_r00 1288 +#define _MONITOR_JUMP_BACKWARD_r11 1289 +#define _MONITOR_JUMP_BACKWARD_r22 1290 +#define _MONITOR_JUMP_BACKWARD_r33 1291 +#define _MONITOR_RESUME_r00 1292 +#define _NOP_r00 1293 +#define _NOP_r11 1294 +#define _NOP_r22 1295 +#define _NOP_r33 1296 +#define _POP_CALL_r20 1297 +#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1298 +#define _POP_CALL_ONE_r30 1299 +#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1300 +#define _POP_CALL_TWO_r30 1301 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1302 +#define _POP_EXCEPT_r10 1303 +#define _POP_ITER_r20 1304 +#define _POP_JUMP_IF_FALSE_r00 1305 +#define _POP_JUMP_IF_FALSE_r10 1306 +#define _POP_JUMP_IF_FALSE_r21 1307 +#define _POP_JUMP_IF_FALSE_r32 1308 +#define _POP_JUMP_IF_TRUE_r00 1309 +#define _POP_JUMP_IF_TRUE_r10 1310 +#define _POP_JUMP_IF_TRUE_r21 1311 +#define _POP_JUMP_IF_TRUE_r32 1312 +#define _POP_TOP_r10 1313 +#define _POP_TOP_FLOAT_r00 1314 +#define _POP_TOP_FLOAT_r10 1315 +#define _POP_TOP_FLOAT_r21 1316 +#define _POP_TOP_FLOAT_r32 1317 +#define _POP_TOP_INT_r00 1318 +#define _POP_TOP_INT_r10 1319 +#define _POP_TOP_INT_r21 1320 +#define _POP_TOP_INT_r32 1321 +#define _POP_TOP_LOAD_CONST_INLINE_r11 1322 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1323 +#define _POP_TOP_NOP_r00 1324 +#define _POP_TOP_NOP_r10 1325 +#define _POP_TOP_NOP_r21 1326 +#define _POP_TOP_NOP_r32 1327 +#define _POP_TOP_UNICODE_r00 1328 +#define _POP_TOP_UNICODE_r10 1329 +#define _POP_TOP_UNICODE_r21 1330 +#define _POP_TOP_UNICODE_r32 1331 +#define _POP_TWO_r20 1332 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1333 +#define _PUSH_EXC_INFO_r02 1334 +#define _PUSH_EXC_INFO_r12 1335 +#define _PUSH_EXC_INFO_r23 1336 +#define _PUSH_FRAME_r10 1337 +#define _PUSH_NULL_r01 1338 +#define _PUSH_NULL_r12 1339 +#define _PUSH_NULL_r23 1340 +#define _PUSH_NULL_CONDITIONAL_r00 1341 +#define _PY_FRAME_EX_r31 1342 +#define _PY_FRAME_GENERAL_r01 1343 +#define _PY_FRAME_KW_r11 1344 +#define _QUICKEN_RESUME_r00 1345 +#define _QUICKEN_RESUME_r11 1346 +#define _QUICKEN_RESUME_r22 1347 +#define _QUICKEN_RESUME_r33 1348 +#define _REPLACE_WITH_TRUE_r02 1349 +#define _REPLACE_WITH_TRUE_r12 1350 +#define _REPLACE_WITH_TRUE_r23 1351 +#define _RESUME_CHECK_r00 1352 +#define _RESUME_CHECK_r11 1353 +#define _RESUME_CHECK_r22 1354 +#define _RESUME_CHECK_r33 1355 +#define _RETURN_GENERATOR_r01 1356 +#define _RETURN_VALUE_r11 1357 +#define _SAVE_RETURN_OFFSET_r00 1358 +#define _SAVE_RETURN_OFFSET_r11 1359 +#define _SAVE_RETURN_OFFSET_r22 1360 +#define _SAVE_RETURN_OFFSET_r33 1361 +#define _SEND_r22 1362 +#define _SEND_GEN_FRAME_r22 1363 +#define _SETUP_ANNOTATIONS_r00 1364 +#define _SET_ADD_r10 1365 +#define _SET_FUNCTION_ATTRIBUTE_r01 1366 +#define _SET_FUNCTION_ATTRIBUTE_r11 1367 +#define _SET_FUNCTION_ATTRIBUTE_r21 1368 +#define _SET_FUNCTION_ATTRIBUTE_r32 1369 +#define _SET_IP_r00 1370 +#define _SET_IP_r11 1371 +#define _SET_IP_r22 1372 +#define _SET_IP_r33 1373 +#define _SET_UPDATE_r10 1374 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1375 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1376 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1377 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1378 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1379 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1380 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1381 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1382 +#define _SPILL_OR_RELOAD_r01 1383 +#define _SPILL_OR_RELOAD_r02 1384 +#define _SPILL_OR_RELOAD_r03 1385 +#define _SPILL_OR_RELOAD_r10 1386 +#define _SPILL_OR_RELOAD_r12 1387 +#define _SPILL_OR_RELOAD_r13 1388 +#define _SPILL_OR_RELOAD_r20 1389 +#define _SPILL_OR_RELOAD_r21 1390 +#define _SPILL_OR_RELOAD_r23 1391 +#define _SPILL_OR_RELOAD_r30 1392 +#define _SPILL_OR_RELOAD_r31 1393 +#define _SPILL_OR_RELOAD_r32 1394 +#define _START_EXECUTOR_r00 1395 +#define _STORE_ATTR_r20 1396 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1397 +#define _STORE_ATTR_SLOT_r21 1398 +#define _STORE_ATTR_WITH_HINT_r21 1399 +#define _STORE_DEREF_r10 1400 +#define _STORE_FAST_LOAD_FAST_r11 1401 +#define _STORE_FAST_STORE_FAST_r20 1402 +#define _STORE_GLOBAL_r10 1403 +#define _STORE_NAME_r10 1404 +#define _STORE_SLICE_r30 1405 +#define _STORE_SUBSCR_r30 1406 +#define _STORE_SUBSCR_DICT_r31 1407 +#define _STORE_SUBSCR_LIST_INT_r32 1408 +#define _SWAP_r11 1409 +#define _SWAP_2_r02 1410 +#define _SWAP_2_r12 1411 +#define _SWAP_2_r22 1412 +#define _SWAP_2_r33 1413 +#define _SWAP_3_r03 1414 +#define _SWAP_3_r13 1415 +#define _SWAP_3_r23 1416 +#define _SWAP_3_r33 1417 +#define _SWAP_FAST_r01 1418 +#define _SWAP_FAST_r11 1419 +#define _SWAP_FAST_r22 1420 +#define _SWAP_FAST_r33 1421 +#define _SWAP_FAST_0_r01 1422 +#define _SWAP_FAST_0_r11 1423 +#define _SWAP_FAST_0_r22 1424 +#define _SWAP_FAST_0_r33 1425 +#define _SWAP_FAST_1_r01 1426 +#define _SWAP_FAST_1_r11 1427 +#define _SWAP_FAST_1_r22 1428 +#define _SWAP_FAST_1_r33 1429 +#define _SWAP_FAST_2_r01 1430 +#define _SWAP_FAST_2_r11 1431 +#define _SWAP_FAST_2_r22 1432 +#define _SWAP_FAST_2_r33 1433 +#define _SWAP_FAST_3_r01 1434 +#define _SWAP_FAST_3_r11 1435 +#define _SWAP_FAST_3_r22 1436 +#define _SWAP_FAST_3_r33 1437 +#define _SWAP_FAST_4_r01 1438 +#define _SWAP_FAST_4_r11 1439 +#define _SWAP_FAST_4_r22 1440 +#define _SWAP_FAST_4_r33 1441 +#define _SWAP_FAST_5_r01 1442 +#define _SWAP_FAST_5_r11 1443 +#define _SWAP_FAST_5_r22 1444 +#define _SWAP_FAST_5_r33 1445 +#define _SWAP_FAST_6_r01 1446 +#define _SWAP_FAST_6_r11 1447 +#define _SWAP_FAST_6_r22 1448 +#define _SWAP_FAST_6_r33 1449 +#define _SWAP_FAST_7_r01 1450 +#define _SWAP_FAST_7_r11 1451 +#define _SWAP_FAST_7_r22 1452 +#define _SWAP_FAST_7_r33 1453 +#define _TIER2_RESUME_CHECK_r00 1454 +#define _TIER2_RESUME_CHECK_r11 1455 +#define _TIER2_RESUME_CHECK_r22 1456 +#define _TIER2_RESUME_CHECK_r33 1457 +#define _TO_BOOL_r11 1458 +#define _TO_BOOL_BOOL_r01 1459 +#define _TO_BOOL_BOOL_r11 1460 +#define _TO_BOOL_BOOL_r22 1461 +#define _TO_BOOL_BOOL_r33 1462 +#define _TO_BOOL_INT_r02 1463 +#define _TO_BOOL_INT_r12 1464 +#define _TO_BOOL_INT_r23 1465 +#define _TO_BOOL_LIST_r02 1466 +#define _TO_BOOL_LIST_r12 1467 +#define _TO_BOOL_LIST_r23 1468 +#define _TO_BOOL_NONE_r01 1469 +#define _TO_BOOL_NONE_r11 1470 +#define _TO_BOOL_NONE_r22 1471 +#define _TO_BOOL_NONE_r33 1472 +#define _TO_BOOL_STR_r02 1473 +#define _TO_BOOL_STR_r12 1474 +#define _TO_BOOL_STR_r23 1475 +#define _TRACE_RECORD_r00 1476 +#define _UNARY_INVERT_r12 1477 +#define _UNARY_NEGATIVE_r12 1478 +#define _UNARY_NOT_r01 1479 +#define _UNARY_NOT_r11 1480 +#define _UNARY_NOT_r22 1481 +#define _UNARY_NOT_r33 1482 +#define _UNPACK_EX_r10 1483 +#define _UNPACK_SEQUENCE_r10 1484 +#define _UNPACK_SEQUENCE_LIST_r10 1485 +#define _UNPACK_SEQUENCE_TUPLE_r10 1486 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1487 +#define _WITH_EXCEPT_START_r33 1488 +#define _YIELD_VALUE_r11 1489 +#define MAX_UOP_REGS_ID 1489 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index 9a0852f872d763..ce7ea4c3a77b36 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -140,7 +140,7 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = { [_STORE_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, [_STORE_SUBSCR_DICT] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_DELETE_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, - [_CALL_INTRINSIC_1] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_INTRINSIC_1] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, [_CALL_INTRINSIC_2] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_MAKE_HEAP_SAFE] = 0, [_RETURN_VALUE] = HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG, @@ -1354,7 +1354,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = { .best = { 1, 1, 1, 1 }, .entries = { { -1, -1, -1 }, - { 1, 1, _CALL_INTRINSIC_1_r11 }, + { 2, 1, _CALL_INTRINSIC_1_r12 }, { -1, -1, -1 }, { -1, -1, -1 }, }, @@ -3822,7 +3822,7 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = { [_STORE_SUBSCR_LIST_INT_r32] = _STORE_SUBSCR_LIST_INT, [_STORE_SUBSCR_DICT_r31] = _STORE_SUBSCR_DICT, [_DELETE_SUBSCR_r20] = _DELETE_SUBSCR, - [_CALL_INTRINSIC_1_r11] = _CALL_INTRINSIC_1, + [_CALL_INTRINSIC_1_r12] = _CALL_INTRINSIC_1, [_CALL_INTRINSIC_2_r21] = _CALL_INTRINSIC_2, [_MAKE_HEAP_SAFE_r01] = _MAKE_HEAP_SAFE, [_MAKE_HEAP_SAFE_r11] = _MAKE_HEAP_SAFE, @@ -4441,7 +4441,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = { [_CALL_FUNCTION_EX_NON_PY_GENERAL] = "_CALL_FUNCTION_EX_NON_PY_GENERAL", [_CALL_FUNCTION_EX_NON_PY_GENERAL_r31] = "_CALL_FUNCTION_EX_NON_PY_GENERAL_r31", [_CALL_INTRINSIC_1] = "_CALL_INTRINSIC_1", - [_CALL_INTRINSIC_1_r11] = "_CALL_INTRINSIC_1_r11", + [_CALL_INTRINSIC_1_r12] = "_CALL_INTRINSIC_1_r12", [_CALL_INTRINSIC_2] = "_CALL_INTRINSIC_2", [_CALL_INTRINSIC_2_r21] = "_CALL_INTRINSIC_2_r21", [_CALL_ISINSTANCE] = "_CALL_ISINSTANCE", diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index e5fada1f40ce43..d66031ed31cbe2 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -2546,6 +2546,21 @@ def testfunc(n): self.assertIn("_POP_TOP_NOP", uops) self.assertLessEqual(count_ops(ex, "_POP_TOP"), 4) + def test_call_intrinsic_1(self): + def testfunc(n): + x = 0 + for _ in range(n): + +x + return x + + res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD) + self.assertEqual(res, 0) + uops = get_opnames(ex) + + self.assertIn("_CALL_INTRINSIC_1", uops) + self.assertEqual(count_ops(ex, "_POP_TOP_NOP"), 1) + self.assertLessEqual(count_ops(ex, "_POP_TOP"), 2) + def test_get_len_with_const_tuple(self): def testfunc(n): x = 0.0 diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index 9e86bc42f20074..2f6845399d9e16 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -2982,23 +2982,28 @@ INSTRUCTION_STATS(CALL_INTRINSIC_1); _PyStackRef value; _PyStackRef res; - value = stack_pointer[-1]; - assert(oparg <= MAX_INTRINSIC_1); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyObject *res_o = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, PyStackRef_AsPyObjectBorrow(value)); - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(value); - stack_pointer = _PyFrame_GetStackPointer(frame); - if (res_o == NULL) { - JUMP_TO_LABEL(error); + _PyStackRef v; + // _CALL_INTRINSIC_1 + { + value = stack_pointer[-1]; + assert(oparg <= MAX_INTRINSIC_1); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyObject *res_o = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, PyStackRef_AsPyObjectBorrow(value)); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (res_o == NULL) { + JUMP_TO_LABEL(error); + } + v = value; + res = PyStackRef_FromPyObjectSteal(res_o); + } + // _POP_TOP + { + value = v; + stack_pointer[-1] = res; + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_XCLOSE(value); + stack_pointer = _PyFrame_GetStackPointer(frame); } - res = PyStackRef_FromPyObjectSteal(res_o); - stack_pointer[0] = res; - stack_pointer += 1; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); DISPATCH(); } diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 43a512611fb1ee..c26ba89b5ab9c8 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1246,14 +1246,19 @@ dummy_func( ERROR_IF(err); } - inst(CALL_INTRINSIC_1, (value -- res)) { + op(_CALL_INTRINSIC_1, (value -- res, v)) { assert(oparg <= MAX_INTRINSIC_1); PyObject *res_o = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, PyStackRef_AsPyObjectBorrow(value)); - PyStackRef_CLOSE(value); - ERROR_IF(res_o == NULL); + if (res_o == NULL) { + ERROR_NO_POP(); + } + v = value; + DEAD(value); res = PyStackRef_FromPyObjectSteal(res_o); } + macro(CALL_INTRINSIC_1) = _CALL_INTRINSIC_1 + POP_TOP; + inst(CALL_INTRINSIC_2, (value2_st, value1_st -- res)) { assert(oparg <= MAX_INTRINSIC_2); PyObject *value1 = PyStackRef_AsPyObjectBorrow(value1_st); diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 7a698e422abd77..f00913cd359c1e 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -6833,11 +6833,12 @@ break; } - case _CALL_INTRINSIC_1_r11: { + case _CALL_INTRINSIC_1_r12: { CHECK_CURRENT_CACHED_VALUES(1); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); _PyStackRef value; _PyStackRef res; + _PyStackRef v; _PyStackRef _stack_item_0 = _tos_cache0; oparg = CURRENT_OPARG(); value = _stack_item_0; @@ -6848,20 +6849,18 @@ _PyFrame_SetStackPointer(frame, stack_pointer); PyObject *res_o = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, PyStackRef_AsPyObjectBorrow(value)); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(value); - stack_pointer = _PyFrame_GetStackPointer(frame); if (res_o == NULL) { SET_CURRENT_CACHED_VALUES(0); JUMP_TO_ERROR(); } + v = value; res = PyStackRef_FromPyObjectSteal(res_o); + _tos_cache1 = v; _tos_cache0 = res; - _tos_cache1 = PyStackRef_ZERO_BITS; _tos_cache2 = PyStackRef_ZERO_BITS; - SET_CURRENT_CACHED_VALUES(1); + SET_CURRENT_CACHED_VALUES(2); + stack_pointer += -1; + ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); break; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 72619fd3afa91a..30f0101d2ed0e3 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -2982,23 +2982,28 @@ INSTRUCTION_STATS(CALL_INTRINSIC_1); _PyStackRef value; _PyStackRef res; - value = stack_pointer[-1]; - assert(oparg <= MAX_INTRINSIC_1); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyObject *res_o = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, PyStackRef_AsPyObjectBorrow(value)); - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(value); - stack_pointer = _PyFrame_GetStackPointer(frame); - if (res_o == NULL) { - JUMP_TO_LABEL(error); + _PyStackRef v; + // _CALL_INTRINSIC_1 + { + value = stack_pointer[-1]; + assert(oparg <= MAX_INTRINSIC_1); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyObject *res_o = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, PyStackRef_AsPyObjectBorrow(value)); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (res_o == NULL) { + JUMP_TO_LABEL(error); + } + v = value; + res = PyStackRef_FromPyObjectSteal(res_o); + } + // _POP_TOP + { + value = v; + stack_pointer[-1] = res; + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_XCLOSE(value); + stack_pointer = _PyFrame_GetStackPointer(frame); } - res = PyStackRef_FromPyObjectSteal(res_o); - stack_pointer[0] = res; - stack_pointer += 1; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); DISPATCH(); } diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 6092da8c04e708..e0410be55652b4 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -1177,6 +1177,11 @@ dummy_func(void) { } } + op(_CALL_INTRINSIC_1, (value -- res, v)) { + res = sym_new_not_null(ctx); + v = value; + } + op(_GUARD_IS_TRUE_POP, (flag -- )) { sym_apply_predicate_narrowing(ctx, flag, true); diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 2df50ebbcaa1c0..7e5b26c6d725d6 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1293,9 +1293,17 @@ } case _CALL_INTRINSIC_1: { + JitOptRef value; JitOptRef res; + JitOptRef v; + value = stack_pointer[-1]; res = sym_new_not_null(ctx); + v = value; + CHECK_STACK_BOUNDS(1); stack_pointer[-1] = res; + stack_pointer[0] = v; + stack_pointer += 1; + ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); break; } From e6b9a1406980fbb1d4032eca9cc0b4f8f252b716 Mon Sep 17 00:00:00 2001 From: Ramin Farajpour Cami Date: Mon, 16 Mar 2026 16:00:13 +0330 Subject: [PATCH 2/9] gh-144984: Fix crash in Expat's `ExternalEntityParserCreate` error paths (#144992) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_pyexpat.py | 37 +++++++++++++++++++ ...19-12-00-00.gh-issue-144984.b93995c982.rst | 3 ++ Modules/pyexpat.c | 16 ++++---- 3 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-02-19-12-00-00.gh-issue-144984.b93995c982.rst diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index f8afc16d3cb4cb..c67bfc67479985 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -843,6 +843,43 @@ def test_parent_parser_outlives_its_subparsers__chain(self): del subparser +class ExternalEntityParserCreateErrorTest(unittest.TestCase): + """ExternalEntityParserCreate error paths should not crash or leak + refcounts on the parent parser. + + See https://github.com/python/cpython/issues/144984. + """ + + @classmethod + def setUpClass(cls): + cls.testcapi = import_helper.import_module('_testcapi') + + def test_error_path_no_crash(self): + # When an allocation inside ExternalEntityParserCreate fails, + # the partially-initialized subparser is deallocated. This + # must not dereference NULL handlers or double-decrement the + # parent parser's refcount. + parser = expat.ParserCreate() + parser.buffer_text = True + rc_before = sys.getrefcount(parser) + + # We avoid self.assertRaises(MemoryError) here because the + # context manager itself needs memory allocations that fail + # while the nomemory hook is active. + self.testcapi.set_nomemory(1, 10) + raised = False + try: + parser.ExternalEntityParserCreate(None) + except MemoryError: + raised = True + finally: + self.testcapi.remove_mem_hooks() + self.assertTrue(raised, "MemoryError not raised") + + rc_after = sys.getrefcount(parser) + self.assertEqual(rc_after, rc_before) + + class ReparseDeferralTest(unittest.TestCase): def test_getter_setter_round_trip(self): parser = expat.ParserCreate() diff --git a/Misc/NEWS.d/next/Library/2026-02-19-12-00-00.gh-issue-144984.b93995c982.rst b/Misc/NEWS.d/next/Library/2026-02-19-12-00-00.gh-issue-144984.b93995c982.rst new file mode 100644 index 00000000000000..66e07dc3098c5f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-02-19-12-00-00.gh-issue-144984.b93995c982.rst @@ -0,0 +1,3 @@ +Fix crash in :meth:`xml.parsers.expat.xmlparser.ExternalEntityParserCreate` +when an allocation fails. The error paths could dereference NULL ``handlers`` +and double-decrement the parent parser's reference count. diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index cadc6706243524..782e552f342b17 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1083,11 +1083,6 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, return NULL; } - // The new subparser will make use of the parent XML_Parser inside of Expat. - // So we need to take subparsers into account with the reference counting - // of their parent parser. - Py_INCREF(self); - new_parser->buffer_size = self->buffer_size; new_parser->buffer_used = 0; new_parser->buffer = NULL; @@ -1097,7 +1092,10 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->ns_prefixes = self->ns_prefixes; new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context, encoding); - new_parser->parent = (PyObject *)self; + // The new subparser will make use of the parent XML_Parser inside of Expat. + // So we need to take subparsers into account with the reference counting + // of their parent parser. + new_parser->parent = Py_NewRef(self); new_parser->handlers = 0; new_parser->intern = Py_XNewRef(self->intern); @@ -1105,13 +1103,11 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->buffer = PyMem_Malloc(new_parser->buffer_size); if (new_parser->buffer == NULL) { Py_DECREF(new_parser); - Py_DECREF(self); return PyErr_NoMemory(); } } if (!new_parser->itself) { Py_DECREF(new_parser); - Py_DECREF(self); return PyErr_NoMemory(); } @@ -1125,7 +1121,6 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->handlers = PyMem_New(PyObject *, i); if (!new_parser->handlers) { Py_DECREF(new_parser); - Py_DECREF(self); return PyErr_NoMemory(); } clear_handlers(new_parser, 1); @@ -2496,6 +2491,9 @@ PyInit_pyexpat(void) static void clear_handlers(xmlparseobject *self, int initial) { + if (self->handlers == NULL) { + return; + } for (size_t i = 0; handler_info[i].name != NULL; i++) { if (initial) { self->handlers[i] = NULL; From 77632f085d0cec29c7576b8528849276109801a1 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 16 Mar 2026 14:19:00 +0100 Subject: [PATCH 3/9] gh-141510: Avoid critical section on frozendict copy (#145920) --- Objects/dictobject.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 842d9be73b8792..08e40bf84c42fa 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -968,7 +968,9 @@ clone_combined_dict_keys(PyDictObject *orig) assert(orig->ma_keys != Py_EMPTY_KEYS); assert(orig->ma_keys->dk_refcnt == 1); - ASSERT_DICT_LOCKED(orig); + if (!PyFrozenDict_Check(orig)) { + ASSERT_DICT_LOCKED(orig); + } size_t keys_size = _PyDict_KeysSize(orig->ma_keys); PyDictKeysObject *keys = PyMem_Malloc(keys_size); @@ -4322,7 +4324,10 @@ copy_lock_held(PyObject *o, int as_frozendict) PyObject *copy; PyDictObject *mp; - ASSERT_DICT_LOCKED(o); + // frozendict is immutable and so doesn't need critical section + if (!PyFrozenDict_Check(o)) { + ASSERT_DICT_LOCKED(o); + } mp = (PyDictObject *)o; if (mp->ma_used == 0) { @@ -4445,9 +4450,14 @@ anydict_copy(PyObject *o) assert(PyAnyDict_Check(o)); PyObject *res; - Py_BEGIN_CRITICAL_SECTION(o); - res = copy_lock_held(o, PyFrozenDict_Check(o)); - Py_END_CRITICAL_SECTION(); + if (PyFrozenDict_Check(o)) { + res = copy_lock_held(o, 1); + } + else { + Py_BEGIN_CRITICAL_SECTION(o); + res = copy_lock_held(o, 0); + Py_END_CRITICAL_SECTION(); + } return res; } @@ -4459,9 +4469,14 @@ _PyDict_CopyAsDict(PyObject *o) assert(PyAnyDict_Check(o)); PyObject *res; - Py_BEGIN_CRITICAL_SECTION(o); - res = copy_lock_held(o, 0); - Py_END_CRITICAL_SECTION(); + if (PyFrozenDict_Check(o)) { + res = copy_lock_held(o, 0); + } + else { + Py_BEGIN_CRITICAL_SECTION(o); + res = copy_lock_held(o, 0); + Py_END_CRITICAL_SECTION(); + } return res; } From 57e88c1cf95e1481b94ae57abe1010469d47a6b4 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Mon, 16 Mar 2026 13:43:43 +0000 Subject: [PATCH 4/9] gh-145599, CVE 2026-3644: Reject control characters in `http.cookies.Morsel.update()` (#145600) Reject control characters in `http.cookies.Morsel.update()` and `http.cookies.BaseCookie.js_output`. Co-authored-by: Victor Stinner Co-authored-by: Victor Stinner --- Lib/http/cookies.py | 24 ++++++++++-- Lib/test/test_http_cookies.py | 38 +++++++++++++++++++ ...-03-06-17-03-38.gh-issue-145599.kchwZV.rst | 4 ++ 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2026-03-06-17-03-38.gh-issue-145599.kchwZV.rst diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py index 917280037d4dbb..769541116993c4 100644 --- a/Lib/http/cookies.py +++ b/Lib/http/cookies.py @@ -337,9 +337,16 @@ def update(self, values): key = key.lower() if key not in self._reserved: raise CookieError("Invalid attribute %r" % (key,)) + if _has_control_character(key, val): + raise CookieError("Control characters are not allowed in " + f"cookies {key!r} {val!r}") data[key] = val dict.update(self, data) + def __ior__(self, values): + self.update(values) + return self + def isReservedKey(self, K): return K.lower() in self._reserved @@ -365,9 +372,15 @@ def __getstate__(self): } def __setstate__(self, state): - self._key = state['key'] - self._value = state['value'] - self._coded_value = state['coded_value'] + key = state['key'] + value = state['value'] + coded_value = state['coded_value'] + if _has_control_character(key, value, coded_value): + raise CookieError("Control characters are not allowed in cookies " + f"{key!r} {value!r} {coded_value!r}") + self._key = key + self._value = value + self._coded_value = coded_value def output(self, attrs=None, header="Set-Cookie:"): return "%s %s" % (header, self.OutputString(attrs)) @@ -379,13 +392,16 @@ def __repr__(self): def js_output(self, attrs=None): # Print javascript + output_string = self.OutputString(attrs) + if _has_control_character(output_string): + raise CookieError("Control characters are not allowed in cookies") return """ - """ % (self.OutputString(attrs).replace('"', r'\"')) + """ % (output_string.replace('"', r'\"')) def OutputString(self, attrs=None): # Build up our result diff --git a/Lib/test/test_http_cookies.py b/Lib/test/test_http_cookies.py index 7d072d5fd67ca7..e2c7551c0b3341 100644 --- a/Lib/test/test_http_cookies.py +++ b/Lib/test/test_http_cookies.py @@ -604,6 +604,14 @@ def test_control_characters(self): with self.assertRaises(cookies.CookieError): morsel["path"] = c0 + # .__setstate__() + with self.assertRaises(cookies.CookieError): + morsel.__setstate__({'key': c0, 'value': 'val', 'coded_value': 'coded'}) + with self.assertRaises(cookies.CookieError): + morsel.__setstate__({'key': 'key', 'value': c0, 'coded_value': 'coded'}) + with self.assertRaises(cookies.CookieError): + morsel.__setstate__({'key': 'key', 'value': 'val', 'coded_value': c0}) + # .setdefault() with self.assertRaises(cookies.CookieError): morsel.setdefault("path", c0) @@ -618,6 +626,18 @@ def test_control_characters(self): with self.assertRaises(cookies.CookieError): morsel.set("path", "val", c0) + # .update() + with self.assertRaises(cookies.CookieError): + morsel.update({"path": c0}) + with self.assertRaises(cookies.CookieError): + morsel.update({c0: "val"}) + + # .__ior__() + with self.assertRaises(cookies.CookieError): + morsel |= {"path": c0} + with self.assertRaises(cookies.CookieError): + morsel |= {c0: "val"} + def test_control_characters_output(self): # Tests that even if the internals of Morsel are modified # that a call to .output() has control character safeguards. @@ -638,6 +658,24 @@ def test_control_characters_output(self): with self.assertRaises(cookies.CookieError): cookie.output() + # Tests that .js_output() also has control character safeguards. + for c0 in support.control_characters_c0(): + morsel = cookies.Morsel() + morsel.set("key", "value", "coded-value") + morsel._key = c0 # Override private variable. + cookie = cookies.SimpleCookie() + cookie["cookie"] = morsel + with self.assertRaises(cookies.CookieError): + cookie.js_output() + + morsel = cookies.Morsel() + morsel.set("key", "value", "coded-value") + morsel._coded_value = c0 # Override private variable. + cookie = cookies.SimpleCookie() + cookie["cookie"] = morsel + with self.assertRaises(cookies.CookieError): + cookie.js_output() + def load_tests(loader, tests, pattern): tests.addTest(doctest.DocTestSuite(cookies)) diff --git a/Misc/NEWS.d/next/Security/2026-03-06-17-03-38.gh-issue-145599.kchwZV.rst b/Misc/NEWS.d/next/Security/2026-03-06-17-03-38.gh-issue-145599.kchwZV.rst new file mode 100644 index 00000000000000..e53a932d12fcdc --- /dev/null +++ b/Misc/NEWS.d/next/Security/2026-03-06-17-03-38.gh-issue-145599.kchwZV.rst @@ -0,0 +1,4 @@ +Reject control characters in :class:`http.cookies.Morsel` +:meth:`~http.cookies.Morsel.update` and +:meth:`~http.cookies.BaseCookie.js_output`. +This addresses :cve:`2026-3644`. From fd50b41aa906cd3994dc2e6b884bed8f5dd605cf Mon Sep 17 00:00:00 2001 From: Sergey Miryanov Date: Mon, 16 Mar 2026 18:50:26 +0500 Subject: [PATCH 5/9] GH-145247: Use _PyTuple_FromPair in exceptions.c (GH-145910) --- Objects/exceptions.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c index f5edc286243ee1..4e090e5dd863f1 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -13,6 +13,7 @@ #include "pycore_modsupport.h" // _PyArg_NoKeywords() #include "pycore_object.h" #include "pycore_pyerrors.h" // struct _PyErr_SetRaisedException +#include "pycore_tuple.h" // _PyTuple_FromPair #include "osdefs.h" // SEP #include "clinic/exceptions.c.h" @@ -214,7 +215,7 @@ BaseException___reduce___impl(PyBaseExceptionObject *self) if (self->args && self->dict) return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict); else - return PyTuple_Pack(2, Py_TYPE(self), self->args); + return _PyTuple_FromPair((PyObject *)Py_TYPE(self), self->args); } /* @@ -1008,8 +1009,7 @@ _PyExc_CreateExceptionGroup(const char *msg_str, PyObject *excs) if (!msg) { return NULL; } - PyObject *args = PyTuple_Pack(2, msg, excs); - Py_DECREF(msg); + PyObject *args = _PyTuple_FromPairSteal(msg, Py_NewRef(excs)); if (!args) { return NULL; } @@ -1132,7 +1132,7 @@ BaseExceptionGroup_derive_impl(PyBaseExceptionGroupObject *self, PyObject *excs) /*[clinic end generated code: output=4307564218dfbf06 input=f72009d38e98cec1]*/ { - PyObject *init_args = PyTuple_Pack(2, self->msg, excs); + PyObject *init_args = _PyTuple_FromPair(self->msg, excs); if (!init_args) { return NULL; } @@ -1449,13 +1449,11 @@ BaseExceptionGroup_split_impl(PyBaseExceptionGroupObject *self, return NULL; } - PyObject *result = PyTuple_Pack( - 2, + assert(_Py_IsStaticImmortal(Py_None)); + PyObject *result = _PyTuple_FromPairSteal( split_result.match ? split_result.match : Py_None, split_result.rest ? split_result.rest : Py_None); - Py_XDECREF(split_result.match); - Py_XDECREF(split_result.rest); return result; } @@ -1764,8 +1762,8 @@ static PyObject* create_exception_group_class(void) { struct _Py_exc_state *state = get_exc_state(); - PyObject *bases = PyTuple_Pack( - 2, PyExc_BaseExceptionGroup, PyExc_Exception); + PyObject *bases = _PyTuple_FromPair( + PyExc_BaseExceptionGroup, PyExc_Exception); if (bases == NULL) { return NULL; } @@ -1913,7 +1911,7 @@ ImportError_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) return NULL; PyBaseExceptionObject *exc = PyBaseExceptionObject_CAST(self); if (state == Py_None) - res = PyTuple_Pack(2, Py_TYPE(self), exc->args); + res = _PyTuple_FromPair((PyObject *)Py_TYPE(self), exc->args); else res = PyTuple_Pack(3, Py_TYPE(self), exc->args, state); Py_DECREF(state); @@ -2421,7 +2419,7 @@ OSError_reduce(PyObject *op, PyObject *Py_UNUSED(ignored)) if (self->dict) res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict); else - res = PyTuple_Pack(2, Py_TYPE(self), args); + res = _PyTuple_FromPair((PyObject *)Py_TYPE(self), args); Py_DECREF(args); return res; } From 182aea2f57002dcea39dfdfe3faf642d724dd80b Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Mon, 16 Mar 2026 21:52:56 +0800 Subject: [PATCH 6/9] gh-146018: Disable over-aggressive optimization for _GUARD_CODE_VERSION (GH-145923) --- Python/optimizer_bytecodes.c | 4 +++- Python/optimizer_cases.c.h | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index e0410be55652b4..f3a391b2e37ef9 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -1761,7 +1761,9 @@ dummy_func(void) { PyCodeObject *co = get_current_code_object(ctx); if (co->co_version == version) { _Py_BloomFilter_Add(dependencies, co); - REPLACE_OP(this_instr, _NOP, 0, 0); + // TODO gh-144651: + // If we've previously guarded on this code version in a trace, we + // can avoid guarding it again. } else { ctx->done = true; diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 7e5b26c6d725d6..942a730e4faccf 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -4290,7 +4290,6 @@ PyCodeObject *co = get_current_code_object(ctx); if (co->co_version == version) { _Py_BloomFilter_Add(dependencies, co); - REPLACE_OP(this_instr, _NOP, 0, 0); } else { ctx->done = true; From e18abc6a1f1b60434b529d4c1ff4855acde0fd13 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Mon, 16 Mar 2026 11:08:07 -0400 Subject: [PATCH 7/9] gh-135329: Remove flaky test_repl_eio test (gh-145932) The test doesn't actually test any pyrepl code (it runs Python with -S) and has a race condition that causes intermittent timeouts on CI. --- Lib/test/test_pyrepl/eio_test_script.py | 94 ----------------------- Lib/test/test_pyrepl/test_unix_console.py | 35 +-------- 2 files changed, 1 insertion(+), 128 deletions(-) delete mode 100644 Lib/test/test_pyrepl/eio_test_script.py diff --git a/Lib/test/test_pyrepl/eio_test_script.py b/Lib/test/test_pyrepl/eio_test_script.py deleted file mode 100644 index e3ea6caef58e80..00000000000000 --- a/Lib/test/test_pyrepl/eio_test_script.py +++ /dev/null @@ -1,94 +0,0 @@ -import errno -import fcntl -import os -import pty -import signal -import sys -import termios - - -def handler(sig, f): - pass - - -def create_eio_condition(): - # SIGINT handler used to produce an EIO. - # See https://github.com/python/cpython/issues/135329. - try: - master_fd, slave_fd = pty.openpty() - child_pid = os.fork() - if child_pid == 0: - try: - os.setsid() - fcntl.ioctl(slave_fd, termios.TIOCSCTTY, 0) - child_process_group_id = os.getpgrp() - grandchild_pid = os.fork() - if grandchild_pid == 0: - os.setpgid(0, 0) # set process group for grandchild - os.dup2(slave_fd, 0) # redirect stdin - if slave_fd > 2: - os.close(slave_fd) - # Fork grandchild for terminal control manipulation - if os.fork() == 0: - sys.exit(0) # exit the child process that was just obtained - else: - try: - os.tcsetpgrp(0, child_process_group_id) - except OSError: - pass - sys.exit(0) - else: - # Back to child - try: - os.setpgid(grandchild_pid, grandchild_pid) - except ProcessLookupError: - pass - os.tcsetpgrp(slave_fd, grandchild_pid) - if slave_fd > 2: - os.close(slave_fd) - os.waitpid(grandchild_pid, 0) - # Manipulate terminal control to create EIO condition - os.tcsetpgrp(master_fd, child_process_group_id) - # Now try to read from master - this might cause EIO - try: - os.read(master_fd, 1) - except OSError as e: - if e.errno == errno.EIO: - print(f"Setup created EIO condition: {e}", file=sys.stderr) - sys.exit(0) - except Exception as setup_e: - print(f"Setup error: {setup_e}", file=sys.stderr) - sys.exit(1) - else: - # Parent process - os.close(slave_fd) - os.waitpid(child_pid, 0) - # Now replace stdin with master_fd and try to read - os.dup2(master_fd, 0) - os.close(master_fd) - # This should now trigger EIO - print(f"Unexpectedly got input: {input()!r}", file=sys.stderr) - sys.exit(0) - except OSError as e: - if e.errno == errno.EIO: - print(f"Got EIO: {e}", file=sys.stderr) - sys.exit(1) - elif e.errno == errno.ENXIO: - print(f"Got ENXIO (no such device): {e}", file=sys.stderr) - sys.exit(1) # Treat ENXIO as success too - else: - print(f"Got other OSError: errno={e.errno} {e}", file=sys.stderr) - sys.exit(2) - except EOFError as e: - print(f"Got EOFError: {e}", file=sys.stderr) - sys.exit(3) - except Exception as e: - print(f"Got unexpected error: {type(e).__name__}: {e}", file=sys.stderr) - sys.exit(4) - - -if __name__ == "__main__": - # Set up signal handler for coordination - signal.signal(signal.SIGUSR1, lambda *a: create_eio_condition()) - print("READY", flush=True) - signal.pause() diff --git a/Lib/test/test_pyrepl/test_unix_console.py b/Lib/test/test_pyrepl/test_unix_console.py index 680adbc2d968f0..a1ee6d4878fe93 100644 --- a/Lib/test/test_pyrepl/test_unix_console.py +++ b/Lib/test/test_pyrepl/test_unix_console.py @@ -2,14 +2,12 @@ import itertools import os import signal -import subprocess import sys import threading import unittest from functools import partial -from test import support from test.support import os_helper, force_not_colorized_test_class -from test.support import script_helper, threading_helper +from test.support import threading_helper from unittest import TestCase from unittest.mock import MagicMock, call, patch, ANY, Mock @@ -369,34 +367,3 @@ def test_eio_error_handling_in_restore(self, mock_tcgetattr, mock_tcsetattr): # EIO error should be handled gracefully in restore() console.restore() - - @unittest.skipUnless(sys.platform == "linux", "Only valid on Linux") - def test_repl_eio(self): - # Use the pty-based approach to simulate EIO error - script_path = os.path.join(os.path.dirname(__file__), "eio_test_script.py") - - proc = script_helper.spawn_python( - "-S", script_path, - stderr=subprocess.PIPE, - text=True - ) - - ready_line = proc.stdout.readline().strip() - if ready_line != "READY" or proc.poll() is not None: - self.fail("Child process failed to start properly") - - os.kill(proc.pid, signal.SIGUSR1) - # sleep for pty to settle - _, err = proc.communicate(timeout=support.LONG_TIMEOUT) - self.assertEqual( - proc.returncode, - 1, - f"Expected EIO/ENXIO error, got return code {proc.returncode}", - ) - self.assertTrue( - ( - "Got EIO:" in err - or "Got ENXIO:" in err - ), - f"Expected EIO/ENXIO error message in stderr: {err}", - ) From 81ef1b73175378543534ebe1f148c22deb8239b3 Mon Sep 17 00:00:00 2001 From: Hai Zhu Date: Mon, 16 Mar 2026 23:58:18 +0800 Subject: [PATCH 8/9] gh-144888: Replace bloom filter linked lists with continuous arrays to optimize executor invalidating performance (GH-145873) --- Include/internal/pycore_interp_structs.h | 6 +- Include/internal/pycore_optimizer.h | 6 +- InternalDocs/jit.md | 4 +- Modules/_testinternalcapi.c | 6 +- Objects/funcobject.c | 1 - Python/jit.c | 19 +++- Python/optimizer.c | 121 ++++++++++++----------- Python/pylifecycle.c | 6 ++ Python/pystate.c | 5 +- 9 files changed, 103 insertions(+), 71 deletions(-) diff --git a/Include/internal/pycore_interp_structs.h b/Include/internal/pycore_interp_structs.h index 776fb9575c2365..e2008f8303e21b 100644 --- a/Include/internal/pycore_interp_structs.h +++ b/Include/internal/pycore_interp_structs.h @@ -14,6 +14,7 @@ extern "C" { #include "pycore_structs.h" // PyHamtObject #include "pycore_tstate.h" // _PyThreadStateImpl #include "pycore_typedefs.h" // _PyRuntimeState +#include "pycore_uop.h" // _PyBloomFilter #define CODE_MAX_WATCHERS 8 #define CONTEXT_MAX_WATCHERS 8 @@ -972,7 +973,10 @@ struct _is { // Optimization configuration (thresholds and flags for JIT and interpreter) _PyOptimizationConfig opt_config; - struct _PyExecutorObject *executor_list_head; + _PyBloomFilter *executor_blooms; // Contiguous bloom filter array + struct _PyExecutorObject **executor_ptrs; // Corresponding executor pointer array + size_t executor_count; // Number of valid executors + size_t executor_capacity; // Array capacity struct _PyExecutorObject *executor_deletion_list_head; struct _PyExecutorObject *cold_executor; struct _PyExecutorObject *cold_dynamic_executor; diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index c63f0167a0f64a..cea9fcce237301 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -128,8 +128,8 @@ typedef struct { bool cold; uint8_t pending_deletion; int32_t index; // Index of ENTER_EXECUTOR (if code isn't NULL, below). - _PyBloomFilter bloom; - _PyExecutorLinkListNode links; + int32_t bloom_array_idx; // Index in interp->executor_blooms/executor_ptrs. + _PyExecutorLinkListNode links; // Used by deletion list. PyCodeObject *code; // Weak (NULL if no corresponding ENTER_EXECUTOR). } _PyVMData; @@ -157,7 +157,7 @@ typedef struct _PyExecutorObject { // Export for '_opcode' shared extension (JIT compiler). PyAPI_FUNC(_PyExecutorObject*) _Py_GetExecutor(PyCodeObject *code, int offset); -void _Py_ExecutorInit(_PyExecutorObject *, const _PyBloomFilter *); +int _Py_ExecutorInit(_PyExecutorObject *, const _PyBloomFilter *); void _Py_ExecutorDetach(_PyExecutorObject *); void _Py_BloomFilter_Init(_PyBloomFilter *); void _Py_BloomFilter_Add(_PyBloomFilter *bloom, void *obj); diff --git a/InternalDocs/jit.md b/InternalDocs/jit.md index 1740b22b85f77b..decfccad2d8d37 100644 --- a/InternalDocs/jit.md +++ b/InternalDocs/jit.md @@ -78,8 +78,8 @@ and execution returns to the adaptive interpreter. ## Invalidating Executors In addition to being stored on the code object, each executor is also -inserted into a list of all executors, which is stored in the interpreter -state's `executor_list_head` field. This list is used when it is necessary +inserted into contiguous arrays (`executor_blooms` and `executor_ptrs`) +stored in the interpreter state. These arrays are used when it is necessary to invalidate executors because values they used in their construction may have changed. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index aa5911ef2fb449..8c316b7c8ddda0 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -278,10 +278,8 @@ get_jit_code_ranges(PyObject *self, PyObject *Py_UNUSED(args)) if (interp == NULL) { return ranges; } - for (_PyExecutorObject *exec = interp->executor_list_head; - exec != NULL; - exec = exec->vm_data.links.next) - { + for (size_t i = 0; i < interp->executor_count; i++) { + _PyExecutorObject *exec = interp->executor_ptrs[i]; if (exec->jit_code == NULL || exec->jit_size == 0) { continue; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index fc32826fb3a861..a7a3d9c78ef3d0 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -12,7 +12,6 @@ #include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_stats.h" #include "pycore_weakref.h" // FT_CLEAR_WEAKREFS() -#include "pycore_optimizer.h" // _Py_Executors_InvalidateDependency static const char * func_event_name(PyFunction_WatchEvent event) { diff --git a/Python/jit.c b/Python/jit.c index 3e0a0aa8bfcc81..4990c743224d3c 100644 --- a/Python/jit.c +++ b/Python/jit.c @@ -62,6 +62,23 @@ jit_error(const char *message) static size_t _Py_jit_shim_size = 0; +static int +address_in_executor_array(_PyExecutorObject **ptrs, size_t count, uintptr_t addr) +{ + for (size_t i = 0; i < count; i++) { + _PyExecutorObject *exec = ptrs[i]; + if (exec->jit_code == NULL || exec->jit_size == 0) { + continue; + } + uintptr_t start = (uintptr_t)exec->jit_code; + uintptr_t end = start + exec->jit_size; + if (addr >= start && addr < end) { + return 1; + } + } + return 0; +} + static int address_in_executor_list(_PyExecutorObject *head, uintptr_t addr) { @@ -94,7 +111,7 @@ _PyJIT_AddressInJitCode(PyInterpreterState *interp, uintptr_t addr) return 1; } } - if (address_in_executor_list(interp->executor_list_head, addr)) { + if (address_in_executor_array(interp->executor_ptrs, interp->executor_count, addr)) { return 1; } if (address_in_executor_list(interp->executor_deletion_list_head, addr)) { diff --git a/Python/optimizer.c b/Python/optimizer.c index 7315bb6b9f603d..a9e788d0dcb1d5 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1379,7 +1379,10 @@ make_executor_from_uops(_PyThreadStateImpl *tstate, _PyUOpInstruction *buffer, i // linking of executor. Otherwise, the GC tries to untrack a // still untracked object during dealloc. _PyObject_GC_TRACK(executor); - _Py_ExecutorInit(executor, dependencies); + if (_Py_ExecutorInit(executor, dependencies) < 0) { + Py_DECREF(executor); + return NULL; + } #ifdef Py_DEBUG char *python_lltrace = Py_GETENV("PYTHON_LLTRACE"); int lltrace = 0; @@ -1646,59 +1649,63 @@ bloom_filter_may_contain(_PyBloomFilter *bloom, _PyBloomFilter *hashes) return true; } -static void -link_executor(_PyExecutorObject *executor) +static int +link_executor(_PyExecutorObject *executor, const _PyBloomFilter *bloom) { PyInterpreterState *interp = _PyInterpreterState_GET(); - _PyExecutorLinkListNode *links = &executor->vm_data.links; - _PyExecutorObject *head = interp->executor_list_head; - if (head == NULL) { - interp->executor_list_head = executor; - links->previous = NULL; - links->next = NULL; - } - else { - assert(head->vm_data.links.previous == NULL); - links->previous = NULL; - links->next = head; - head->vm_data.links.previous = executor; - interp->executor_list_head = executor; - } - /* executor_list_head must be first in list */ - assert(interp->executor_list_head->vm_data.links.previous == NULL); + if (interp->executor_count == interp->executor_capacity) { + size_t new_cap = interp->executor_capacity ? interp->executor_capacity * 2 : 64; + _PyBloomFilter *new_blooms = PyMem_Realloc( + interp->executor_blooms, new_cap * sizeof(_PyBloomFilter)); + if (new_blooms == NULL) { + return -1; + } + _PyExecutorObject **new_ptrs = PyMem_Realloc( + interp->executor_ptrs, new_cap * sizeof(_PyExecutorObject *)); + if (new_ptrs == NULL) { + /* Revert blooms realloc — the old pointer may have been freed by + * a successful realloc, but new_blooms is the valid pointer. */ + interp->executor_blooms = new_blooms; + return -1; + } + interp->executor_blooms = new_blooms; + interp->executor_ptrs = new_ptrs; + interp->executor_capacity = new_cap; + } + size_t idx = interp->executor_count++; + interp->executor_blooms[idx] = *bloom; + interp->executor_ptrs[idx] = executor; + executor->vm_data.bloom_array_idx = (int32_t)idx; + return 0; } static void unlink_executor(_PyExecutorObject *executor) { - _PyExecutorLinkListNode *links = &executor->vm_data.links; - _PyExecutorObject *next = links->next; - _PyExecutorObject *prev = links->previous; - if (next != NULL) { - next->vm_data.links.previous = prev; - } - if (prev != NULL) { - prev->vm_data.links.next = next; - } - else { - // prev == NULL implies that executor is the list head - PyInterpreterState *interp = PyInterpreterState_Get(); - assert(interp->executor_list_head == executor); - interp->executor_list_head = next; + PyInterpreterState *interp = PyInterpreterState_Get(); + int32_t idx = executor->vm_data.bloom_array_idx; + assert(idx >= 0 && (size_t)idx < interp->executor_count); + size_t last = --interp->executor_count; + if ((size_t)idx != last) { + /* Swap-remove: move the last element into the vacated slot */ + interp->executor_blooms[idx] = interp->executor_blooms[last]; + interp->executor_ptrs[idx] = interp->executor_ptrs[last]; + interp->executor_ptrs[idx]->vm_data.bloom_array_idx = idx; } + executor->vm_data.bloom_array_idx = -1; } /* This must be called by optimizers before using the executor */ -void +int _Py_ExecutorInit(_PyExecutorObject *executor, const _PyBloomFilter *dependency_set) { executor->vm_data.valid = true; executor->vm_data.pending_deletion = 0; executor->vm_data.code = NULL; - for (int i = 0; i < _Py_BLOOM_FILTER_WORDS; i++) { - executor->vm_data.bloom.bits[i] = dependency_set->bits[i]; + if (link_executor(executor, dependency_set) < 0) { + return -1; } - link_executor(executor); + return 0; } static _PyExecutorObject * @@ -1809,11 +1816,15 @@ void _Py_Executor_DependsOn(_PyExecutorObject *executor, void *obj) { assert(executor->vm_data.valid); - _Py_BloomFilter_Add(&executor->vm_data.bloom, obj); + PyInterpreterState *interp = _PyInterpreterState_GET(); + int32_t idx = executor->vm_data.bloom_array_idx; + assert(idx >= 0 && (size_t)idx < interp->executor_count); + _Py_BloomFilter_Add(&interp->executor_blooms[idx], obj); } /* Invalidate all executors that depend on `obj` - * May cause other executors to be invalidated as well + * May cause other executors to be invalidated as well. + * Uses contiguous bloom filter array for cache-friendly scanning. */ void _Py_Executors_InvalidateDependency(PyInterpreterState *interp, void *obj, int is_invalidation) @@ -1821,23 +1832,20 @@ _Py_Executors_InvalidateDependency(PyInterpreterState *interp, void *obj, int is _PyBloomFilter obj_filter; _Py_BloomFilter_Init(&obj_filter); _Py_BloomFilter_Add(&obj_filter, obj); - /* Walk the list of executors */ - /* TO DO -- Use a tree to avoid traversing as many objects */ + /* Scan contiguous bloom filter array */ PyObject *invalidate = PyList_New(0); if (invalidate == NULL) { goto error; } /* Clearing an executor can clear others, so we need to make a list of * executors to invalidate first */ - for (_PyExecutorObject *exec = interp->executor_list_head; exec != NULL;) { - assert(exec->vm_data.valid); - _PyExecutorObject *next = exec->vm_data.links.next; - if (bloom_filter_may_contain(&exec->vm_data.bloom, &obj_filter) && - PyList_Append(invalidate, (PyObject *)exec)) + for (size_t i = 0; i < interp->executor_count; i++) { + assert(interp->executor_ptrs[i]->vm_data.valid); + if (bloom_filter_may_contain(&interp->executor_blooms[i], &obj_filter) && + PyList_Append(invalidate, (PyObject *)interp->executor_ptrs[i])) { goto error; } - exec = next; } for (Py_ssize_t i = 0; i < PyList_GET_SIZE(invalidate); i++) { PyObject *exec = PyList_GET_ITEM(invalidate, i); @@ -1859,8 +1867,9 @@ _Py_Executors_InvalidateDependency(PyInterpreterState *interp, void *obj, int is void _Py_Executors_InvalidateAll(PyInterpreterState *interp, int is_invalidation) { - while (interp->executor_list_head) { - _PyExecutorObject *executor = interp->executor_list_head; + while (interp->executor_count > 0) { + /* Invalidate from the end to avoid repeated swap-remove shifts */ + _PyExecutorObject *executor = interp->executor_ptrs[interp->executor_count - 1]; assert(executor->vm_data.valid); if (executor->vm_data.code) { // Clear the entire code object so its co_executors array be freed: @@ -1878,8 +1887,7 @@ _Py_Executors_InvalidateAll(PyInterpreterState *interp, int is_invalidation) void _Py_Executors_InvalidateCold(PyInterpreterState *interp) { - /* Walk the list of executors */ - /* TO DO -- Use a tree to avoid traversing as many objects */ + /* Scan contiguous executor array */ PyObject *invalidate = PyList_New(0); if (invalidate == NULL) { goto error; @@ -1887,9 +1895,9 @@ _Py_Executors_InvalidateCold(PyInterpreterState *interp) /* Clearing an executor can deallocate others, so we need to make a list of * executors to invalidate first */ - for (_PyExecutorObject *exec = interp->executor_list_head; exec != NULL;) { + for (size_t i = 0; i < interp->executor_count; i++) { + _PyExecutorObject *exec = interp->executor_ptrs[i]; assert(exec->vm_data.valid); - _PyExecutorObject *next = exec->vm_data.links.next; if (exec->vm_data.cold && PyList_Append(invalidate, (PyObject *)exec) < 0) { goto error; @@ -1897,8 +1905,6 @@ _Py_Executors_InvalidateCold(PyInterpreterState *interp) else { exec->vm_data.cold = true; } - - exec = next; } for (Py_ssize_t i = 0; i < PyList_GET_SIZE(invalidate); i++) { PyObject *exec = PyList_GET_ITEM(invalidate, i); @@ -2142,9 +2148,8 @@ _PyDumpExecutors(FILE *out) fprintf(out, " rankdir = \"LR\"\n\n"); fprintf(out, " node [colorscheme=greys9]\n"); PyInterpreterState *interp = PyInterpreterState_Get(); - for (_PyExecutorObject *exec = interp->executor_list_head; exec != NULL;) { - executor_to_gv(exec, out); - exec = exec->vm_data.links.next; + for (size_t i = 0; i < interp->executor_count; i++) { + executor_to_gv(interp->executor_ptrs[i], out); } fprintf(out, "}\n\n"); return 0; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2b8e9a02cb6184..68052a91d6a1f1 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1761,6 +1761,12 @@ finalize_modules(PyThreadState *tstate) interp->compiling = false; #ifdef _Py_TIER2 _Py_Executors_InvalidateAll(interp, 0); + PyMem_Free(interp->executor_blooms); + PyMem_Free(interp->executor_ptrs); + interp->executor_blooms = NULL; + interp->executor_ptrs = NULL; + interp->executor_count = 0; + interp->executor_capacity = 0; #endif // Stop watching __builtin__ modifications diff --git a/Python/pystate.c b/Python/pystate.c index 17b8430b19c188..fcb73b4dcefe1d 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -597,7 +597,10 @@ init_interpreter(PyInterpreterState *interp, interp->_code_object_generation = 0; interp->jit = false; interp->compiling = false; - interp->executor_list_head = NULL; + interp->executor_blooms = NULL; + interp->executor_ptrs = NULL; + interp->executor_count = 0; + interp->executor_capacity = 0; interp->executor_deletion_list_head = NULL; interp->executor_creation_counter = JIT_CLEANUP_THRESHOLD; From 3d0824aef261895bad55f7e1fa7267a926206924 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 17 Mar 2026 00:18:59 +0800 Subject: [PATCH 9/9] gh-127958: Trace from RESUME in the JIT (GH-145905) --- Include/internal/pycore_backoff.h | 14 + Include/internal/pycore_code.h | 1 + Include/internal/pycore_interp_structs.h | 3 + Include/internal/pycore_magic_number.h | 3 +- Include/internal/pycore_opcode_metadata.h | 18 +- Include/internal/pycore_optimizer.h | 2 + Include/internal/pycore_uop.h | 2 +- Include/internal/pycore_uop_ids.h | 309 ++++++------- Include/opcode_ids.h | 31 +- Lib/_opcode_metadata.py | 32 +- Lib/opcode.py | 3 + Lib/test/test_capi/test_opt.py | 24 +- Lib/test/test_code.py | 5 +- Lib/test/test_compile.py | 4 +- Lib/test/test_dis.py | 433 +++++++++--------- Lib/test/test_monitoring.py | 151 +++--- ...-03-13-09-48-57.gh-issue-127958.U-znTv.rst | 1 + Modules/_testinternalcapi.c | 8 + Modules/_testinternalcapi/test_cases.c.h | 115 ++++- Modules/_testinternalcapi/test_targets.h | 9 +- Objects/codeobject.c | 7 +- Objects/genobject.c | 1 + Programs/test_frozenmain.h | 70 +-- Python/assemble.c | 2 +- Python/bytecodes.c | 46 +- Python/ceval.c | 5 +- Python/executor_cases.c.h | 2 - Python/generated_cases.c.h | 115 ++++- Python/instrumentation.c | 1 + Python/opcode_targets.h | 9 +- Python/optimizer.c | 34 +- Python/optimizer_cases.c.h | 2 - Python/pystate.c | 8 + Python/specialize.c | 30 +- 34 files changed, 909 insertions(+), 591 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst diff --git a/Include/internal/pycore_backoff.h b/Include/internal/pycore_backoff.h index ee907ae0534e4f..38dd82f6fc8a14 100644 --- a/Include/internal/pycore_backoff.h +++ b/Include/internal/pycore_backoff.h @@ -135,6 +135,20 @@ initial_jump_backoff_counter(_PyOptimizationConfig *opt_config) opt_config->jump_backward_initial_backoff); } +// This needs to be around 2-4x of JUMP_BACKWARD_INITIAL_VALUE +// The reasoning is that we always want loop traces to form and inline +// functions before functions themselves warm up and link to them instead +// of inlining. +#define RESUME_INITIAL_VALUE 8190 +#define RESUME_INITIAL_BACKOFF 6 +static inline _Py_BackoffCounter +initial_resume_backoff_counter(_PyOptimizationConfig *opt_config) +{ + return make_backoff_counter( + opt_config->resume_initial_value, + opt_config->resume_initial_backoff); +} + /* Initial exit temperature. * Must be larger than ADAPTIVE_COOLDOWN_VALUE, * otherwise when a side exit warms up we may construct diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index efae3b38654c41..376e68a4c8773c 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -323,6 +323,7 @@ PyAPI_FUNC(void) _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr); PyAPI_FUNC(void) _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr); PyAPI_FUNC(void) _Py_GatherStats_GetIter(_PyStackRef iterable); PyAPI_FUNC(void) _Py_Specialize_CallFunctionEx(_PyStackRef func_st, _Py_CODEUNIT *instr); +PyAPI_FUNC(void) _Py_Specialize_Resume(_Py_CODEUNIT *instr, PyThreadState *tstate, _PyInterpreterFrame *frame); // Utility functions for reading/writing 32/64-bit values in the inline caches. // Great care should be taken to ensure that these functions remain correct and diff --git a/Include/internal/pycore_interp_structs.h b/Include/internal/pycore_interp_structs.h index e2008f8303e21b..4822360a8f08d0 100644 --- a/Include/internal/pycore_interp_structs.h +++ b/Include/internal/pycore_interp_structs.h @@ -414,6 +414,9 @@ typedef struct _PyOptimizationConfig { uint16_t jump_backward_initial_value; uint16_t jump_backward_initial_backoff; + uint16_t resume_initial_value; + uint16_t resume_initial_backoff; + // JIT optimization thresholds uint16_t side_exit_initial_value; uint16_t side_exit_initial_backoff; diff --git a/Include/internal/pycore_magic_number.h b/Include/internal/pycore_magic_number.h index 3fcf650426d36d..ec9cfe432371c7 100644 --- a/Include/internal/pycore_magic_number.h +++ b/Include/internal/pycore_magic_number.h @@ -292,6 +292,7 @@ Known values: Python 3.15a4 3659 (Add CALL_FUNCTION_EX specialization) Python 3.15a4 3660 (Change generator preamble code) Python 3.15a4 3661 (Lazy imports IMPORT_NAME opcode changes) + Python 3.15a6 3662 (Add counter to RESUME) Python 3.16 will start with 3700 @@ -305,7 +306,7 @@ PC/launcher.c must also be updated. */ -#define PYC_MAGIC_NUMBER 3661 +#define PYC_MAGIC_NUMBER 3662 /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes (little-endian) and then appending b'\r\n'. */ #define PYC_MAGIC_NUMBER_TOKEN \ diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index fc5689c5afe13a..c46015c4d98239 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -426,6 +426,8 @@ int _PyOpcode_num_popped(int opcode, int oparg) { return 0; case RESUME_CHECK: return 0; + case RESUME_CHECK_JIT: + return 0; case RETURN_GENERATOR: return 0; case RETURN_VALUE: @@ -917,6 +919,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg) { return 0; case RESUME_CHECK: return 0; + case RESUME_CHECK_JIT: + return 0; case RETURN_GENERATOR: return 1; case RETURN_VALUE: @@ -1209,7 +1213,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [INSTRUMENTED_POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, - [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [INSTRUMENTED_YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [INTERPRETER_EXIT] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG }, @@ -1278,8 +1282,9 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [RAISE_VARARGS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG }, [RERAISE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [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 }, + [RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [RESUME_CHECK] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, + [RESUME_CHECK_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | 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 }, [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 }, @@ -1493,7 +1498,7 @@ _PyOpcode_macro_expansion[256] = { [POP_TOP] = { .nuops = 1, .uops = { { _POP_TOP, OPARG_SIMPLE, 0 } } }, [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 } } }, + [RESUME_CHECK] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 1 } } }, [RETURN_GENERATOR] = { .nuops = 1, .uops = { { _RETURN_GENERATOR, OPARG_SIMPLE, 0 } } }, [RETURN_VALUE] = { .nuops = 2, .uops = { { _MAKE_HEAP_SAFE, OPARG_SIMPLE, 0 }, { _RETURN_VALUE, OPARG_SIMPLE, 0 } } }, [SEND_GEN] = { .nuops = 4, .uops = { { _RECORD_NOS_GEN_FUNC, OPARG_SIMPLE, 1 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _SEND_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } }, @@ -1734,6 +1739,7 @@ const char *_PyOpcode_OpName[267] = { [RESERVED] = "RESERVED", [RESUME] = "RESUME", [RESUME_CHECK] = "RESUME_CHECK", + [RESUME_CHECK_JIT] = "RESUME_CHECK_JIT", [RETURN_GENERATOR] = "RETURN_GENERATOR", [RETURN_VALUE] = "RETURN_VALUE", [SEND] = "SEND", @@ -1785,6 +1791,7 @@ const char *_PyOpcode_OpName[267] = { PyAPI_DATA(const uint8_t) _PyOpcode_Caches[256]; #ifdef NEED_OPCODE_METADATA const uint8_t _PyOpcode_Caches[256] = { + [RESUME] = 1, [TO_BOOL] = 3, [STORE_SUBSCR] = 1, [SEND] = 1, @@ -1818,7 +1825,6 @@ const uint8_t _PyOpcode_Deopt[256] = { [125] = 125, [126] = 126, [127] = 127, - [213] = 213, [214] = 214, [215] = 215, [216] = 216, @@ -2026,6 +2032,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [RESERVED] = RESERVED, [RESUME] = RESUME, [RESUME_CHECK] = RESUME, + [RESUME_CHECK_JIT] = RESUME, [RETURN_GENERATOR] = RETURN_GENERATOR, [RETURN_VALUE] = RETURN_VALUE, [SEND] = SEND, @@ -2079,7 +2086,6 @@ const uint8_t _PyOpcode_Deopt[256] = { case 125: \ case 126: \ case 127: \ - case 213: \ case 214: \ case 215: \ case 216: \ diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index cea9fcce237301..8b52d77538abf2 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -361,6 +361,8 @@ _PyJit_TryInitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, int oparg, _PyExecutorObject *current_executor); PyAPI_FUNC(void) _PyJit_FinalizeTracing(PyThreadState *tstate, int err); +PyAPI_FUNC(bool) _PyJit_EnterExecutorShouldStopTracing(int og_opcode); + void _PyPrintExecutor(_PyExecutorObject *executor, const _PyUOpInstruction *marker); void _PyJit_TracerFree(_PyThreadStateImpl *_tstate); diff --git a/Include/internal/pycore_uop.h b/Include/internal/pycore_uop.h index f9be01acb57197..e7ac7d59ff7e27 100644 --- a/Include/internal/pycore_uop.h +++ b/Include/internal/pycore_uop.h @@ -36,7 +36,7 @@ typedef struct _PyUOpInstruction{ } _PyUOpInstruction; // This is the length of the trace we translate initially. -#ifdef Py_DEBUG +#if defined(Py_DEBUG) && defined(_Py_JIT) // With asserts, the stencils are a lot larger #define UOP_MAX_TRACE_LENGTH 1000 #else diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index 451c0dd5732d85..d29d98d3f16697 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -330,17 +330,16 @@ extern "C" { #define _PY_FRAME_EX 547 #define _PY_FRAME_GENERAL 548 #define _PY_FRAME_KW 549 -#define _QUICKEN_RESUME 550 -#define _RECORD_4OS 551 -#define _RECORD_BOUND_METHOD 552 -#define _RECORD_CALLABLE 553 -#define _RECORD_CODE 554 -#define _RECORD_NOS 555 -#define _RECORD_NOS_GEN_FUNC 556 -#define _RECORD_TOS 557 -#define _RECORD_TOS_TYPE 558 -#define _REPLACE_WITH_TRUE 559 -#define _RESUME_CHECK RESUME_CHECK +#define _RECORD_4OS 550 +#define _RECORD_BOUND_METHOD 551 +#define _RECORD_CALLABLE 552 +#define _RECORD_CODE 553 +#define _RECORD_NOS 554 +#define _RECORD_NOS_GEN_FUNC 555 +#define _RECORD_TOS 556 +#define _RECORD_TOS_TYPE 557 +#define _REPLACE_WITH_TRUE 558 +#define _RESUME_CHECK 559 #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE 560 #define _SAVE_RETURN_OFFSET 561 @@ -1141,152 +1140,148 @@ extern "C" { #define _PY_FRAME_EX_r31 1342 #define _PY_FRAME_GENERAL_r01 1343 #define _PY_FRAME_KW_r11 1344 -#define _QUICKEN_RESUME_r00 1345 -#define _QUICKEN_RESUME_r11 1346 -#define _QUICKEN_RESUME_r22 1347 -#define _QUICKEN_RESUME_r33 1348 -#define _REPLACE_WITH_TRUE_r02 1349 -#define _REPLACE_WITH_TRUE_r12 1350 -#define _REPLACE_WITH_TRUE_r23 1351 -#define _RESUME_CHECK_r00 1352 -#define _RESUME_CHECK_r11 1353 -#define _RESUME_CHECK_r22 1354 -#define _RESUME_CHECK_r33 1355 -#define _RETURN_GENERATOR_r01 1356 -#define _RETURN_VALUE_r11 1357 -#define _SAVE_RETURN_OFFSET_r00 1358 -#define _SAVE_RETURN_OFFSET_r11 1359 -#define _SAVE_RETURN_OFFSET_r22 1360 -#define _SAVE_RETURN_OFFSET_r33 1361 -#define _SEND_r22 1362 -#define _SEND_GEN_FRAME_r22 1363 -#define _SETUP_ANNOTATIONS_r00 1364 -#define _SET_ADD_r10 1365 -#define _SET_FUNCTION_ATTRIBUTE_r01 1366 -#define _SET_FUNCTION_ATTRIBUTE_r11 1367 -#define _SET_FUNCTION_ATTRIBUTE_r21 1368 -#define _SET_FUNCTION_ATTRIBUTE_r32 1369 -#define _SET_IP_r00 1370 -#define _SET_IP_r11 1371 -#define _SET_IP_r22 1372 -#define _SET_IP_r33 1373 -#define _SET_UPDATE_r10 1374 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1375 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1376 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1377 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1378 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1379 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1380 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1381 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1382 -#define _SPILL_OR_RELOAD_r01 1383 -#define _SPILL_OR_RELOAD_r02 1384 -#define _SPILL_OR_RELOAD_r03 1385 -#define _SPILL_OR_RELOAD_r10 1386 -#define _SPILL_OR_RELOAD_r12 1387 -#define _SPILL_OR_RELOAD_r13 1388 -#define _SPILL_OR_RELOAD_r20 1389 -#define _SPILL_OR_RELOAD_r21 1390 -#define _SPILL_OR_RELOAD_r23 1391 -#define _SPILL_OR_RELOAD_r30 1392 -#define _SPILL_OR_RELOAD_r31 1393 -#define _SPILL_OR_RELOAD_r32 1394 -#define _START_EXECUTOR_r00 1395 -#define _STORE_ATTR_r20 1396 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1397 -#define _STORE_ATTR_SLOT_r21 1398 -#define _STORE_ATTR_WITH_HINT_r21 1399 -#define _STORE_DEREF_r10 1400 -#define _STORE_FAST_LOAD_FAST_r11 1401 -#define _STORE_FAST_STORE_FAST_r20 1402 -#define _STORE_GLOBAL_r10 1403 -#define _STORE_NAME_r10 1404 -#define _STORE_SLICE_r30 1405 -#define _STORE_SUBSCR_r30 1406 -#define _STORE_SUBSCR_DICT_r31 1407 -#define _STORE_SUBSCR_LIST_INT_r32 1408 -#define _SWAP_r11 1409 -#define _SWAP_2_r02 1410 -#define _SWAP_2_r12 1411 -#define _SWAP_2_r22 1412 -#define _SWAP_2_r33 1413 -#define _SWAP_3_r03 1414 -#define _SWAP_3_r13 1415 -#define _SWAP_3_r23 1416 -#define _SWAP_3_r33 1417 -#define _SWAP_FAST_r01 1418 -#define _SWAP_FAST_r11 1419 -#define _SWAP_FAST_r22 1420 -#define _SWAP_FAST_r33 1421 -#define _SWAP_FAST_0_r01 1422 -#define _SWAP_FAST_0_r11 1423 -#define _SWAP_FAST_0_r22 1424 -#define _SWAP_FAST_0_r33 1425 -#define _SWAP_FAST_1_r01 1426 -#define _SWAP_FAST_1_r11 1427 -#define _SWAP_FAST_1_r22 1428 -#define _SWAP_FAST_1_r33 1429 -#define _SWAP_FAST_2_r01 1430 -#define _SWAP_FAST_2_r11 1431 -#define _SWAP_FAST_2_r22 1432 -#define _SWAP_FAST_2_r33 1433 -#define _SWAP_FAST_3_r01 1434 -#define _SWAP_FAST_3_r11 1435 -#define _SWAP_FAST_3_r22 1436 -#define _SWAP_FAST_3_r33 1437 -#define _SWAP_FAST_4_r01 1438 -#define _SWAP_FAST_4_r11 1439 -#define _SWAP_FAST_4_r22 1440 -#define _SWAP_FAST_4_r33 1441 -#define _SWAP_FAST_5_r01 1442 -#define _SWAP_FAST_5_r11 1443 -#define _SWAP_FAST_5_r22 1444 -#define _SWAP_FAST_5_r33 1445 -#define _SWAP_FAST_6_r01 1446 -#define _SWAP_FAST_6_r11 1447 -#define _SWAP_FAST_6_r22 1448 -#define _SWAP_FAST_6_r33 1449 -#define _SWAP_FAST_7_r01 1450 -#define _SWAP_FAST_7_r11 1451 -#define _SWAP_FAST_7_r22 1452 -#define _SWAP_FAST_7_r33 1453 -#define _TIER2_RESUME_CHECK_r00 1454 -#define _TIER2_RESUME_CHECK_r11 1455 -#define _TIER2_RESUME_CHECK_r22 1456 -#define _TIER2_RESUME_CHECK_r33 1457 -#define _TO_BOOL_r11 1458 -#define _TO_BOOL_BOOL_r01 1459 -#define _TO_BOOL_BOOL_r11 1460 -#define _TO_BOOL_BOOL_r22 1461 -#define _TO_BOOL_BOOL_r33 1462 -#define _TO_BOOL_INT_r02 1463 -#define _TO_BOOL_INT_r12 1464 -#define _TO_BOOL_INT_r23 1465 -#define _TO_BOOL_LIST_r02 1466 -#define _TO_BOOL_LIST_r12 1467 -#define _TO_BOOL_LIST_r23 1468 -#define _TO_BOOL_NONE_r01 1469 -#define _TO_BOOL_NONE_r11 1470 -#define _TO_BOOL_NONE_r22 1471 -#define _TO_BOOL_NONE_r33 1472 -#define _TO_BOOL_STR_r02 1473 -#define _TO_BOOL_STR_r12 1474 -#define _TO_BOOL_STR_r23 1475 -#define _TRACE_RECORD_r00 1476 -#define _UNARY_INVERT_r12 1477 -#define _UNARY_NEGATIVE_r12 1478 -#define _UNARY_NOT_r01 1479 -#define _UNARY_NOT_r11 1480 -#define _UNARY_NOT_r22 1481 -#define _UNARY_NOT_r33 1482 -#define _UNPACK_EX_r10 1483 -#define _UNPACK_SEQUENCE_r10 1484 -#define _UNPACK_SEQUENCE_LIST_r10 1485 -#define _UNPACK_SEQUENCE_TUPLE_r10 1486 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1487 -#define _WITH_EXCEPT_START_r33 1488 -#define _YIELD_VALUE_r11 1489 -#define MAX_UOP_REGS_ID 1489 +#define _REPLACE_WITH_TRUE_r02 1345 +#define _REPLACE_WITH_TRUE_r12 1346 +#define _REPLACE_WITH_TRUE_r23 1347 +#define _RESUME_CHECK_r00 1348 +#define _RESUME_CHECK_r11 1349 +#define _RESUME_CHECK_r22 1350 +#define _RESUME_CHECK_r33 1351 +#define _RETURN_GENERATOR_r01 1352 +#define _RETURN_VALUE_r11 1353 +#define _SAVE_RETURN_OFFSET_r00 1354 +#define _SAVE_RETURN_OFFSET_r11 1355 +#define _SAVE_RETURN_OFFSET_r22 1356 +#define _SAVE_RETURN_OFFSET_r33 1357 +#define _SEND_r22 1358 +#define _SEND_GEN_FRAME_r22 1359 +#define _SETUP_ANNOTATIONS_r00 1360 +#define _SET_ADD_r10 1361 +#define _SET_FUNCTION_ATTRIBUTE_r01 1362 +#define _SET_FUNCTION_ATTRIBUTE_r11 1363 +#define _SET_FUNCTION_ATTRIBUTE_r21 1364 +#define _SET_FUNCTION_ATTRIBUTE_r32 1365 +#define _SET_IP_r00 1366 +#define _SET_IP_r11 1367 +#define _SET_IP_r22 1368 +#define _SET_IP_r33 1369 +#define _SET_UPDATE_r10 1370 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1371 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1372 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1373 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1374 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1375 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1376 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1377 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1378 +#define _SPILL_OR_RELOAD_r01 1379 +#define _SPILL_OR_RELOAD_r02 1380 +#define _SPILL_OR_RELOAD_r03 1381 +#define _SPILL_OR_RELOAD_r10 1382 +#define _SPILL_OR_RELOAD_r12 1383 +#define _SPILL_OR_RELOAD_r13 1384 +#define _SPILL_OR_RELOAD_r20 1385 +#define _SPILL_OR_RELOAD_r21 1386 +#define _SPILL_OR_RELOAD_r23 1387 +#define _SPILL_OR_RELOAD_r30 1388 +#define _SPILL_OR_RELOAD_r31 1389 +#define _SPILL_OR_RELOAD_r32 1390 +#define _START_EXECUTOR_r00 1391 +#define _STORE_ATTR_r20 1392 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1393 +#define _STORE_ATTR_SLOT_r21 1394 +#define _STORE_ATTR_WITH_HINT_r21 1395 +#define _STORE_DEREF_r10 1396 +#define _STORE_FAST_LOAD_FAST_r11 1397 +#define _STORE_FAST_STORE_FAST_r20 1398 +#define _STORE_GLOBAL_r10 1399 +#define _STORE_NAME_r10 1400 +#define _STORE_SLICE_r30 1401 +#define _STORE_SUBSCR_r30 1402 +#define _STORE_SUBSCR_DICT_r31 1403 +#define _STORE_SUBSCR_LIST_INT_r32 1404 +#define _SWAP_r11 1405 +#define _SWAP_2_r02 1406 +#define _SWAP_2_r12 1407 +#define _SWAP_2_r22 1408 +#define _SWAP_2_r33 1409 +#define _SWAP_3_r03 1410 +#define _SWAP_3_r13 1411 +#define _SWAP_3_r23 1412 +#define _SWAP_3_r33 1413 +#define _SWAP_FAST_r01 1414 +#define _SWAP_FAST_r11 1415 +#define _SWAP_FAST_r22 1416 +#define _SWAP_FAST_r33 1417 +#define _SWAP_FAST_0_r01 1418 +#define _SWAP_FAST_0_r11 1419 +#define _SWAP_FAST_0_r22 1420 +#define _SWAP_FAST_0_r33 1421 +#define _SWAP_FAST_1_r01 1422 +#define _SWAP_FAST_1_r11 1423 +#define _SWAP_FAST_1_r22 1424 +#define _SWAP_FAST_1_r33 1425 +#define _SWAP_FAST_2_r01 1426 +#define _SWAP_FAST_2_r11 1427 +#define _SWAP_FAST_2_r22 1428 +#define _SWAP_FAST_2_r33 1429 +#define _SWAP_FAST_3_r01 1430 +#define _SWAP_FAST_3_r11 1431 +#define _SWAP_FAST_3_r22 1432 +#define _SWAP_FAST_3_r33 1433 +#define _SWAP_FAST_4_r01 1434 +#define _SWAP_FAST_4_r11 1435 +#define _SWAP_FAST_4_r22 1436 +#define _SWAP_FAST_4_r33 1437 +#define _SWAP_FAST_5_r01 1438 +#define _SWAP_FAST_5_r11 1439 +#define _SWAP_FAST_5_r22 1440 +#define _SWAP_FAST_5_r33 1441 +#define _SWAP_FAST_6_r01 1442 +#define _SWAP_FAST_6_r11 1443 +#define _SWAP_FAST_6_r22 1444 +#define _SWAP_FAST_6_r33 1445 +#define _SWAP_FAST_7_r01 1446 +#define _SWAP_FAST_7_r11 1447 +#define _SWAP_FAST_7_r22 1448 +#define _SWAP_FAST_7_r33 1449 +#define _TIER2_RESUME_CHECK_r00 1450 +#define _TIER2_RESUME_CHECK_r11 1451 +#define _TIER2_RESUME_CHECK_r22 1452 +#define _TIER2_RESUME_CHECK_r33 1453 +#define _TO_BOOL_r11 1454 +#define _TO_BOOL_BOOL_r01 1455 +#define _TO_BOOL_BOOL_r11 1456 +#define _TO_BOOL_BOOL_r22 1457 +#define _TO_BOOL_BOOL_r33 1458 +#define _TO_BOOL_INT_r02 1459 +#define _TO_BOOL_INT_r12 1460 +#define _TO_BOOL_INT_r23 1461 +#define _TO_BOOL_LIST_r02 1462 +#define _TO_BOOL_LIST_r12 1463 +#define _TO_BOOL_LIST_r23 1464 +#define _TO_BOOL_NONE_r01 1465 +#define _TO_BOOL_NONE_r11 1466 +#define _TO_BOOL_NONE_r22 1467 +#define _TO_BOOL_NONE_r33 1468 +#define _TO_BOOL_STR_r02 1469 +#define _TO_BOOL_STR_r12 1470 +#define _TO_BOOL_STR_r23 1471 +#define _TRACE_RECORD_r00 1472 +#define _UNARY_INVERT_r12 1473 +#define _UNARY_NEGATIVE_r12 1474 +#define _UNARY_NOT_r01 1475 +#define _UNARY_NOT_r11 1476 +#define _UNARY_NOT_r22 1477 +#define _UNARY_NOT_r33 1478 +#define _UNPACK_EX_r10 1479 +#define _UNPACK_SEQUENCE_r10 1480 +#define _UNPACK_SEQUENCE_LIST_r10 1481 +#define _UNPACK_SEQUENCE_TUPLE_r10 1482 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1483 +#define _WITH_EXCEPT_START_r33 1484 +#define _YIELD_VALUE_r11 1485 +#define MAX_UOP_REGS_ID 1485 #ifdef __cplusplus } diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h index c46368444f4c59..f9173fd83c295e 100644 --- a/Include/opcode_ids.h +++ b/Include/opcode_ids.h @@ -201,21 +201,22 @@ extern "C" { #define LOAD_SUPER_ATTR_ATTR 195 #define LOAD_SUPER_ATTR_METHOD 196 #define RESUME_CHECK 197 -#define SEND_GEN 198 -#define STORE_ATTR_INSTANCE_VALUE 199 -#define STORE_ATTR_SLOT 200 -#define STORE_ATTR_WITH_HINT 201 -#define STORE_SUBSCR_DICT 202 -#define STORE_SUBSCR_LIST_INT 203 -#define TO_BOOL_ALWAYS_TRUE 204 -#define TO_BOOL_BOOL 205 -#define TO_BOOL_INT 206 -#define TO_BOOL_LIST 207 -#define TO_BOOL_NONE 208 -#define TO_BOOL_STR 209 -#define UNPACK_SEQUENCE_LIST 210 -#define UNPACK_SEQUENCE_TUPLE 211 -#define UNPACK_SEQUENCE_TWO_TUPLE 212 +#define RESUME_CHECK_JIT 198 +#define SEND_GEN 199 +#define STORE_ATTR_INSTANCE_VALUE 200 +#define STORE_ATTR_SLOT 201 +#define STORE_ATTR_WITH_HINT 202 +#define STORE_SUBSCR_DICT 203 +#define STORE_SUBSCR_LIST_INT 204 +#define TO_BOOL_ALWAYS_TRUE 205 +#define TO_BOOL_BOOL 206 +#define TO_BOOL_INT 207 +#define TO_BOOL_LIST 208 +#define TO_BOOL_NONE 209 +#define TO_BOOL_STR 210 +#define UNPACK_SEQUENCE_LIST 211 +#define UNPACK_SEQUENCE_TUPLE 212 +#define UNPACK_SEQUENCE_TWO_TUPLE 213 #define INSTRUMENTED_END_FOR 233 #define INSTRUMENTED_POP_ITER 234 #define INSTRUMENTED_END_SEND 235 diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py index 6e37288c32dd9a..8d2c1ece8bc6a8 100644 --- a/Lib/_opcode_metadata.py +++ b/Lib/_opcode_metadata.py @@ -5,6 +5,7 @@ _specializations = frozendict( RESUME=( "RESUME_CHECK", + "RESUME_CHECK_JIT", ), TO_BOOL=( "TO_BOOL_ALWAYS_TRUE", @@ -195,21 +196,22 @@ LOAD_SUPER_ATTR_ATTR=195, LOAD_SUPER_ATTR_METHOD=196, RESUME_CHECK=197, - SEND_GEN=198, - STORE_ATTR_INSTANCE_VALUE=199, - STORE_ATTR_SLOT=200, - STORE_ATTR_WITH_HINT=201, - STORE_SUBSCR_DICT=202, - STORE_SUBSCR_LIST_INT=203, - TO_BOOL_ALWAYS_TRUE=204, - TO_BOOL_BOOL=205, - TO_BOOL_INT=206, - TO_BOOL_LIST=207, - TO_BOOL_NONE=208, - TO_BOOL_STR=209, - UNPACK_SEQUENCE_LIST=210, - UNPACK_SEQUENCE_TUPLE=211, - UNPACK_SEQUENCE_TWO_TUPLE=212, + RESUME_CHECK_JIT=198, + SEND_GEN=199, + STORE_ATTR_INSTANCE_VALUE=200, + STORE_ATTR_SLOT=201, + STORE_ATTR_WITH_HINT=202, + STORE_SUBSCR_DICT=203, + STORE_SUBSCR_LIST_INT=204, + TO_BOOL_ALWAYS_TRUE=205, + TO_BOOL_BOOL=206, + TO_BOOL_INT=207, + TO_BOOL_LIST=208, + TO_BOOL_NONE=209, + TO_BOOL_STR=210, + UNPACK_SEQUENCE_LIST=211, + UNPACK_SEQUENCE_TUPLE=212, + UNPACK_SEQUENCE_TWO_TUPLE=213, ) opmap = frozendict( diff --git a/Lib/opcode.py b/Lib/opcode.py index 165f42baed94e3..d53b94d89b46f7 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -119,6 +119,9 @@ POP_JUMP_IF_NOT_NONE=frozendict( counter=1, ), + RESUME=frozendict( + counter=1, + ), ) _inline_cache_entries = frozendict({ diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index d66031ed31cbe2..1385a7f840d7be 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -15,7 +15,7 @@ _testinternalcapi = import_helper.import_module("_testinternalcapi") -from _testinternalcapi import _PY_NSMALLPOSINTS, TIER2_THRESHOLD +from _testinternalcapi import _PY_NSMALLPOSINTS, TIER2_THRESHOLD, TIER2_RESUME_THRESHOLD #For test of issue 136154 GLOBAL_136154 = 42 @@ -322,6 +322,23 @@ def testfunc(n): uops = get_opnames(ex) self.assertIn("_JUMP_TO_TOP", uops) + def test_resume(self): + def testfunc(x): + if x <= 1: + return 1 + return testfunc(x-1) + + for _ in range((TIER2_RESUME_THRESHOLD + 99)//100): + testfunc(101) + + ex = get_first_executor(testfunc) + self.assertIsNotNone(ex) + uops = get_opnames(ex) + # 0. _START_EXECUTOR + # 1. _MAKE_WARM + # 2. _TIER2_RESUME_CHECK + self.assertEqual(uops[2], "_TIER2_RESUME_CHECK") + def test_jump_forward(self): def testfunc(n): a = 0 @@ -1419,7 +1436,7 @@ def test_guard_type_version_removed_invalidation(self): def thing(a): x = 0 - for i in range(TIER2_THRESHOLD * 2 + 1): + for i in range(TIER2_THRESHOLD + 1): x += a.attr # The first TIER2_THRESHOLD iterations we set the attribute on # this dummy class, which shouldn't trigger the type watcher. @@ -1437,8 +1454,7 @@ class Bar: res, ex = self._run_with_optimizer(thing, Foo()) opnames = list(iter_opnames(ex)) - self.assertIsNotNone(ex) - self.assertEqual(res, TIER2_THRESHOLD * 6 + 1) + self.assertEqual(res, TIER2_THRESHOLD * 2 + 2) call = opnames.index("_CALL_BUILTIN_FAST") load_attr_top = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", 0, call) load_attr_bottom = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", call) diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 0d5c6e6e77f5d7..19fa387cd7b271 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -1437,6 +1437,7 @@ def f(): co_code=bytes( [ dis.opmap["RESUME"], 0, + dis.opmap["CACHE"], 0, dis.opmap["LOAD_COMMON_CONSTANT"], 0, dis.opmap["RAISE_VARARGS"], 1, ] @@ -1445,7 +1446,7 @@ def f(): [ (1 << 7) | (PY_CODE_LOCATION_INFO_NO_COLUMNS << 3) - | (3 - 1), + | (4 - 1), 0, ] ), @@ -1453,7 +1454,7 @@ def f(): self.assertRaises(AssertionError, f) self.assertEqual( list(f.__code__.co_positions()), - 3 * [(42, 42, None, None)], + 4 * [(42, 42, None, None)], ) @cpython_only diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 302b2c21935efe..ac8837359c1445 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -2458,8 +2458,8 @@ def test_lambda_return_position(self): for i, pos in enumerate(positions): with self.subTest(i=i, pos=pos): start_line, end_line, start_col, end_col = pos - if i == 0 and start_col == end_col == 0: - # ignore the RESUME in the beginning + if i <= 1: + # ignore the RESUME and CACHE in the beginning continue self.assertEqual(start_line, 1) self.assertEqual(end_line, 1) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index cefd64ddfe8417..f4210db5bd788e 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -127,13 +127,13 @@ def _f(a): dis_f_with_offsets = """\ %3d 0 RESUME 0 -%3d 2 LOAD_GLOBAL 1 (print + NULL) - 12 LOAD_FAST_BORROW 0 (a) - 14 CALL 1 - 22 POP_TOP +%3d 4 LOAD_GLOBAL 1 (print + NULL) + 14 LOAD_FAST_BORROW 0 (a) + 16 CALL 1 + 24 POP_TOP -%3d 24 LOAD_SMALL_INT 1 - 26 RETURN_VALUE +%3d 26 LOAD_SMALL_INT 1 + 28 RETURN_VALUE """ % (_f.__code__.co_firstlineno, _f.__code__.co_firstlineno + 1, _f.__code__.co_firstlineno + 2) @@ -617,10 +617,10 @@ async def _asyncwith(c): CALL 0 GET_AWAITABLE 1 LOAD_CONST 0 (None) - L2: SEND 3 (to L5) + L2: SEND 4 (to L5) L3: YIELD_VALUE 1 L4: RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to L2) + JUMP_BACKWARD_NO_INTERRUPT 6 (to L2) L5: END_SEND L6: POP_TOP @@ -633,10 +633,10 @@ async def _asyncwith(c): CALL 3 GET_AWAITABLE 2 LOAD_CONST 0 (None) - L8: SEND 3 (to L11) + L8: SEND 4 (to L11) L9: YIELD_VALUE 1 L10: RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to L8) + JUMP_BACKWARD_NO_INTERRUPT 6 (to L8) L11: END_SEND POP_TOP @@ -646,17 +646,17 @@ async def _asyncwith(c): RETURN_VALUE %4d L12: CLEANUP_THROW - L13: JUMP_BACKWARD_NO_INTERRUPT 26 (to L5) + L13: JUMP_BACKWARD_NO_INTERRUPT 27 (to L5) L14: CLEANUP_THROW L15: JUMP_BACKWARD_NO_INTERRUPT 10 (to L11) L16: PUSH_EXC_INFO WITH_EXCEPT_START GET_AWAITABLE 2 LOAD_CONST 0 (None) - L17: SEND 4 (to L21) + L17: SEND 5 (to L21) L18: YIELD_VALUE 1 L19: RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to L17) + JUMP_BACKWARD_NO_INTERRUPT 6 (to L17) L20: CLEANUP_THROW L21: END_SEND TO_BOOL @@ -880,7 +880,7 @@ def foo(x): RETURN_GENERATOR POP_TOP L1: RESUME 0 - L2: FOR_ITER 14 (to L3) + L2: FOR_ITER 15 (to L3) STORE_FAST 1 (z) LOAD_DEREF 2 (x) LOAD_FAST_BORROW 1 (z) @@ -888,7 +888,7 @@ def foo(x): YIELD_VALUE 0 RESUME 5 POP_TOP - JUMP_BACKWARD 16 (to L2) + JUMP_BACKWARD 17 (to L2) L3: END_FOR POP_ITER LOAD_CONST 0 (None) @@ -909,7 +909,7 @@ def load_test(x, y=0): return a, b dis_load_test_quickened_code = """\ -%3d RESUME_CHECK 0 +%3d RESUME_CHECK{: <6} 0 %3d LOAD_FAST_LOAD_FAST 1 (x, y) STORE_FAST_STORE_FAST 50 (b, a) @@ -926,7 +926,7 @@ def loop_test(): load_test(i) dis_loop_test_quickened_code = """\ -%3d RESUME_CHECK 0 +%3d RESUME_CHECK{: <6} 0 %3d BUILD_LIST 0 LOAD_CONST 2 ((1, 2, 3)) @@ -1323,13 +1323,15 @@ def code_quicken(f): def test_super_instructions(self): self.code_quicken(lambda: load_test(0, 0)) got = self.get_disassembly(load_test, adaptive=True) - self.do_disassembly_compare(got, dis_load_test_quickened_code) + jit = sys._jit.is_enabled() + expected = dis_load_test_quickened_code.format("_JIT" if jit else "") + self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization def test_load_attr_specialize(self): load_attr_quicken = """\ - 0 RESUME_CHECK 0 + 0 RESUME_CHECK{: <6} 0 1 LOAD_CONST 0 ('a') LOAD_ATTR_SLOT 0 (__class__) @@ -1338,13 +1340,15 @@ def test_load_attr_specialize(self): co = compile("'a'.__class__", "", "eval") self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) - self.do_disassembly_compare(got, load_attr_quicken) + jit = sys._jit.is_enabled() + expected = load_attr_quicken.format("_JIT" if jit else "") + self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization def test_call_specialize(self): call_quicken = """\ - 0 RESUME_CHECK 0 + 0 RESUME_CHECK{: <6} 0 1 LOAD_NAME 0 (str) PUSH_NULL @@ -1355,7 +1359,9 @@ def test_call_specialize(self): co = compile("str(1)", "", "eval") self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) - self.do_disassembly_compare(got, call_quicken) + jit = sys._jit.is_enabled() + expected = call_quicken.format("_JIT" if jit else "") + self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization @@ -1364,7 +1370,9 @@ def test_loop_quicken(self): self.code_quicken(loop_test) got = self.get_disassembly(loop_test, adaptive=True) jit = sys._jit.is_enabled() - expected = dis_loop_test_quickened_code.format("JIT" if jit else "NO_JIT") + resume_str = "_JIT" if jit else "" + jit_str = "JIT " if jit else "NO_JIT" + expected = dis_loop_test_quickened_code.format(resume_str, jit_str) self.do_disassembly_compare(got, expected) @cpython_only @@ -1431,7 +1439,7 @@ def test_show_caches(self): caches = list(self.get_cached_values(quickened, adaptive)) for cache in caches: self.assertRegex(cache, pattern) - total_caches = 21 + total_caches = 22 empty_caches = 7 self.assertEqual(caches.count(""), empty_caches) self.assertEqual(len(caches), total_caches) @@ -1776,210 +1784,210 @@ def _prepare_test_cases(): expected_opinfo_outer = [ make_inst(opname='MAKE_CELL', arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=True, line_number=None), make_inst(opname='MAKE_CELL', arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None), - make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1), - make_inst(opname='LOAD_CONST', arg=4, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2), - make_inst(opname='LOAD_FAST_BORROW', arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2), - make_inst(opname='BUILD_TUPLE', arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2), - make_inst(opname='LOAD_CONST', arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2), - make_inst(opname='MAKE_FUNCTION', arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2), - make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2), - make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2), - make_inst(opname='STORE_FAST', arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2), - make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, line_number=7, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_DEREF', arg=0, argval='a', argrepr='a', offset=34, start_offset=34, starts_line=False, line_number=7), - make_inst(opname='LOAD_DEREF', arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7), - make_inst(opname='LOAD_CONST', arg=2, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7), - make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=40, start_offset=40, starts_line=False, line_number=7), - make_inst(opname='BUILD_LIST', arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7), - make_inst(opname='BUILD_MAP', arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7), - make_inst(opname='LOAD_CONST', arg=3, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7), - make_inst(opname='CALL', arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7), - make_inst(opname='LOAD_FAST_BORROW', arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8), + make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=4, argval=(3, 4), argrepr='(3, 4)', offset=8, start_offset=8, starts_line=True, line_number=2), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=2), + make_inst(opname='LOAD_FAST_BORROW', arg=1, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=2), + make_inst(opname='BUILD_TUPLE', arg=2, argval=2, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=2), + make_inst(opname='LOAD_CONST', arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=16, start_offset=16, starts_line=False, line_number=2), + make_inst(opname='MAKE_FUNCTION', arg=None, argval=None, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=2), + make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=8, argval=8, argrepr='closure', offset=20, start_offset=20, starts_line=False, line_number=2), + make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=1, argval=1, argrepr='defaults', offset=22, start_offset=22, starts_line=False, line_number=2), + make_inst(opname='STORE_FAST', arg=2, argval='f', argrepr='f', offset=24, start_offset=24, starts_line=False, line_number=2), + make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=26, start_offset=26, starts_line=True, line_number=7, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_DEREF', arg=0, argval='a', argrepr='a', offset=36, start_offset=36, starts_line=False, line_number=7), + make_inst(opname='LOAD_DEREF', arg=1, argval='b', argrepr='b', offset=38, start_offset=38, starts_line=False, line_number=7), + make_inst(opname='LOAD_CONST', arg=2, argval='', argrepr="''", offset=40, start_offset=40, starts_line=False, line_number=7), + make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7), + make_inst(opname='BUILD_LIST', arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7), + make_inst(opname='BUILD_MAP', arg=0, argval=0, argrepr='', offset=46, start_offset=46, starts_line=False, line_number=7), + make_inst(opname='LOAD_CONST', arg=3, argval='Hello world!', argrepr="'Hello world!'", offset=48, start_offset=48, starts_line=False, line_number=7), + make_inst(opname='CALL', arg=7, argval=7, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=58, start_offset=58, starts_line=False, line_number=7), + make_inst(opname='LOAD_FAST_BORROW', arg=2, argval='f', argrepr='f', offset=60, start_offset=60, starts_line=True, line_number=8), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=62, start_offset=62, starts_line=False, line_number=8), ] expected_opinfo_f = [ make_inst(opname='COPY_FREE_VARS', arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None), make_inst(opname='MAKE_CELL', arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None), make_inst(opname='MAKE_CELL', arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None), - make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2), - make_inst(opname='LOAD_CONST', arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3), - make_inst(opname='LOAD_FAST_BORROW', arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3), - make_inst(opname='LOAD_FAST_BORROW', arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3), - make_inst(opname='LOAD_FAST_BORROW', arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3), - make_inst(opname='BUILD_TUPLE', arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3), - make_inst(opname='LOAD_CONST', arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3), - make_inst(opname='MAKE_FUNCTION', arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3), - make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3), - make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3), - make_inst(opname='STORE_FAST', arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3), - make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=5, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_DEREF', arg=3, argval='a', argrepr='a', offset=40, start_offset=40, starts_line=False, line_number=5), - make_inst(opname='LOAD_DEREF', arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5), - make_inst(opname='LOAD_DEREF', arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5), - make_inst(opname='LOAD_DEREF', arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5), - make_inst(opname='CALL', arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5), - make_inst(opname='LOAD_FAST_BORROW', arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6), + make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=2, argval=(5, 6), argrepr='(5, 6)', offset=10, start_offset=10, starts_line=True, line_number=3), + make_inst(opname='LOAD_FAST_BORROW', arg=3, argval='a', argrepr='a', offset=12, start_offset=12, starts_line=False, line_number=3), + make_inst(opname='LOAD_FAST_BORROW', arg=4, argval='b', argrepr='b', offset=14, start_offset=14, starts_line=False, line_number=3), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='c', argrepr='c', offset=16, start_offset=16, starts_line=False, line_number=3), + make_inst(opname='LOAD_FAST_BORROW', arg=1, argval='d', argrepr='d', offset=18, start_offset=18, starts_line=False, line_number=3), + make_inst(opname='BUILD_TUPLE', arg=4, argval=4, argrepr='', offset=20, start_offset=20, starts_line=False, line_number=3), + make_inst(opname='LOAD_CONST', arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=22, start_offset=22, starts_line=False, line_number=3), + make_inst(opname='MAKE_FUNCTION', arg=None, argval=None, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=3), + make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=8, argval=8, argrepr='closure', offset=26, start_offset=26, starts_line=False, line_number=3), + make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=1, argval=1, argrepr='defaults', offset=28, start_offset=28, starts_line=False, line_number=3), + make_inst(opname='STORE_FAST', arg=2, argval='inner', argrepr='inner', offset=30, start_offset=30, starts_line=False, line_number=3), + make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=32, start_offset=32, starts_line=True, line_number=5, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_DEREF', arg=3, argval='a', argrepr='a', offset=42, start_offset=42, starts_line=False, line_number=5), + make_inst(opname='LOAD_DEREF', arg=4, argval='b', argrepr='b', offset=44, start_offset=44, starts_line=False, line_number=5), + make_inst(opname='LOAD_DEREF', arg=0, argval='c', argrepr='c', offset=46, start_offset=46, starts_line=False, line_number=5), + make_inst(opname='LOAD_DEREF', arg=1, argval='d', argrepr='d', offset=48, start_offset=48, starts_line=False, line_number=5), + make_inst(opname='CALL', arg=4, argval=4, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=58, start_offset=58, starts_line=False, line_number=5), + make_inst(opname='LOAD_FAST_BORROW', arg=2, argval='inner', argrepr='inner', offset=60, start_offset=60, starts_line=True, line_number=6), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=62, start_offset=62, starts_line=False, line_number=6), ] expected_opinfo_inner = [ make_inst(opname='COPY_FREE_VARS', arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None), - make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3), - make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_DEREF', arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4), - make_inst(opname='LOAD_DEREF', arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=False, line_number=4), - make_inst(opname='LOAD_DEREF', arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4), - make_inst(opname='LOAD_DEREF', arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4), - make_inst(opname='LOAD_FAST_BORROW_LOAD_FAST_BORROW', arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4), - make_inst(opname='CALL', arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4), - make_inst(opname='LOAD_CONST', arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=36, start_offset=36, starts_line=False, line_number=4), + make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=6, start_offset=6, starts_line=True, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_DEREF', arg=2, argval='a', argrepr='a', offset=16, start_offset=16, starts_line=False, line_number=4), + make_inst(opname='LOAD_DEREF', arg=3, argval='b', argrepr='b', offset=18, start_offset=18, starts_line=False, line_number=4), + make_inst(opname='LOAD_DEREF', arg=4, argval='c', argrepr='c', offset=20, start_offset=20, starts_line=False, line_number=4), + make_inst(opname='LOAD_DEREF', arg=5, argval='d', argrepr='d', offset=22, start_offset=22, starts_line=False, line_number=4), + make_inst(opname='LOAD_FAST_BORROW_LOAD_FAST_BORROW', arg=1, argval=('e', 'f'), argrepr='e, f', offset=24, start_offset=24, starts_line=False, line_number=4), + make_inst(opname='CALL', arg=6, argval=6, argrepr='', offset=26, start_offset=26, starts_line=False, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=34, start_offset=34, starts_line=False, line_number=4), + make_inst(opname='LOAD_CONST', arg=0, argval=None, argrepr='None', offset=36, start_offset=36, starts_line=False, line_number=4), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=38, start_offset=38, starts_line=False, line_number=4), ] expected_opinfo_jumpy = [ - make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1), - make_inst(opname='LOAD_GLOBAL', arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_SMALL_INT', arg=10, argval=10, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=3), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='GET_ITER', arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3), - make_inst(opname='FOR_ITER', arg=33, argval=94, argrepr='to L4', offset=24, start_offset=24, starts_line=False, line_number=3, label=1, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='STORE_FAST', arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5), - make_inst(opname='LOAD_SMALL_INT', arg=4, argval=4, argrepr='', offset=54, start_offset=54, starts_line=False, line_number=5), - make_inst(opname='COMPARE_OP', arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_JUMP_IF_FALSE', arg=3, argval=70, argrepr='to L2', offset=60, start_offset=60, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=64, start_offset=64, starts_line=False, line_number=5), - make_inst(opname='JUMP_BACKWARD', arg=23, argval=24, argrepr='to L1', offset=66, start_offset=66, starts_line=True, line_number=6, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=70, start_offset=70, starts_line=True, line_number=7, label=2), - make_inst(opname='LOAD_SMALL_INT', arg=6, argval=6, argrepr='', offset=72, start_offset=72, starts_line=False, line_number=7), - make_inst(opname='COMPARE_OP', arg=148, argval='>', argrepr='bool(>)', offset=74, start_offset=74, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_JUMP_IF_TRUE', arg=3, argval=88, argrepr='to L3', offset=78, start_offset=78, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=82, start_offset=82, starts_line=False, line_number=7), - make_inst(opname='JUMP_BACKWARD', arg=32, argval=24, argrepr='to L1', offset=84, start_offset=84, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=8, label=3), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=90, start_offset=90, starts_line=False, line_number=8), - make_inst(opname='JUMP_FORWARD', arg=13, argval=120, argrepr='to L5', offset=92, start_offset=92, starts_line=False, line_number=8), - make_inst(opname='END_FOR', arg=None, argval=None, argrepr='', offset=94, start_offset=94, starts_line=True, line_number=3, label=4), - make_inst(opname='POP_ITER', arg=None, argval=None, argrepr='', offset=96, start_offset=96, starts_line=False, line_number=3), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=98, start_offset=98, starts_line=True, line_number=10, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=1, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=108, start_offset=108, starts_line=False, line_number=10), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=110, start_offset=110, starts_line=False, line_number=10, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=118, start_offset=118, starts_line=False, line_number=10), - make_inst(opname='LOAD_FAST_CHECK', arg=0, argval='i', argrepr='i', offset=120, start_offset=120, starts_line=True, line_number=11, label=5), - make_inst(opname='TO_BOOL', arg=None, argval=None, argrepr='', offset=122, start_offset=122, starts_line=False, line_number=11, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_JUMP_IF_FALSE', arg=40, argval=214, argrepr='to L8', offset=130, start_offset=130, starts_line=False, line_number=11, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=134, start_offset=134, starts_line=False, line_number=11), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=136, start_offset=136, starts_line=True, line_number=12, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=146, start_offset=146, starts_line=False, line_number=12), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=148, start_offset=148, starts_line=False, line_number=12, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=156, start_offset=156, starts_line=False, line_number=12), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=158, start_offset=158, starts_line=True, line_number=13), - make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=160, start_offset=160, starts_line=False, line_number=13), - make_inst(opname='BINARY_OP', arg=23, argval=23, argrepr='-=', offset=162, start_offset=162, starts_line=False, line_number=13, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]), - make_inst(opname='STORE_FAST', arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=False, line_number=13), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=176, start_offset=176, starts_line=True, line_number=14), - make_inst(opname='LOAD_SMALL_INT', arg=6, argval=6, argrepr='', offset=178, start_offset=178, starts_line=False, line_number=14), - make_inst(opname='COMPARE_OP', arg=148, argval='>', argrepr='bool(>)', offset=180, start_offset=180, starts_line=False, line_number=14, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_JUMP_IF_FALSE', arg=3, argval=194, argrepr='to L6', offset=184, start_offset=184, starts_line=False, line_number=14, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=188, start_offset=188, starts_line=False, line_number=14), - make_inst(opname='JUMP_BACKWARD', arg=37, argval=120, argrepr='to L5', offset=190, start_offset=190, starts_line=True, line_number=15, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=194, start_offset=194, starts_line=True, line_number=16, label=6), - make_inst(opname='LOAD_SMALL_INT', arg=4, argval=4, argrepr='', offset=196, start_offset=196, starts_line=False, line_number=16), - make_inst(opname='COMPARE_OP', arg=18, argval='<', argrepr='bool(<)', offset=198, start_offset=198, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_JUMP_IF_TRUE', arg=3, argval=212, argrepr='to L7', offset=202, start_offset=202, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=206, start_offset=206, starts_line=False, line_number=16), - make_inst(opname='JUMP_BACKWARD', arg=46, argval=120, argrepr='to L5', offset=208, start_offset=208, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='JUMP_FORWARD', arg=11, argval=236, argrepr='to L9', offset=212, start_offset=212, starts_line=True, line_number=17, label=7), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=214, start_offset=214, starts_line=True, line_number=19, label=8, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=2, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=224, start_offset=224, starts_line=False, line_number=19), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=226, start_offset=226, starts_line=False, line_number=19, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=234, start_offset=234, starts_line=False, line_number=19), - make_inst(opname='NOP', arg=None, argval=None, argrepr='', offset=236, start_offset=236, starts_line=True, line_number=20, label=9), - make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=238, start_offset=238, starts_line=True, line_number=21), - make_inst(opname='LOAD_SMALL_INT', arg=0, argval=0, argrepr='', offset=240, start_offset=240, starts_line=False, line_number=21), - make_inst(opname='BINARY_OP', arg=11, argval=11, argrepr='/', offset=242, start_offset=242, starts_line=False, line_number=21, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=254, start_offset=254, starts_line=False, line_number=21), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=256, start_offset=256, starts_line=True, line_number=25), - make_inst(opname='COPY', arg=1, argval=1, argrepr='', offset=258, start_offset=258, starts_line=False, line_number=25), - make_inst(opname='LOAD_SPECIAL', arg=1, argval=1, argrepr='__exit__', offset=260, start_offset=260, starts_line=False, line_number=25), - make_inst(opname='SWAP', arg=2, argval=2, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25), - make_inst(opname='SWAP', arg=3, argval=3, argrepr='', offset=264, start_offset=264, starts_line=False, line_number=25), - make_inst(opname='LOAD_SPECIAL', arg=0, argval=0, argrepr='__enter__', offset=266, start_offset=266, starts_line=False, line_number=25), - make_inst(opname='CALL', arg=0, argval=0, argrepr='', offset=268, start_offset=268, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='STORE_FAST', arg=1, argval='dodgy', argrepr='dodgy', offset=276, start_offset=276, starts_line=False, line_number=25), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=278, start_offset=278, starts_line=True, line_number=26, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=3, argval='Never reach this', argrepr="'Never reach this'", offset=288, start_offset=288, starts_line=False, line_number=26), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=290, start_offset=290, starts_line=False, line_number=26, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=298, start_offset=298, starts_line=False, line_number=26), - make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=300, start_offset=300, starts_line=True, line_number=25), - make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=302, start_offset=302, starts_line=False, line_number=25), + make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_GLOBAL', arg=1, argval='range', argrepr='range + NULL', offset=4, start_offset=4, starts_line=True, line_number=3, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_SMALL_INT', arg=10, argval=10, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=3, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='GET_ITER', arg=None, argval=None, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=3), + make_inst(opname='FOR_ITER', arg=33, argval=96, argrepr='to L4', offset=26, start_offset=26, starts_line=False, line_number=3, label=1, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='STORE_FAST', arg=0, argval='i', argrepr='i', offset=30, start_offset=30, starts_line=False, line_number=3), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=32, start_offset=32, starts_line=True, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=42, start_offset=42, starts_line=False, line_number=4), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=52, start_offset=52, starts_line=False, line_number=4), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=54, start_offset=54, starts_line=True, line_number=5), + make_inst(opname='LOAD_SMALL_INT', arg=4, argval=4, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5), + make_inst(opname='COMPARE_OP', arg=18, argval='<', argrepr='bool(<)', offset=58, start_offset=58, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_JUMP_IF_FALSE', arg=3, argval=72, argrepr='to L2', offset=62, start_offset=62, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=66, start_offset=66, starts_line=False, line_number=5), + make_inst(opname='JUMP_BACKWARD', arg=23, argval=26, argrepr='to L1', offset=68, start_offset=68, starts_line=True, line_number=6, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=72, start_offset=72, starts_line=True, line_number=7, label=2), + make_inst(opname='LOAD_SMALL_INT', arg=6, argval=6, argrepr='', offset=74, start_offset=74, starts_line=False, line_number=7), + make_inst(opname='COMPARE_OP', arg=148, argval='>', argrepr='bool(>)', offset=76, start_offset=76, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_JUMP_IF_TRUE', arg=3, argval=90, argrepr='to L3', offset=80, start_offset=80, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=False, line_number=7), + make_inst(opname='JUMP_BACKWARD', arg=32, argval=26, argrepr='to L1', offset=86, start_offset=86, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=90, start_offset=90, starts_line=True, line_number=8, label=3), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=92, start_offset=92, starts_line=False, line_number=8), + make_inst(opname='JUMP_FORWARD', arg=13, argval=122, argrepr='to L5', offset=94, start_offset=94, starts_line=False, line_number=8), + make_inst(opname='END_FOR', arg=None, argval=None, argrepr='', offset=96, start_offset=96, starts_line=True, line_number=3, label=4), + make_inst(opname='POP_ITER', arg=None, argval=None, argrepr='', offset=98, start_offset=98, starts_line=False, line_number=3), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=100, start_offset=100, starts_line=True, line_number=10, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=1, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=110, start_offset=110, starts_line=False, line_number=10), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=112, start_offset=112, starts_line=False, line_number=10, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=120, start_offset=120, starts_line=False, line_number=10), + make_inst(opname='LOAD_FAST_CHECK', arg=0, argval='i', argrepr='i', offset=122, start_offset=122, starts_line=True, line_number=11, label=5), + make_inst(opname='TO_BOOL', arg=None, argval=None, argrepr='', offset=124, start_offset=124, starts_line=False, line_number=11, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_JUMP_IF_FALSE', arg=40, argval=216, argrepr='to L8', offset=132, start_offset=132, starts_line=False, line_number=11, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=136, start_offset=136, starts_line=False, line_number=11), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=138, start_offset=138, starts_line=True, line_number=12, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=148, start_offset=148, starts_line=False, line_number=12), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=150, start_offset=150, starts_line=False, line_number=12, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=158, start_offset=158, starts_line=False, line_number=12), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=160, start_offset=160, starts_line=True, line_number=13), + make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=162, start_offset=162, starts_line=False, line_number=13), + make_inst(opname='BINARY_OP', arg=23, argval=23, argrepr='-=', offset=164, start_offset=164, starts_line=False, line_number=13, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]), + make_inst(opname='STORE_FAST', arg=0, argval='i', argrepr='i', offset=176, start_offset=176, starts_line=False, line_number=13), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=178, start_offset=178, starts_line=True, line_number=14), + make_inst(opname='LOAD_SMALL_INT', arg=6, argval=6, argrepr='', offset=180, start_offset=180, starts_line=False, line_number=14), + make_inst(opname='COMPARE_OP', arg=148, argval='>', argrepr='bool(>)', offset=182, start_offset=182, starts_line=False, line_number=14, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_JUMP_IF_FALSE', arg=3, argval=196, argrepr='to L6', offset=186, start_offset=186, starts_line=False, line_number=14, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=190, start_offset=190, starts_line=False, line_number=14), + make_inst(opname='JUMP_BACKWARD', arg=37, argval=122, argrepr='to L5', offset=192, start_offset=192, starts_line=True, line_number=15, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=196, start_offset=196, starts_line=True, line_number=16, label=6), + make_inst(opname='LOAD_SMALL_INT', arg=4, argval=4, argrepr='', offset=198, start_offset=198, starts_line=False, line_number=16), + make_inst(opname='COMPARE_OP', arg=18, argval='<', argrepr='bool(<)', offset=200, start_offset=200, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_JUMP_IF_TRUE', arg=3, argval=214, argrepr='to L7', offset=204, start_offset=204, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=208, start_offset=208, starts_line=False, line_number=16), + make_inst(opname='JUMP_BACKWARD', arg=46, argval=122, argrepr='to L5', offset=210, start_offset=210, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='JUMP_FORWARD', arg=11, argval=238, argrepr='to L9', offset=214, start_offset=214, starts_line=True, line_number=17, label=7), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=216, start_offset=216, starts_line=True, line_number=19, label=8, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=2, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=226, start_offset=226, starts_line=False, line_number=19), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=228, start_offset=228, starts_line=False, line_number=19, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=236, start_offset=236, starts_line=False, line_number=19), + make_inst(opname='NOP', arg=None, argval=None, argrepr='', offset=238, start_offset=238, starts_line=True, line_number=20, label=9), + make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=240, start_offset=240, starts_line=True, line_number=21), + make_inst(opname='LOAD_SMALL_INT', arg=0, argval=0, argrepr='', offset=242, start_offset=242, starts_line=False, line_number=21), + make_inst(opname='BINARY_OP', arg=11, argval=11, argrepr='/', offset=244, start_offset=244, starts_line=False, line_number=21, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=256, start_offset=256, starts_line=False, line_number=21), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=258, start_offset=258, starts_line=True, line_number=25), + make_inst(opname='COPY', arg=1, argval=1, argrepr='', offset=260, start_offset=260, starts_line=False, line_number=25), + make_inst(opname='LOAD_SPECIAL', arg=1, argval=1, argrepr='__exit__', offset=262, start_offset=262, starts_line=False, line_number=25), + make_inst(opname='SWAP', arg=2, argval=2, argrepr='', offset=264, start_offset=264, starts_line=False, line_number=25), + make_inst(opname='SWAP', arg=3, argval=3, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=25), + make_inst(opname='LOAD_SPECIAL', arg=0, argval=0, argrepr='__enter__', offset=268, start_offset=268, starts_line=False, line_number=25), + make_inst(opname='CALL', arg=0, argval=0, argrepr='', offset=270, start_offset=270, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='STORE_FAST', arg=1, argval='dodgy', argrepr='dodgy', offset=278, start_offset=278, starts_line=False, line_number=25), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=280, start_offset=280, starts_line=True, line_number=26, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=3, argval='Never reach this', argrepr="'Never reach this'", offset=290, start_offset=290, starts_line=False, line_number=26), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=292, start_offset=292, starts_line=False, line_number=26, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=300, start_offset=300, starts_line=False, line_number=26), + make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=302, start_offset=302, starts_line=True, line_number=25), make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=304, start_offset=304, starts_line=False, line_number=25), - make_inst(opname='CALL', arg=3, argval=3, argrepr='', offset=306, start_offset=306, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=314, start_offset=314, starts_line=False, line_number=25), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=316, start_offset=316, starts_line=True, line_number=28, label=10, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=6, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=326, start_offset=326, starts_line=False, line_number=28), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=336, start_offset=336, starts_line=False, line_number=28), - make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=338, start_offset=338, starts_line=False, line_number=28), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=False, line_number=28), - make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=True, line_number=25), - make_inst(opname='WITH_EXCEPT_START', arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=25), - make_inst(opname='TO_BOOL', arg=None, argval=None, argrepr='', offset=346, start_offset=346, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_JUMP_IF_TRUE', arg=2, argval=362, argrepr='to L11', offset=354, start_offset=354, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=358, start_offset=358, starts_line=False, line_number=25), - make_inst(opname='RERAISE', arg=2, argval=2, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25, label=11), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25), + make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=306, start_offset=306, starts_line=False, line_number=25), + make_inst(opname='CALL', arg=3, argval=3, argrepr='', offset=308, start_offset=308, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=316, start_offset=316, starts_line=False, line_number=25), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=318, start_offset=318, starts_line=True, line_number=28, label=10, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=6, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=328, start_offset=328, starts_line=False, line_number=28), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=330, start_offset=330, starts_line=False, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=338, start_offset=338, starts_line=False, line_number=28), + make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=340, start_offset=340, starts_line=False, line_number=28), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=28), + make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=True, line_number=25), + make_inst(opname='WITH_EXCEPT_START', arg=None, argval=None, argrepr='', offset=346, start_offset=346, starts_line=False, line_number=25), + make_inst(opname='TO_BOOL', arg=None, argval=None, argrepr='', offset=348, start_offset=348, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_JUMP_IF_TRUE', arg=2, argval=364, argrepr='to L11', offset=356, start_offset=356, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25), + make_inst(opname='RERAISE', arg=2, argval=2, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25, label=11), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25), make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=25), make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=370, start_offset=370, starts_line=False, line_number=25), - make_inst(opname='JUMP_BACKWARD_NO_INTERRUPT', arg=29, argval=316, argrepr='to L10', offset=372, start_offset=372, starts_line=False, line_number=25), - make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=374, start_offset=374, starts_line=True, line_number=None), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=None), - make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None), - make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=380, start_offset=380, starts_line=False, line_number=None), - make_inst(opname='LOAD_GLOBAL', arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=382, start_offset=382, starts_line=True, line_number=22, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='CHECK_EXC_MATCH', arg=None, argval=None, argrepr='', offset=392, start_offset=392, starts_line=False, line_number=22), - make_inst(opname='POP_JUMP_IF_FALSE', arg=15, argval=428, argrepr='to L12', offset=394, start_offset=394, starts_line=False, line_number=22, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=22), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=400, start_offset=400, starts_line=False, line_number=22), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=402, start_offset=402, starts_line=True, line_number=23, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=5, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=412, start_offset=412, starts_line=False, line_number=23), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=23, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=23), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=23), - make_inst(opname='JUMP_BACKWARD_NO_INTERRUPT', arg=56, argval=316, argrepr='to L10', offset=426, start_offset=426, starts_line=False, line_number=23), - make_inst(opname='RERAISE', arg=0, argval=0, argrepr='', offset=428, start_offset=428, starts_line=True, line_number=22, label=12), - make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=430, start_offset=430, starts_line=True, line_number=None), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=432, start_offset=432, starts_line=False, line_number=None), - make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None), - make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=436, start_offset=436, starts_line=False, line_number=None), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=438, start_offset=438, starts_line=True, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=6, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=448, start_offset=448, starts_line=False, line_number=28), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=450, start_offset=450, starts_line=False, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=458, start_offset=458, starts_line=False, line_number=28), - make_inst(opname='RERAISE', arg=0, argval=0, argrepr='', offset=460, start_offset=460, starts_line=False, line_number=28), - make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=462, start_offset=462, starts_line=True, line_number=None), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=464, start_offset=464, starts_line=False, line_number=None), - make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=466, start_offset=466, starts_line=False, line_number=None), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=372, start_offset=372, starts_line=False, line_number=25), + make_inst(opname='JUMP_BACKWARD_NO_INTERRUPT', arg=29, argval=318, argrepr='to L10', offset=374, start_offset=374, starts_line=False, line_number=25), + make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=376, start_offset=376, starts_line=True, line_number=None), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None), + make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=380, start_offset=380, starts_line=False, line_number=None), + make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=382, start_offset=382, starts_line=False, line_number=None), + make_inst(opname='LOAD_GLOBAL', arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=384, start_offset=384, starts_line=True, line_number=22, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='CHECK_EXC_MATCH', arg=None, argval=None, argrepr='', offset=394, start_offset=394, starts_line=False, line_number=22), + make_inst(opname='POP_JUMP_IF_FALSE', arg=15, argval=430, argrepr='to L12', offset=396, start_offset=396, starts_line=False, line_number=22, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=400, start_offset=400, starts_line=False, line_number=22), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=402, start_offset=402, starts_line=False, line_number=22), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=404, start_offset=404, starts_line=True, line_number=23, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=5, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=414, start_offset=414, starts_line=False, line_number=23), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=416, start_offset=416, starts_line=False, line_number=23, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=23), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=426, start_offset=426, starts_line=False, line_number=23), + make_inst(opname='JUMP_BACKWARD_NO_INTERRUPT', arg=56, argval=318, argrepr='to L10', offset=428, start_offset=428, starts_line=False, line_number=23), + make_inst(opname='RERAISE', arg=0, argval=0, argrepr='', offset=430, start_offset=430, starts_line=True, line_number=22, label=12), + make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=432, start_offset=432, starts_line=True, line_number=None), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None), + make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=436, start_offset=436, starts_line=False, line_number=None), + make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=438, start_offset=438, starts_line=False, line_number=None), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=440, start_offset=440, starts_line=True, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=6, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=450, start_offset=450, starts_line=False, line_number=28), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=452, start_offset=452, starts_line=False, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=460, start_offset=460, starts_line=False, line_number=28), + make_inst(opname='RERAISE', arg=0, argval=0, argrepr='', offset=462, start_offset=462, starts_line=False, line_number=28), + make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=464, start_offset=464, starts_line=True, line_number=None), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=466, start_offset=466, starts_line=False, line_number=None), + make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=468, start_offset=468, starts_line=False, line_number=None), ] # One last piece of inspect fodder to check the default line number handling def simple(): pass expected_opinfo_simple = [ make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=simple.__code__.co_firstlineno), - make_inst(opname='LOAD_CONST', arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=4, start_offset=4, starts_line=False, line_number=simple.__code__.co_firstlineno), + make_inst(opname='LOAD_CONST', arg=0, argval=None, argrepr='None', offset=4, start_offset=4, starts_line=False, line_number=simple.__code__.co_firstlineno), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=6, start_offset=6, starts_line=False, line_number=simple.__code__.co_firstlineno), ] @@ -2370,8 +2378,10 @@ def test_from_traceback_dis(self): @requires_debug_ranges() def test_bytecode_co_positions(self): bytecode = dis.Bytecode("a=1") - for instr, positions in zip(bytecode, bytecode.codeobj.co_positions()): - assert instr.positions == positions + it = bytecode.codeobj.co_positions() + next(it) # Ignore the CACHE for the RESUME + for instr, positions in zip(bytecode, it): + self.assertEqual(instr.positions, positions) class TestBytecodeTestCase(BytecodeTestCase): def test_assert_not_in_with_op_not_in_bytecode(self): @@ -2439,7 +2449,7 @@ def func(): code = func.__code__ offsets = [linestart[0] for linestart in dis.findlinestarts(code)] - self.assertEqual(offsets, [0, 2]) + self.assertEqual(offsets, [0, 4]) class TestDisTraceback(DisTestBase): @@ -2576,6 +2586,7 @@ def test_show_cache(self): source = 'print()' expect = ''' 0 RESUME 0 + CACHE 0 (counter: 0) 1 LOAD_NAME 0 (print) PUSH_NULL @@ -2596,8 +2607,8 @@ def test_show_offsets(self): expect = ''' 0 0 RESUME 0 - 1 2 LOAD_CONST 0 (None) - 4 RETURN_VALUE + 1 4 LOAD_CONST 0 (None) + 6 RETURN_VALUE ''' for flag in ['-O', '--show-offsets']: self.check_output(source, expect, flag) diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 1b22e0ec8759ac..116a8bac6fb7b8 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1214,19 +1214,20 @@ def func1(): line3 = 3 self.check_events(func1, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ - ('line', 'get_events', 10), - ('line', 'func1', 1), - ('instruction', 'func1', 2), - ('instruction', 'func1', 4), - ('line', 'func1', 2), - ('instruction', 'func1', 6), - ('instruction', 'func1', 8), - ('line', 'func1', 3), - ('instruction', 'func1', 10), - ('instruction', 'func1', 12), - ('instruction', 'func1', 14), - ('instruction', 'func1', 16), - ('line', 'get_events', 11)]) + ("line", "get_events", 10), + ("line", "func1", 1), + ("instruction", "func1", 4), + ("instruction", "func1", 6), + ("line", "func1", 2), + ("instruction", "func1", 8), + ("instruction", "func1", 10), + ("line", "func1", 3), + ("instruction", "func1", 12), + ("instruction", "func1", 14), + ("instruction", "func1", 16), + ("instruction", "func1", 18), + ("line", "get_events", 11), + ]) def test_c_call(self): @@ -1236,22 +1237,23 @@ def func2(): line3 = 3 self.check_events(func2, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ - ('line', 'get_events', 10), - ('line', 'func2', 1), - ('instruction', 'func2', 2), - ('instruction', 'func2', 4), - ('line', 'func2', 2), - ('instruction', 'func2', 6), - ('instruction', 'func2', 8), - ('instruction', 'func2', 28), - ('instruction', 'func2', 30), - ('instruction', 'func2', 38), - ('line', 'func2', 3), - ('instruction', 'func2', 40), - ('instruction', 'func2', 42), - ('instruction', 'func2', 44), - ('instruction', 'func2', 46), - ('line', 'get_events', 11)]) + ("line", "get_events", 10), + ("line", "func2", 1), + ("instruction", "func2", 4), + ("instruction", "func2", 6), + ("line", "func2", 2), + ("instruction", "func2", 8), + ("instruction", "func2", 10), + ("instruction", "func2", 30), + ("instruction", "func2", 32), + ("instruction", "func2", 40), + ("line", "func2", 3), + ("instruction", "func2", 42), + ("instruction", "func2", 44), + ("instruction", "func2", 46), + ("instruction", "func2", 48), + ("line", "get_events", 11), + ]) def test_try_except(self): @@ -1264,28 +1266,29 @@ def func3(): line = 6 self.check_events(func3, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ - ('line', 'get_events', 10), - ('line', 'func3', 1), - ('instruction', 'func3', 2), - ('line', 'func3', 2), - ('instruction', 'func3', 4), - ('instruction', 'func3', 6), - ('line', 'func3', 3), - ('instruction', 'func3', 8), - ('instruction', 'func3', 18), - ('instruction', 'func3', 20), - ('line', 'func3', 4), - ('instruction', 'func3', 22), - ('line', 'func3', 5), - ('instruction', 'func3', 24), - ('instruction', 'func3', 26), - ('instruction', 'func3', 28), - ('line', 'func3', 6), - ('instruction', 'func3', 30), - ('instruction', 'func3', 32), - ('instruction', 'func3', 34), - ('instruction', 'func3', 36), - ('line', 'get_events', 11)]) + ("line", "get_events", 10), + ("line", "func3", 1), + ("instruction", "func3", 4), + ("line", "func3", 2), + ("instruction", "func3", 6), + ("instruction", "func3", 8), + ("line", "func3", 3), + ("instruction", "func3", 10), + ("instruction", "func3", 20), + ("instruction", "func3", 22), + ("line", "func3", 4), + ("instruction", "func3", 24), + ("line", "func3", 5), + ("instruction", "func3", 26), + ("instruction", "func3", 28), + ("instruction", "func3", 30), + ("line", "func3", 6), + ("instruction", "func3", 32), + ("instruction", "func3", 34), + ("instruction", "func3", 36), + ("instruction", "func3", 38), + ("line", "get_events", 11), + ]) def test_with_restart(self): def func1(): @@ -1296,16 +1299,16 @@ def func1(): self.check_events(func1, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ ('line', 'get_events', 10), ('line', 'func1', 1), - ('instruction', 'func1', 2), ('instruction', 'func1', 4), - ('line', 'func1', 2), ('instruction', 'func1', 6), + ('line', 'func1', 2), ('instruction', 'func1', 8), - ('line', 'func1', 3), ('instruction', 'func1', 10), + ('line', 'func1', 3), ('instruction', 'func1', 12), ('instruction', 'func1', 14), ('instruction', 'func1', 16), + ('instruction', 'func1', 18), ('line', 'get_events', 11)]) sys.monitoring.restart_events() @@ -1313,16 +1316,16 @@ def func1(): self.check_events(func1, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ ('line', 'get_events', 10), ('line', 'func1', 1), - ('instruction', 'func1', 2), ('instruction', 'func1', 4), - ('line', 'func1', 2), ('instruction', 'func1', 6), + ('line', 'func1', 2), ('instruction', 'func1', 8), - ('line', 'func1', 3), ('instruction', 'func1', 10), + ('line', 'func1', 3), ('instruction', 'func1', 12), ('instruction', 'func1', 14), ('instruction', 'func1', 16), + ('instruction', 'func1', 18), ('line', 'get_events', 11)]) def test_turn_off_only_instruction(self): @@ -1370,10 +1373,10 @@ def func1(): line1 = 1 MUST_INCLUDE_LI = [ - ('instruction', 'func1', 2), - ('line', 'func1', 2), ('instruction', 'func1', 4), - ('instruction', 'func1', 6)] + ('line', 'func1', 2), + ('instruction', 'func1', 6), + ('instruction', 'func1', 8)] def test_line_then_instruction(self): recorders = [ LineRecorder, InstructionRecorder ] @@ -1390,11 +1393,11 @@ def func2(): len(()) MUST_INCLUDE_CI = [ - ('instruction', 'func2', 2), + ('instruction', 'func2', 4), ('call', 'func2', sys.monitoring.MISSING), ('call', 'len', ()), - ('instruction', 'func2', 12), - ('instruction', 'func2', 14)] + ('instruction', 'func2', 14), + ('instruction', 'func2', 16)] @@ -1609,11 +1612,11 @@ def whilefunc(n=0): ('branch right', 'whilefunc', 1, 3)]) self.check_events(func, recorders = BRANCH_OFFSET_RECORDERS, expected = [ - ('branch left', 'func', 28, 32), - ('branch right', 'func', 44, 58), - ('branch left', 'func', 28, 32), - ('branch left', 'func', 44, 50), - ('branch right', 'func', 28, 70)]) + ('branch left', 'func', 30, 34), + ('branch right', 'func', 46, 60), + ('branch left', 'func', 30, 34), + ('branch left', 'func', 46, 52), + ('branch right', 'func', 30, 72)]) def test_except_star(self): @@ -1640,8 +1643,8 @@ def func(): ('branch', 'func', 4, 4), ('line', 'func', 5), ('line', 'meth', 1), - ('jump', 'func', 5, '[offset=120]'), - ('branch', 'func', '[offset=124]', '[offset=130]'), + ('jump', 'func', 5, '[offset=122]'), + ('branch', 'func', '[offset=126]', '[offset=132]'), ('line', 'get_events', 11)]) self.check_events(func, recorders = FLOW_AND_LINE_RECORDERS, expected = [ @@ -1655,8 +1658,8 @@ def func(): ('line', 'func', 5), ('line', 'meth', 1), ('return', 'meth', None), - ('jump', 'func', 5, '[offset=120]'), - ('branch', 'func', '[offset=124]', '[offset=130]'), + ('jump', 'func', 5, '[offset=122]'), + ('branch', 'func', '[offset=126]', '[offset=132]'), ('return', 'func', None), ('line', 'get_events', 11)]) @@ -1668,8 +1671,8 @@ def foo(n=0): n += 1 return None - in_loop = ('branch left', 'foo', 10, 16) - exit_loop = ('branch right', 'foo', 10, 40) + in_loop = ('branch left', 'foo', 12, 18) + exit_loop = ('branch right', 'foo', 12, 42) self.check_events(foo, recorders = BRANCH_OFFSET_RECORDERS, expected = [ in_loop, in_loop, diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst new file mode 100644 index 00000000000000..9808a27e9ea1eb --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst @@ -0,0 +1 @@ +Support tracing from function entrypoints in the JIT. Patch by Ken Jin. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 8c316b7c8ddda0..e1acce8f586685 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -3021,6 +3021,14 @@ module_exec(PyObject *module) return 1; } + // + 1 to specialize from RESUME to RESUME_CHECK_JIT + // + 1 more due to one loop spent on tracing. + long resume_threshold = interp->opt_config.resume_initial_value + 2; + if (PyModule_Add(module, "TIER2_RESUME_THRESHOLD", + PyLong_FromLong(resume_threshold)) < 0) { + return 1; + } + if (PyModule_Add(module, "SPECIALIZATION_THRESHOLD", PyLong_FromLong(ADAPTIVE_WARMUP_VALUE + 1)) < 0) { return 1; diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index 2f6845399d9e16..948a413d98ddcd 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -5691,12 +5691,22 @@ INSTRUCTION_STATS(ENTER_EXECUTOR); opcode = ENTER_EXECUTOR; #ifdef _Py_TIER2 + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; if (IS_JIT_TRACING()) { + int og_opcode = executor->vm_data.opcode; + int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; + if (_PyJit_EnterExecutorShouldStopTracing(og_opcode)) { + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + opcode = og_opcode; + oparg = og_oparg; + DISPATCH_GOTO_NON_TRACING(); + } JUMP_TO_LABEL(stop_tracing); } - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); @@ -7436,8 +7446,9 @@ _Py_CODEUNIT* const this_instr = next_instr; (void)this_instr; frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(INSTRUMENTED_RESUME); + /* Skip 1 cache entry */ // _LOAD_BYTECODE { #ifdef Py_GIL_DISABLED @@ -7786,16 +7797,19 @@ // _JIT { #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT && + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); if (succ) { ENTER_TRACING(); } @@ -10448,10 +10462,10 @@ (void)(opcode); #endif frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(RESUME); PREDICTED_RESUME:; - _Py_CODEUNIT* const this_instr = next_instr - 1; + _Py_CODEUNIT* const this_instr = next_instr - 2; (void)this_instr; // _LOAD_BYTECODE { @@ -10498,11 +10512,11 @@ } // _QUICKEN_RESUME { - #if ENABLE_SPECIALIZATION - if (tstate->tracing == 0 && this_instr->op.code == RESUME) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); - } - #endif /* ENABLE_SPECIALIZATION */ + uint16_t counter = read_u16(&this_instr[1].cache); + (void)counter; + _PyFrame_SetStackPointer(frame, stack_pointer); + _Py_Specialize_Resume(this_instr, tstate, frame); + stack_pointer = _PyFrame_GetStackPointer(frame); } // _CHECK_PERIODIC_IF_NOT_YIELD_FROM { @@ -10527,9 +10541,10 @@ _Py_CODEUNIT* const this_instr = next_instr; (void)this_instr; frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(RESUME_CHECK); - static_assert(0 == 0, "incorrect cache size"); + static_assert(1 == 1, "incorrect cache size"); + /* Skip 1 cache entry */ #if defined(__EMSCRIPTEN__) if (_Py_emscripten_signal_clock == 0) { UPDATE_MISS_STATS(RESUME); @@ -10557,6 +10572,76 @@ DISPATCH(); } + TARGET(RESUME_CHECK_JIT) { + #if _Py_TAIL_CALL_INTERP + int opcode = RESUME_CHECK_JIT; + (void)(opcode); + #endif + _Py_CODEUNIT* const this_instr = next_instr; + (void)this_instr; + frame->instr_ptr = next_instr; + next_instr += 2; + INSTRUCTION_STATS(RESUME_CHECK_JIT); + static_assert(1 == 1, "incorrect cache size"); + /* Skip 1 cache entry */ + // _RESUME_CHECK + { + #if defined(__EMSCRIPTEN__) + if (_Py_emscripten_signal_clock == 0) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + #endif + uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); + assert((version & _PY_EVAL_EVENTS_MASK) == 0); + if (eval_breaker != version) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #ifdef Py_GIL_DISABLED + if (frame->tlbc_index != + ((_PyThreadStateImpl *)tstate)->tlbc_index) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #endif + } + // _JIT + { + #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; + _Py_BackoffCounter counter = this_instr[1].counter; + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && + next_instr->op.code != ENTER_EXECUTOR) { + _Py_CODEUNIT *insert_exec_at = this_instr; + while (oparg > 255) { + oparg >>= 8; + insert_exec_at--; + } + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); + if (succ) { + ENTER_TRACING(); + } + else { + this_instr[1].counter = restart_backoff_counter(counter); + } + } + else { + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + #endif + } + DISPATCH(); + } + TARGET(RETURN_GENERATOR) { #if _Py_TAIL_CALL_INTERP int opcode = RETURN_GENERATOR; diff --git a/Modules/_testinternalcapi/test_targets.h b/Modules/_testinternalcapi/test_targets.h index f57c33feec2ac2..def462bacec176 100644 --- a/Modules/_testinternalcapi/test_targets.h +++ b/Modules/_testinternalcapi/test_targets.h @@ -198,6 +198,7 @@ static void *opcode_targets_table[256] = { &&TARGET_LOAD_SUPER_ATTR_ATTR, &&TARGET_LOAD_SUPER_ATTR_METHOD, &&TARGET_RESUME_CHECK, + &&TARGET_RESUME_CHECK_JIT, &&TARGET_SEND_GEN, &&TARGET_STORE_ATTR_INSTANCE_VALUE, &&TARGET_STORE_ATTR_SLOT, @@ -232,7 +233,6 @@ static void *opcode_targets_table[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_INSTRUMENTED_END_FOR, &&TARGET_INSTRUMENTED_POP_ITER, &&TARGET_INSTRUMENTED_END_SEND, @@ -472,7 +472,7 @@ static void *opcode_tracing_targets_table[256] = { &&TARGET_TRACE_RECORD, &&TARGET_TRACE_RECORD, &&TARGET_TRACE_RECORD, - &&_unknown_opcode, + &&TARGET_TRACE_RECORD, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, @@ -718,6 +718,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RERAISE(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESERVED(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME_CHECK(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME_CHECK_JIT(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RETURN_GENERATOR(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RETURN_VALUE(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_SEND(TAIL_CALL_PARAMS); @@ -959,6 +960,7 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = { [RESERVED] = _TAIL_CALL_RESERVED, [RESUME] = _TAIL_CALL_RESUME, [RESUME_CHECK] = _TAIL_CALL_RESUME_CHECK, + [RESUME_CHECK_JIT] = _TAIL_CALL_RESUME_CHECK_JIT, [RETURN_GENERATOR] = _TAIL_CALL_RETURN_GENERATOR, [RETURN_VALUE] = _TAIL_CALL_RETURN_VALUE, [SEND] = _TAIL_CALL_SEND, @@ -1007,7 +1009,6 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [213] = _TAIL_CALL_UNKNOWN_OPCODE, [214] = _TAIL_CALL_UNKNOWN_OPCODE, [215] = _TAIL_CALL_UNKNOWN_OPCODE, [216] = _TAIL_CALL_UNKNOWN_OPCODE, @@ -1217,6 +1218,7 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = { [RESERVED] = _TAIL_CALL_TRACE_RECORD, [RESUME] = _TAIL_CALL_TRACE_RECORD, [RESUME_CHECK] = _TAIL_CALL_TRACE_RECORD, + [RESUME_CHECK_JIT] = _TAIL_CALL_TRACE_RECORD, [RETURN_GENERATOR] = _TAIL_CALL_TRACE_RECORD, [RETURN_VALUE] = _TAIL_CALL_TRACE_RECORD, [SEND] = _TAIL_CALL_TRACE_RECORD, @@ -1265,7 +1267,6 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [213] = _TAIL_CALL_UNKNOWN_OPCODE, [214] = _TAIL_CALL_UNKNOWN_OPCODE, [215] = _TAIL_CALL_UNKNOWN_OPCODE, [216] = _TAIL_CALL_UNKNOWN_OPCODE, diff --git a/Objects/codeobject.c b/Objects/codeobject.c index d26516f7c2ff66..fbf0985e9050dd 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -931,8 +931,9 @@ PyUnstable_Code_New(int argcount, int kwonlyargcount, // NOTE: When modifying the construction of PyCode_NewEmpty, please also change // test.test_code.CodeLocationTest.test_code_new_empty to keep it in sync! -static const uint8_t assert0[6] = { +static const uint8_t assert0[8] = { RESUME, RESUME_AT_FUNC_START, + CACHE, 0, LOAD_COMMON_CONSTANT, CONSTANT_ASSERTIONERROR, RAISE_VARARGS, 1 }; @@ -940,7 +941,7 @@ static const uint8_t assert0[6] = { static const uint8_t linetable[2] = { (1 << 7) // New entry. | (PY_CODE_LOCATION_INFO_NO_COLUMNS << 3) - | (3 - 1), // Three code units. + | (4 - 1), // Four code units. 0, // Offset from co_firstlineno. }; @@ -966,7 +967,7 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) if (filename_ob == NULL) { goto failed; } - code_ob = PyBytes_FromStringAndSize((const char *)assert0, 6); + code_ob = PyBytes_FromStringAndSize((const char *)assert0, 8); if (code_ob == NULL) { goto failed; } diff --git a/Objects/genobject.c b/Objects/genobject.c index 5088500fc4142b..9dece8a7700cab 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -454,6 +454,7 @@ is_resume(_Py_CODEUNIT *instr) return ( code == RESUME || code == RESUME_CHECK || + code == RESUME_CHECK_JIT || code == INSTRUMENTED_RESUME ); } diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index f808544045e153..1411eb1718b683 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -1,39 +1,39 @@ // Auto-generated by Programs/freeze_test_frozenmain.py unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0, - 0,0,0,0,0,243,184,0,0,0,128,0,94,0,82,1, - 73,0,116,0,94,0,82,1,73,4,116,1,93,2,33,0, - 82,2,52,1,0,0,0,0,0,0,31,0,93,2,33,0, - 82,3,93,0,80,6,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,52,2,0,0,0,0,0,0, - 31,0,93,1,80,8,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,33,0,52,0,0,0,0,0, - 0,0,82,4,44,26,0,0,0,0,0,0,0,0,0,0, - 116,5,82,7,16,0,70,24,0,0,116,6,93,2,33,0, - 82,5,93,6,12,0,82,6,93,5,93,6,44,26,0,0, - 0,0,0,0,0,0,0,0,12,0,50,4,52,1,0,0, - 0,0,0,0,31,0,75,26,0,0,9,0,30,0,82,1, - 35,0,41,8,233,0,0,0,0,78,122,18,70,114,111,122, - 101,110,32,72,101,108,108,111,32,87,111,114,108,100,122,8, - 115,121,115,46,97,114,103,118,218,6,99,111,110,102,105,103, - 122,7,99,111,110,102,105,103,32,122,2,58,32,41,5,218, - 12,112,114,111,103,114,97,109,95,110,97,109,101,218,10,101, - 120,101,99,117,116,97,98,108,101,218,15,117,115,101,95,101, - 110,118,105,114,111,110,109,101,110,116,218,17,99,111,110,102, - 105,103,117,114,101,95,99,95,115,116,100,105,111,218,14,98, - 117,102,102,101,114,101,100,95,115,116,100,105,111,41,7,218, - 3,115,121,115,218,17,95,116,101,115,116,105,110,116,101,114, - 110,97,108,99,97,112,105,218,5,112,114,105,110,116,218,4, - 97,114,103,118,218,11,103,101,116,95,99,111,110,102,105,103, - 115,114,3,0,0,0,218,3,107,101,121,169,0,243,0,0, - 0,0,218,18,116,101,115,116,95,102,114,111,122,101,110,109, - 97,105,110,46,112,121,218,8,60,109,111,100,117,108,101,62, - 114,18,0,0,0,1,0,0,0,115,94,0,0,0,240,3, - 1,1,1,243,8,0,1,11,219,0,24,225,0,5,208,6, - 26,212,0,27,217,0,5,128,106,144,35,151,40,145,40,212, - 0,27,216,9,26,215,9,38,210,9,38,211,9,40,168,24, - 213,9,50,128,6,243,2,6,12,2,128,67,241,14,0,5, - 10,136,71,144,67,144,53,152,2,152,54,160,35,157,59,152, - 45,208,10,40,214,4,41,243,15,6,12,2,114,16,0,0, - 0, + 0,0,0,0,0,243,186,0,0,0,128,0,0,0,94,0, + 82,1,73,0,116,0,94,0,82,1,73,4,116,1,93,2, + 33,0,82,2,52,1,0,0,0,0,0,0,31,0,93,2, + 33,0,82,3,93,0,80,6,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,52,2,0,0,0,0, + 0,0,31,0,93,1,80,8,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,33,0,52,0,0,0, + 0,0,0,0,82,4,44,26,0,0,0,0,0,0,0,0, + 0,0,116,5,82,7,16,0,70,24,0,0,116,6,93,2, + 33,0,82,5,93,6,12,0,82,6,93,5,93,6,44,26, + 0,0,0,0,0,0,0,0,0,0,12,0,50,4,52,1, + 0,0,0,0,0,0,31,0,75,26,0,0,9,0,30,0, + 82,1,35,0,41,8,233,0,0,0,0,78,122,18,70,114, + 111,122,101,110,32,72,101,108,108,111,32,87,111,114,108,100, + 122,8,115,121,115,46,97,114,103,118,218,6,99,111,110,102, + 105,103,122,7,99,111,110,102,105,103,32,122,2,58,32,41, + 5,218,12,112,114,111,103,114,97,109,95,110,97,109,101,218, + 10,101,120,101,99,117,116,97,98,108,101,218,15,117,115,101, + 95,101,110,118,105,114,111,110,109,101,110,116,218,17,99,111, + 110,102,105,103,117,114,101,95,99,95,115,116,100,105,111,218, + 14,98,117,102,102,101,114,101,100,95,115,116,100,105,111,41, + 7,218,3,115,121,115,218,17,95,116,101,115,116,105,110,116, + 101,114,110,97,108,99,97,112,105,218,5,112,114,105,110,116, + 218,4,97,114,103,118,218,11,103,101,116,95,99,111,110,102, + 105,103,115,114,3,0,0,0,218,3,107,101,121,169,0,243, + 0,0,0,0,218,18,116,101,115,116,95,102,114,111,122,101, + 110,109,97,105,110,46,112,121,218,8,60,109,111,100,117,108, + 101,62,114,18,0,0,0,1,0,0,0,115,94,0,0,0, + 241,3,1,1,1,243,8,0,1,11,219,0,24,225,0,5, + 208,6,26,212,0,27,217,0,5,128,106,144,35,151,40,145, + 40,212,0,27,216,9,26,215,9,38,210,9,38,211,9,40, + 168,24,213,9,50,128,6,243,2,6,12,2,128,67,241,14, + 0,5,10,136,71,144,67,144,53,152,2,152,54,160,35,157, + 59,152,45,208,10,40,214,4,41,243,15,6,12,2,114,16, + 0,0,0, }; diff --git a/Python/assemble.c b/Python/assemble.c index 8cc2d50a3227f8..7c08488092de63 100644 --- a/Python/assemble.c +++ b/Python/assemble.c @@ -669,7 +669,7 @@ makecode(_PyCompile_CodeUnitMetadata *umd, struct assembler *a, PyObject *const_ // The offset (in code units) of the END_SEND from the SEND in the `yield from` sequence. -#define END_SEND_OFFSET 5 +#define END_SEND_OFFSET 6 static int resolve_jump_offsets(instr_sequence *instrs) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index c26ba89b5ab9c8..eaa123f88507a7 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -148,8 +148,9 @@ dummy_func( pure inst(NOP, (--)) { } - family(RESUME, 0) = { + family(RESUME, 1) = { RESUME_CHECK, + RESUME_CHECK_JIT, }; macro(NOT_TAKEN) = NOP; @@ -171,12 +172,8 @@ dummy_func( } } - op(_QUICKEN_RESUME, (--)) { - #if ENABLE_SPECIALIZATION - if (tstate->tracing == 0 && this_instr->op.code == RESUME) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); - } - #endif /* ENABLE_SPECIALIZATION */ + tier1 op(_QUICKEN_RESUME, (counter/1 --)) { + _Py_Specialize_Resume(this_instr, tstate, frame); } tier1 op(_MAYBE_INSTRUMENT, (--)) { @@ -226,7 +223,11 @@ dummy_func( _QUICKEN_RESUME + _CHECK_PERIODIC_IF_NOT_YIELD_FROM; - inst(RESUME_CHECK, (--)) { + macro(RESUME_CHECK) = + unused/1 + + _RESUME_CHECK; + + op(_RESUME_CHECK, (--)) { #if defined(__EMSCRIPTEN__) DEOPT_IF(_Py_emscripten_signal_clock == 0); _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; @@ -241,6 +242,11 @@ dummy_func( #endif } + macro(RESUME_CHECK_JIT) = + unused/1 + + _RESUME_CHECK + + _JIT; + op(_MONITOR_RESUME, (--)) { int err = _Py_call_instrumentation( tstate, oparg == 0 ? PY_MONITORING_EVENT_PY_START : PY_MONITORING_EVENT_PY_RESUME, frame, this_instr); @@ -252,6 +258,7 @@ dummy_func( } macro(INSTRUMENTED_RESUME) = + unused/1 + _LOAD_BYTECODE + _MAYBE_INSTRUMENT + _CHECK_PERIODIC_IF_NOT_YIELD_FROM + @@ -3114,9 +3121,11 @@ dummy_func( tier1 op(_JIT, (--)) { #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT && + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { /* Back up over EXTENDED_ARGs so executor is inserted at the correct place */ _Py_CODEUNIT *insert_exec_at = this_instr; @@ -3124,7 +3133,8 @@ dummy_func( oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); if (succ) { ENTER_TRACING(); } @@ -3175,12 +3185,22 @@ dummy_func( tier1 inst(ENTER_EXECUTOR, (--)) { #ifdef _Py_TIER2 + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; if (IS_JIT_TRACING()) { + int og_opcode = executor->vm_data.opcode; + int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; + if (_PyJit_EnterExecutorShouldStopTracing(og_opcode)) { + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + opcode = og_opcode; + oparg = og_oparg; + DISPATCH_GOTO_NON_TRACING(); + } goto stop_tracing; } - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); diff --git a/Python/ceval.c b/Python/ceval.c index 950050a6027116..da41851e7448a6 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1095,7 +1095,8 @@ static const _Py_CODEUNIT _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS[] = { { .op.code = INTERPRETER_EXIT, .op.arg = 0 }, /* reached on return */ { .op.code = NOP, .op.arg = 0 }, { .op.code = INTERPRETER_EXIT, .op.arg = 0 }, /* reached on yield */ - { .op.code = RESUME, .op.arg = RESUME_OPARG_DEPTH1_MASK | RESUME_AT_FUNC_START } + { .op.code = RESUME, .op.arg = RESUME_OPARG_DEPTH1_MASK | RESUME_AT_FUNC_START }, + { .op.code = CACHE, .op.arg = 0 } /* RESUME's CACHE */ }; const _Py_CODEUNIT *_Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR = (_Py_CODEUNIT*)&_Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS; @@ -1371,7 +1372,7 @@ _PyTier2Interpreter( for (;;) { uopcode = next_uop->opcode; #ifdef Py_DEBUG - if (frame->lltrace >= 3) { + if (frame->lltrace >= 4) { dump_stack(frame, stack_pointer); printf(" cache=["); dump_cache_item(_tos_cache0, 0, current_cached_values); diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index f00913cd359c1e..e57bdd686dc338 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -93,8 +93,6 @@ break; } - /* _QUICKEN_RESUME is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ - /* _LOAD_BYTECODE is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ case _RESUME_CHECK_r00: { diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 30f0101d2ed0e3..a66d6ccff2d82d 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5691,12 +5691,22 @@ INSTRUCTION_STATS(ENTER_EXECUTOR); opcode = ENTER_EXECUTOR; #ifdef _Py_TIER2 + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; if (IS_JIT_TRACING()) { + int og_opcode = executor->vm_data.opcode; + int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; + if (_PyJit_EnterExecutorShouldStopTracing(og_opcode)) { + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + opcode = og_opcode; + oparg = og_oparg; + DISPATCH_GOTO_NON_TRACING(); + } JUMP_TO_LABEL(stop_tracing); } - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); @@ -7436,8 +7446,9 @@ _Py_CODEUNIT* const this_instr = next_instr; (void)this_instr; frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(INSTRUMENTED_RESUME); + /* Skip 1 cache entry */ // _LOAD_BYTECODE { #ifdef Py_GIL_DISABLED @@ -7785,16 +7796,19 @@ // _JIT { #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT && + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); if (succ) { ENTER_TRACING(); } @@ -10446,10 +10460,10 @@ (void)(opcode); #endif frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(RESUME); PREDICTED_RESUME:; - _Py_CODEUNIT* const this_instr = next_instr - 1; + _Py_CODEUNIT* const this_instr = next_instr - 2; (void)this_instr; // _LOAD_BYTECODE { @@ -10496,11 +10510,11 @@ } // _QUICKEN_RESUME { - #if ENABLE_SPECIALIZATION - if (tstate->tracing == 0 && this_instr->op.code == RESUME) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); - } - #endif /* ENABLE_SPECIALIZATION */ + uint16_t counter = read_u16(&this_instr[1].cache); + (void)counter; + _PyFrame_SetStackPointer(frame, stack_pointer); + _Py_Specialize_Resume(this_instr, tstate, frame); + stack_pointer = _PyFrame_GetStackPointer(frame); } // _CHECK_PERIODIC_IF_NOT_YIELD_FROM { @@ -10524,9 +10538,10 @@ _Py_CODEUNIT* const this_instr = next_instr; (void)this_instr; frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(RESUME_CHECK); - static_assert(0 == 0, "incorrect cache size"); + static_assert(1 == 1, "incorrect cache size"); + /* Skip 1 cache entry */ #if defined(__EMSCRIPTEN__) if (_Py_emscripten_signal_clock == 0) { UPDATE_MISS_STATS(RESUME); @@ -10554,6 +10569,76 @@ DISPATCH(); } + TARGET(RESUME_CHECK_JIT) { + #if _Py_TAIL_CALL_INTERP + int opcode = RESUME_CHECK_JIT; + (void)(opcode); + #endif + _Py_CODEUNIT* const this_instr = next_instr; + (void)this_instr; + frame->instr_ptr = next_instr; + next_instr += 2; + INSTRUCTION_STATS(RESUME_CHECK_JIT); + static_assert(1 == 1, "incorrect cache size"); + /* Skip 1 cache entry */ + // _RESUME_CHECK + { + #if defined(__EMSCRIPTEN__) + if (_Py_emscripten_signal_clock == 0) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + #endif + uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); + assert((version & _PY_EVAL_EVENTS_MASK) == 0); + if (eval_breaker != version) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #ifdef Py_GIL_DISABLED + if (frame->tlbc_index != + ((_PyThreadStateImpl *)tstate)->tlbc_index) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #endif + } + // _JIT + { + #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; + _Py_BackoffCounter counter = this_instr[1].counter; + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && + next_instr->op.code != ENTER_EXECUTOR) { + _Py_CODEUNIT *insert_exec_at = this_instr; + while (oparg > 255) { + oparg >>= 8; + insert_exec_at--; + } + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); + if (succ) { + ENTER_TRACING(); + } + else { + this_instr[1].counter = restart_backoff_counter(counter); + } + } + else { + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + #endif + } + DISPATCH(); + } + TARGET(RETURN_GENERATOR) { #if _Py_TAIL_CALL_INTERP int opcode = RETURN_GENERATOR; diff --git a/Python/instrumentation.c b/Python/instrumentation.c index b074d23277878b..1aed6769d217fe 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -576,6 +576,7 @@ sanity_check_instrumentation(PyCodeObject *code) CHECK(opcode != END_FOR); CHECK(opcode != RESUME); CHECK(opcode != RESUME_CHECK); + CHECK(opcode != RESUME_CHECK_JIT); CHECK(opcode != INSTRUMENTED_RESUME); if (!is_instrumented(opcode)) { CHECK(_PyOpcode_Deopt[opcode] == opcode); diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index f57c33feec2ac2..def462bacec176 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -198,6 +198,7 @@ static void *opcode_targets_table[256] = { &&TARGET_LOAD_SUPER_ATTR_ATTR, &&TARGET_LOAD_SUPER_ATTR_METHOD, &&TARGET_RESUME_CHECK, + &&TARGET_RESUME_CHECK_JIT, &&TARGET_SEND_GEN, &&TARGET_STORE_ATTR_INSTANCE_VALUE, &&TARGET_STORE_ATTR_SLOT, @@ -232,7 +233,6 @@ static void *opcode_targets_table[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_INSTRUMENTED_END_FOR, &&TARGET_INSTRUMENTED_POP_ITER, &&TARGET_INSTRUMENTED_END_SEND, @@ -472,7 +472,7 @@ static void *opcode_tracing_targets_table[256] = { &&TARGET_TRACE_RECORD, &&TARGET_TRACE_RECORD, &&TARGET_TRACE_RECORD, - &&_unknown_opcode, + &&TARGET_TRACE_RECORD, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, @@ -718,6 +718,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RERAISE(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESERVED(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME_CHECK(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME_CHECK_JIT(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RETURN_GENERATOR(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RETURN_VALUE(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_SEND(TAIL_CALL_PARAMS); @@ -959,6 +960,7 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = { [RESERVED] = _TAIL_CALL_RESERVED, [RESUME] = _TAIL_CALL_RESUME, [RESUME_CHECK] = _TAIL_CALL_RESUME_CHECK, + [RESUME_CHECK_JIT] = _TAIL_CALL_RESUME_CHECK_JIT, [RETURN_GENERATOR] = _TAIL_CALL_RETURN_GENERATOR, [RETURN_VALUE] = _TAIL_CALL_RETURN_VALUE, [SEND] = _TAIL_CALL_SEND, @@ -1007,7 +1009,6 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [213] = _TAIL_CALL_UNKNOWN_OPCODE, [214] = _TAIL_CALL_UNKNOWN_OPCODE, [215] = _TAIL_CALL_UNKNOWN_OPCODE, [216] = _TAIL_CALL_UNKNOWN_OPCODE, @@ -1217,6 +1218,7 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = { [RESERVED] = _TAIL_CALL_TRACE_RECORD, [RESUME] = _TAIL_CALL_TRACE_RECORD, [RESUME_CHECK] = _TAIL_CALL_TRACE_RECORD, + [RESUME_CHECK_JIT] = _TAIL_CALL_TRACE_RECORD, [RETURN_GENERATOR] = _TAIL_CALL_TRACE_RECORD, [RETURN_VALUE] = _TAIL_CALL_TRACE_RECORD, [SEND] = _TAIL_CALL_TRACE_RECORD, @@ -1265,7 +1267,6 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [213] = _TAIL_CALL_UNKNOWN_OPCODE, [214] = _TAIL_CALL_UNKNOWN_OPCODE, [215] = _TAIL_CALL_UNKNOWN_OPCODE, [216] = _TAIL_CALL_UNKNOWN_OPCODE, diff --git a/Python/optimizer.c b/Python/optimizer.c index a9e788d0dcb1d5..f350b82397f575 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -632,6 +632,12 @@ _PyJit_translate_single_bytecode_to_trace( target--; } + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; + opcode = executor->vm_data.opcode; + oparg = (oparg & ~255) | executor->vm_data.oparg; + } + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]] > 0) { uint16_t backoff = (this_instr + 1)->counter.value_and_backoff; // adaptive_counter_cooldown is a fresh specialization. @@ -823,6 +829,7 @@ _PyJit_translate_single_bytecode_to_trace( case RESUME: case RESUME_CHECK: + case RESUME_CHECK_JIT: /* Use a special tier 2 version of RESUME_CHECK to allow traces to * start with RESUME_CHECK */ ADD_TO_TRACE(_TIER2_RESUME_CHECK, 0, 0, target); @@ -1038,12 +1045,9 @@ _PyJit_TryInitializeTracing( _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)); + assert(curr_instr->op.code == JUMP_BACKWARD_JIT || curr_instr->op.code == RESUME_CHECK_JIT || (exit != NULL)); tracer->initial_state.jump_backward_instr = curr_instr; - if (_PyOpcode_Caches[_PyOpcode_Deopt[close_loop_instr->op.code]]) { - close_loop_instr[1].counter = trigger_backoff_counter(); - } tracer->is_tracing = true; return 1; } @@ -1063,7 +1067,12 @@ _PyJit_FinalizeTracing(PyThreadState *tstate, int err) tracer->initial_state.jump_backward_instr[1].counter = restart_backoff_counter(counter); } else { - tracer->initial_state.jump_backward_instr[1].counter = initial_jump_backoff_counter(&tstate->interp->opt_config); + if (tracer->initial_state.jump_backward_instr[0].op.code == JUMP_BACKWARD_JIT) { + tracer->initial_state.jump_backward_instr[1].counter = initial_jump_backoff_counter(&tstate->interp->opt_config); + } + else { + tracer->initial_state.jump_backward_instr[1].counter = initial_resume_backoff_counter(&tstate->interp->opt_config); + } } } else if (tracer->initial_state.executor->vm_data.valid) { @@ -1092,6 +1101,19 @@ _PyJit_FinalizeTracing(PyThreadState *tstate, int err) tracer->is_tracing = false; } +bool +_PyJit_EnterExecutorShouldStopTracing(int og_opcode) +{ + // Continue tracing (skip over the executor). If it's a RESUME + // trace to form longer, more optimizeable traces. + // We want to trace over RESUME traces. Otherwise, functions with lots of RESUME + // end up with many fragmented traces which perform badly. + // See for example, the richards benchmark in pyperformance. + // For consideration: We may want to consider tracing over side traces + // inserted into bytecode as well in the future. + return og_opcode == RESUME_CHECK_JIT; +} + void _PyJit_TracerFree(_PyThreadStateImpl *_tstate) { @@ -1780,7 +1802,7 @@ _Py_ExecutorDetach(_PyExecutorObject *executor) assert(instruction->op.code == ENTER_EXECUTOR); int index = instruction->op.arg; assert(code->co_executors->executors[index] == executor); - instruction->op.code = executor->vm_data.opcode; + instruction->op.code = _PyOpcode_Deopt[executor->vm_data.opcode]; instruction->op.arg = executor->vm_data.oparg; executor->vm_data.code = NULL; code->co_executors->executors[index] = NULL; diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 942a730e4faccf..52a0c08ac677b7 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -17,8 +17,6 @@ break; } - /* _QUICKEN_RESUME is not a viable micro-op for tier 2 */ - /* _LOAD_BYTECODE is not a viable micro-op for tier 2 */ case _RESUME_CHECK: { diff --git a/Python/pystate.c b/Python/pystate.c index fcb73b4dcefe1d..143175da0f45c7 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -607,11 +607,13 @@ init_interpreter(PyInterpreterState *interp, // Initialize optimization configuration from environment variables // PYTHON_JIT_STRESS sets aggressive defaults for testing, but can be overridden uint16_t jump_default = JUMP_BACKWARD_INITIAL_VALUE; + uint16_t resume_default = RESUME_INITIAL_VALUE; uint16_t side_exit_default = SIDE_EXIT_INITIAL_VALUE; if (is_env_enabled("PYTHON_JIT_STRESS")) { jump_default = 63; side_exit_default = 63; + resume_default = 127; } init_policy(&interp->opt_config.jump_backward_initial_value, @@ -620,6 +622,12 @@ init_interpreter(PyInterpreterState *interp, init_policy(&interp->opt_config.jump_backward_initial_backoff, "PYTHON_JIT_JUMP_BACKWARD_INITIAL_BACKOFF", JUMP_BACKWARD_INITIAL_BACKOFF, 0, MAX_BACKOFF); + init_policy(&interp->opt_config.resume_initial_value, + "PYTHON_JIT_RESUME_INITIAL_VALUE", + resume_default, 1, MAX_VALUE); + init_policy(&interp->opt_config.resume_initial_backoff, + "PYTHON_JIT_RESUME_INITIAL_BACKOFF", + RESUME_INITIAL_BACKOFF, 0, MAX_BACKOFF); init_policy(&interp->opt_config.side_exit_initial_value, "PYTHON_JIT_SIDE_EXIT_INITIAL_VALUE", side_exit_default, 1, MAX_VALUE); diff --git a/Python/specialize.c b/Python/specialize.c index 1eabdb1b5b194e..4ef8b27795650c 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -46,16 +46,18 @@ void _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters) { #if ENABLE_SPECIALIZATION - _Py_BackoffCounter jump_counter, adaptive_counter; + _Py_BackoffCounter jump_counter, adaptive_counter, resume_counter; if (enable_counters) { PyThreadState *tstate = _PyThreadState_GET(); PyInterpreterState *interp = tstate->interp; jump_counter = initial_jump_backoff_counter(&interp->opt_config); adaptive_counter = adaptive_counter_warmup(); + resume_counter = initial_resume_backoff_counter(&interp->opt_config); } else { jump_counter = initial_unreachable_backoff_counter(); adaptive_counter = initial_unreachable_backoff_counter(); + resume_counter = initial_unreachable_backoff_counter(); } int opcode = 0; int oparg = 0; @@ -70,6 +72,9 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters case JUMP_BACKWARD: instructions[i + 1].counter = jump_counter; break; + case RESUME: + instructions[i + 1].counter = resume_counter; + break; case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: case POP_JUMP_IF_NONE: @@ -2781,6 +2786,28 @@ _Py_Specialize_ContainsOp(_PyStackRef value_st, _Py_CODEUNIT *instr) return; } + +void +_Py_Specialize_Resume(_Py_CODEUNIT *instr, PyThreadState *tstate, _PyInterpreterFrame *frame) +{ + if (tstate->tracing == 0 && instr->op.code == RESUME) { + if (tstate->interp->jit) { + PyCodeObject *co = (PyCodeObject *)PyStackRef_AsPyObjectBorrow(frame->f_executable); + if (co != NULL && + PyCode_Check(co) && + (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) == 0) { + specialize(instr, RESUME_CHECK_JIT); + set_counter((_Py_BackoffCounter *)instr + 1, initial_resume_backoff_counter(&tstate->interp->opt_config)); + return; + } + } + specialize(instr, RESUME_CHECK); + return; + } + unspecialize(instr); + return; +} + #ifdef Py_STATS void _Py_GatherStats_GetIter(_PyStackRef iterable) @@ -2883,5 +2910,6 @@ const struct _PyCode8 _Py_InitCleanup = { EXIT_INIT_CHECK, 0, RETURN_VALUE, 0, RESUME, RESUME_AT_FUNC_START, + CACHE, 0, /* RESUME's cache */ } };