diff --git a/Include/internal/pycore_list.h b/Include/internal/pycore_list.h index 5c66d76a0d6e7f..ffbcebdb7dfb50 100644 --- a/Include/internal/pycore_list.h +++ b/Include/internal/pycore_list.h @@ -13,10 +13,13 @@ extern "C" { #endif PyAPI_FUNC(PyObject*) _PyList_Extend(PyListObject *, PyObject *); +PyAPI_FUNC(PyObject) *_PyList_SliceSubscript(PyObject*, PyObject*); extern void _PyList_DebugMallocStats(FILE *out); // _PyList_GetItemRef should be used only when the object is known as a list // because it doesn't raise TypeError when the object is not a list, whereas PyList_GetItemRef does. extern PyObject* _PyList_GetItemRef(PyListObject *, Py_ssize_t i); + + #ifdef Py_GIL_DISABLED // Returns -1 in case of races with other threads. extern int _PyList_GetItemRefNoLock(PyListObject *, Py_ssize_t, _PyStackRef *); diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 521f7a92cf08c4..ce4cf9353589ef 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -57,6 +57,8 @@ int _PyOpcode_num_popped(int opcode, int oparg) { return 2; case BINARY_OP_SUBSCR_LIST_INT: return 2; + case BINARY_OP_SUBSCR_LIST_SLICE: + return 2; case BINARY_OP_SUBSCR_STR_INT: return 2; case BINARY_OP_SUBSCR_TUPLE_INT: @@ -536,6 +538,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg) { return 0; case BINARY_OP_SUBSCR_LIST_INT: return 1; + case BINARY_OP_SUBSCR_LIST_SLICE: + return 1; case BINARY_OP_SUBSCR_STR_INT: return 1; case BINARY_OP_SUBSCR_TUPLE_INT: @@ -1072,6 +1076,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[266] = { [BINARY_OP_SUBSCR_DICT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [BINARY_OP_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG }, [BINARY_OP_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_OP_SUBSCR_LIST_SLICE] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG }, [BINARY_OP_SUBSCR_STR_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG }, [BINARY_OP_SUBSCR_TUPLE_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, [BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, @@ -1319,6 +1324,7 @@ _PyOpcode_macro_expansion[256] = { [BINARY_OP_SUBSCR_DICT] = { .nuops = 2, .uops = { { _GUARD_NOS_DICT, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_DICT, OPARG_SIMPLE, 5 } } }, [BINARY_OP_SUBSCR_GETITEM] = { .nuops = 4, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_CHECK_FUNC, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_INIT_CALL, OPARG_SIMPLE, 5 }, { _PUSH_FRAME, OPARG_SIMPLE, 5 } } }, [BINARY_OP_SUBSCR_LIST_INT] = { .nuops = 3, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_LIST_INT, OPARG_SIMPLE, 5 } } }, + [BINARY_OP_SUBSCR_LIST_SLICE] = { .nuops = 3, .uops = { { _GUARD_TOS_SLICE, OPARG_SIMPLE, 0 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_LIST_SLICE, OPARG_SIMPLE, 5 } } }, [BINARY_OP_SUBSCR_STR_INT] = { .nuops = 3, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_UNICODE, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_STR_INT, OPARG_SIMPLE, 5 } } }, [BINARY_OP_SUBSCR_TUPLE_INT] = { .nuops = 3, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_TUPLE, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_TUPLE_INT, OPARG_SIMPLE, 5 } } }, [BINARY_OP_SUBTRACT_FLOAT] = { .nuops = 3, .uops = { { _GUARD_TOS_FLOAT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_FLOAT, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBTRACT_FLOAT, OPARG_SIMPLE, 5 } } }, @@ -1505,6 +1511,7 @@ const char *_PyOpcode_OpName[266] = { [BINARY_OP_SUBSCR_DICT] = "BINARY_OP_SUBSCR_DICT", [BINARY_OP_SUBSCR_GETITEM] = "BINARY_OP_SUBSCR_GETITEM", [BINARY_OP_SUBSCR_LIST_INT] = "BINARY_OP_SUBSCR_LIST_INT", + [BINARY_OP_SUBSCR_LIST_SLICE] = "BINARY_OP_SUBSCR_LIST_SLICE", [BINARY_OP_SUBSCR_STR_INT] = "BINARY_OP_SUBSCR_STR_INT", [BINARY_OP_SUBSCR_TUPLE_INT] = "BINARY_OP_SUBSCR_TUPLE_INT", [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT", @@ -1770,6 +1777,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [BINARY_OP_SUBSCR_DICT] = BINARY_OP, [BINARY_OP_SUBSCR_GETITEM] = BINARY_OP, [BINARY_OP_SUBSCR_LIST_INT] = BINARY_OP, + [BINARY_OP_SUBSCR_LIST_SLICE] = BINARY_OP, [BINARY_OP_SUBSCR_STR_INT] = BINARY_OP, [BINARY_OP_SUBSCR_TUPLE_INT] = BINARY_OP, [BINARY_OP_SUBTRACT_FLOAT] = BINARY_OP, @@ -1997,7 +2005,6 @@ const uint8_t _PyOpcode_Deopt[256] = { case 125: \ case 126: \ case 127: \ - case 211: \ case 212: \ case 213: \ case 214: \ diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index e9a536919da598..4dd2afc5292c44 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -23,134 +23,136 @@ extern "C" { #define _BINARY_OP_SUBSCR_DICT 311 #define _BINARY_OP_SUBSCR_INIT_CALL 312 #define _BINARY_OP_SUBSCR_LIST_INT 313 -#define _BINARY_OP_SUBSCR_STR_INT 314 -#define _BINARY_OP_SUBSCR_TUPLE_INT 315 -#define _BINARY_OP_SUBTRACT_FLOAT 316 -#define _BINARY_OP_SUBTRACT_INT 317 -#define _BINARY_SLICE 318 +#define _BINARY_OP_SUBSCR_LIST_SLICE 314 +#define _BINARY_OP_SUBSCR_STR_INT 315 +#define _BINARY_OP_SUBSCR_TUPLE_INT 316 +#define _BINARY_OP_SUBTRACT_FLOAT 317 +#define _BINARY_OP_SUBTRACT_INT 318 +#define _BINARY_SLICE 319 #define _BUILD_LIST BUILD_LIST #define _BUILD_MAP BUILD_MAP #define _BUILD_SET BUILD_SET #define _BUILD_SLICE BUILD_SLICE #define _BUILD_STRING BUILD_STRING #define _BUILD_TUPLE BUILD_TUPLE -#define _CALL_BUILTIN_CLASS 319 -#define _CALL_BUILTIN_FAST 320 -#define _CALL_BUILTIN_FAST_WITH_KEYWORDS 321 -#define _CALL_BUILTIN_O 322 +#define _CALL_BUILTIN_CLASS 320 +#define _CALL_BUILTIN_FAST 321 +#define _CALL_BUILTIN_FAST_WITH_KEYWORDS 322 +#define _CALL_BUILTIN_O 323 #define _CALL_INTRINSIC_1 CALL_INTRINSIC_1 #define _CALL_INTRINSIC_2 CALL_INTRINSIC_2 #define _CALL_ISINSTANCE CALL_ISINSTANCE -#define _CALL_KW_NON_PY 323 +#define _CALL_KW_NON_PY 324 #define _CALL_LEN CALL_LEN #define _CALL_LIST_APPEND CALL_LIST_APPEND -#define _CALL_METHOD_DESCRIPTOR_FAST 324 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 325 -#define _CALL_METHOD_DESCRIPTOR_NOARGS 326 -#define _CALL_METHOD_DESCRIPTOR_O 327 -#define _CALL_NON_PY_GENERAL 328 -#define _CALL_STR_1 329 -#define _CALL_TUPLE_1 330 +#define _CALL_METHOD_DESCRIPTOR_FAST 325 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 326 +#define _CALL_METHOD_DESCRIPTOR_NOARGS 327 +#define _CALL_METHOD_DESCRIPTOR_O 328 +#define _CALL_NON_PY_GENERAL 329 +#define _CALL_STR_1 330 +#define _CALL_TUPLE_1 331 #define _CALL_TYPE_1 CALL_TYPE_1 -#define _CHECK_AND_ALLOCATE_OBJECT 331 -#define _CHECK_ATTR_CLASS 332 -#define _CHECK_ATTR_METHOD_LAZY_DICT 333 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 334 +#define _CHECK_AND_ALLOCATE_OBJECT 332 +#define _CHECK_ATTR_CLASS 333 +#define _CHECK_ATTR_METHOD_LAZY_DICT 334 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 335 #define _CHECK_EG_MATCH CHECK_EG_MATCH #define _CHECK_EXC_MATCH CHECK_EXC_MATCH -#define _CHECK_FUNCTION 335 -#define _CHECK_FUNCTION_EXACT_ARGS 336 -#define _CHECK_FUNCTION_VERSION 337 -#define _CHECK_FUNCTION_VERSION_INLINE 338 -#define _CHECK_FUNCTION_VERSION_KW 339 -#define _CHECK_IS_NOT_PY_CALLABLE 340 -#define _CHECK_IS_NOT_PY_CALLABLE_KW 341 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES 342 -#define _CHECK_METHOD_VERSION 343 -#define _CHECK_METHOD_VERSION_KW 344 -#define _CHECK_PEP_523 345 -#define _CHECK_PERIODIC 346 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 347 -#define _CHECK_STACK_SPACE 348 -#define _CHECK_STACK_SPACE_OPERAND 349 -#define _CHECK_VALIDITY 350 -#define _COMPARE_OP 351 -#define _COMPARE_OP_FLOAT 352 -#define _COMPARE_OP_INT 353 -#define _COMPARE_OP_STR 354 -#define _CONTAINS_OP 355 -#define _CONTAINS_OP_DICT 356 -#define _CONTAINS_OP_SET 357 +#define _CHECK_FUNCTION 336 +#define _CHECK_FUNCTION_EXACT_ARGS 337 +#define _CHECK_FUNCTION_VERSION 338 +#define _CHECK_FUNCTION_VERSION_INLINE 339 +#define _CHECK_FUNCTION_VERSION_KW 340 +#define _CHECK_IS_NOT_PY_CALLABLE 341 +#define _CHECK_IS_NOT_PY_CALLABLE_KW 342 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES 343 +#define _CHECK_METHOD_VERSION 344 +#define _CHECK_METHOD_VERSION_KW 345 +#define _CHECK_PEP_523 346 +#define _CHECK_PERIODIC 347 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 348 +#define _CHECK_STACK_SPACE 349 +#define _CHECK_STACK_SPACE_OPERAND 350 +#define _CHECK_VALIDITY 351 +#define _COMPARE_OP 352 +#define _COMPARE_OP_FLOAT 353 +#define _COMPARE_OP_INT 354 +#define _COMPARE_OP_STR 355 +#define _CONTAINS_OP 356 +#define _CONTAINS_OP_DICT 357 +#define _CONTAINS_OP_SET 358 #define _CONVERT_VALUE CONVERT_VALUE #define _COPY COPY #define _COPY_FREE_VARS COPY_FREE_VARS -#define _CREATE_INIT_FRAME 358 +#define _CREATE_INIT_FRAME 359 #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 359 +#define _DEOPT 360 #define _DICT_MERGE DICT_MERGE #define _DICT_UPDATE DICT_UPDATE -#define _DO_CALL 360 -#define _DO_CALL_FUNCTION_EX 361 -#define _DO_CALL_KW 362 +#define _DO_CALL 361 +#define _DO_CALL_FUNCTION_EX 362 +#define _DO_CALL_KW 363 #define _END_FOR END_FOR #define _END_SEND END_SEND -#define _ERROR_POP_N 363 +#define _ERROR_POP_N 364 #define _EXIT_INIT_CHECK EXIT_INIT_CHECK -#define _EXPAND_METHOD 364 -#define _EXPAND_METHOD_KW 365 -#define _FATAL_ERROR 366 +#define _EXPAND_METHOD 365 +#define _EXPAND_METHOD_KW 366 +#define _FATAL_ERROR 367 #define _FORMAT_SIMPLE FORMAT_SIMPLE #define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC -#define _FOR_ITER 367 -#define _FOR_ITER_GEN_FRAME 368 -#define _FOR_ITER_TIER_TWO 369 +#define _FOR_ITER 368 +#define _FOR_ITER_GEN_FRAME 369 +#define _FOR_ITER_TIER_TWO 370 #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 370 -#define _GUARD_DORV_NO_DICT 371 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 372 -#define _GUARD_GLOBALS_VERSION 373 -#define _GUARD_IS_FALSE_POP 374 -#define _GUARD_IS_NONE_POP 375 -#define _GUARD_IS_NOT_NONE_POP 376 -#define _GUARD_IS_TRUE_POP 377 -#define _GUARD_KEYS_VERSION 378 -#define _GUARD_NOS_DICT 379 -#define _GUARD_NOS_FLOAT 380 -#define _GUARD_NOS_INT 381 -#define _GUARD_NOS_LIST 382 -#define _GUARD_NOS_TUPLE 383 -#define _GUARD_NOS_UNICODE 384 -#define _GUARD_NOT_EXHAUSTED_LIST 385 -#define _GUARD_NOT_EXHAUSTED_RANGE 386 -#define _GUARD_NOT_EXHAUSTED_TUPLE 387 -#define _GUARD_TOS_ANY_SET 388 -#define _GUARD_TOS_DICT 389 -#define _GUARD_TOS_FLOAT 390 -#define _GUARD_TOS_INT 391 -#define _GUARD_TOS_LIST 392 -#define _GUARD_TOS_TUPLE 393 -#define _GUARD_TOS_UNICODE 394 -#define _GUARD_TYPE_VERSION 395 -#define _GUARD_TYPE_VERSION_AND_LOCK 396 +#define _GUARD_BINARY_OP_EXTEND 371 +#define _GUARD_DORV_NO_DICT 372 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 373 +#define _GUARD_GLOBALS_VERSION 374 +#define _GUARD_IS_FALSE_POP 375 +#define _GUARD_IS_NONE_POP 376 +#define _GUARD_IS_NOT_NONE_POP 377 +#define _GUARD_IS_TRUE_POP 378 +#define _GUARD_KEYS_VERSION 379 +#define _GUARD_NOS_DICT 380 +#define _GUARD_NOS_FLOAT 381 +#define _GUARD_NOS_INT 382 +#define _GUARD_NOS_LIST 383 +#define _GUARD_NOS_TUPLE 384 +#define _GUARD_NOS_UNICODE 385 +#define _GUARD_NOT_EXHAUSTED_LIST 386 +#define _GUARD_NOT_EXHAUSTED_RANGE 387 +#define _GUARD_NOT_EXHAUSTED_TUPLE 388 +#define _GUARD_TOS_ANY_SET 389 +#define _GUARD_TOS_DICT 390 +#define _GUARD_TOS_FLOAT 391 +#define _GUARD_TOS_INT 392 +#define _GUARD_TOS_LIST 393 +#define _GUARD_TOS_SLICE 394 +#define _GUARD_TOS_TUPLE 395 +#define _GUARD_TOS_UNICODE 396 +#define _GUARD_TYPE_VERSION 397 +#define _GUARD_TYPE_VERSION_AND_LOCK 398 #define _IMPORT_FROM IMPORT_FROM #define _IMPORT_NAME IMPORT_NAME -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 397 -#define _INIT_CALL_PY_EXACT_ARGS 398 -#define _INIT_CALL_PY_EXACT_ARGS_0 399 -#define _INIT_CALL_PY_EXACT_ARGS_1 400 -#define _INIT_CALL_PY_EXACT_ARGS_2 401 -#define _INIT_CALL_PY_EXACT_ARGS_3 402 -#define _INIT_CALL_PY_EXACT_ARGS_4 403 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 399 +#define _INIT_CALL_PY_EXACT_ARGS 400 +#define _INIT_CALL_PY_EXACT_ARGS_0 401 +#define _INIT_CALL_PY_EXACT_ARGS_1 402 +#define _INIT_CALL_PY_EXACT_ARGS_2 403 +#define _INIT_CALL_PY_EXACT_ARGS_3 404 +#define _INIT_CALL_PY_EXACT_ARGS_4 405 #define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER #define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION #define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD @@ -160,163 +162,163 @@ 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 404 +#define _IS_NONE 406 #define _IS_OP IS_OP -#define _ITER_CHECK_LIST 405 -#define _ITER_CHECK_RANGE 406 -#define _ITER_CHECK_TUPLE 407 -#define _ITER_JUMP_LIST 408 -#define _ITER_JUMP_RANGE 409 -#define _ITER_JUMP_TUPLE 410 -#define _ITER_NEXT_LIST 411 -#define _ITER_NEXT_LIST_TIER_TWO 412 -#define _ITER_NEXT_RANGE 413 -#define _ITER_NEXT_TUPLE 414 -#define _JUMP_TO_TOP 415 +#define _ITER_CHECK_LIST 407 +#define _ITER_CHECK_RANGE 408 +#define _ITER_CHECK_TUPLE 409 +#define _ITER_JUMP_LIST 410 +#define _ITER_JUMP_RANGE 411 +#define _ITER_JUMP_TUPLE 412 +#define _ITER_NEXT_LIST 413 +#define _ITER_NEXT_LIST_TIER_TWO 414 +#define _ITER_NEXT_RANGE 415 +#define _ITER_NEXT_TUPLE 416 +#define _JUMP_TO_TOP 417 #define _LIST_APPEND LIST_APPEND #define _LIST_EXTEND LIST_EXTEND -#define _LOAD_ATTR 416 -#define _LOAD_ATTR_CLASS 417 +#define _LOAD_ATTR 418 +#define _LOAD_ATTR_CLASS 419 #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN -#define _LOAD_ATTR_INSTANCE_VALUE 418 -#define _LOAD_ATTR_METHOD_LAZY_DICT 419 -#define _LOAD_ATTR_METHOD_NO_DICT 420 -#define _LOAD_ATTR_METHOD_WITH_VALUES 421 -#define _LOAD_ATTR_MODULE 422 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 423 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 424 -#define _LOAD_ATTR_PROPERTY_FRAME 425 -#define _LOAD_ATTR_SLOT 426 -#define _LOAD_ATTR_WITH_HINT 427 +#define _LOAD_ATTR_INSTANCE_VALUE 420 +#define _LOAD_ATTR_METHOD_LAZY_DICT 421 +#define _LOAD_ATTR_METHOD_NO_DICT 422 +#define _LOAD_ATTR_METHOD_WITH_VALUES 423 +#define _LOAD_ATTR_MODULE 424 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 425 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 426 +#define _LOAD_ATTR_PROPERTY_FRAME 427 +#define _LOAD_ATTR_SLOT 428 +#define _LOAD_ATTR_WITH_HINT 429 #define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS -#define _LOAD_BYTECODE 428 +#define _LOAD_BYTECODE 430 #define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT #define _LOAD_CONST LOAD_CONST #define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL -#define _LOAD_CONST_INLINE 429 -#define _LOAD_CONST_INLINE_BORROW 430 +#define _LOAD_CONST_INLINE 431 +#define _LOAD_CONST_INLINE_BORROW 432 #define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL #define _LOAD_DEREF LOAD_DEREF -#define _LOAD_FAST 431 -#define _LOAD_FAST_0 432 -#define _LOAD_FAST_1 433 -#define _LOAD_FAST_2 434 -#define _LOAD_FAST_3 435 -#define _LOAD_FAST_4 436 -#define _LOAD_FAST_5 437 -#define _LOAD_FAST_6 438 -#define _LOAD_FAST_7 439 +#define _LOAD_FAST 433 +#define _LOAD_FAST_0 434 +#define _LOAD_FAST_1 435 +#define _LOAD_FAST_2 436 +#define _LOAD_FAST_3 437 +#define _LOAD_FAST_4 438 +#define _LOAD_FAST_5 439 +#define _LOAD_FAST_6 440 +#define _LOAD_FAST_7 441 #define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR -#define _LOAD_FAST_BORROW 440 -#define _LOAD_FAST_BORROW_0 441 -#define _LOAD_FAST_BORROW_1 442 -#define _LOAD_FAST_BORROW_2 443 -#define _LOAD_FAST_BORROW_3 444 -#define _LOAD_FAST_BORROW_4 445 -#define _LOAD_FAST_BORROW_5 446 -#define _LOAD_FAST_BORROW_6 447 -#define _LOAD_FAST_BORROW_7 448 +#define _LOAD_FAST_BORROW 442 +#define _LOAD_FAST_BORROW_0 443 +#define _LOAD_FAST_BORROW_1 444 +#define _LOAD_FAST_BORROW_2 445 +#define _LOAD_FAST_BORROW_3 446 +#define _LOAD_FAST_BORROW_4 447 +#define _LOAD_FAST_BORROW_5 448 +#define _LOAD_FAST_BORROW_6 449 +#define _LOAD_FAST_BORROW_7 450 #define _LOAD_FAST_BORROW_LOAD_FAST_BORROW LOAD_FAST_BORROW_LOAD_FAST_BORROW #define _LOAD_FAST_CHECK LOAD_FAST_CHECK #define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST #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 449 -#define _LOAD_GLOBAL_BUILTINS 450 -#define _LOAD_GLOBAL_MODULE 451 +#define _LOAD_GLOBAL 451 +#define _LOAD_GLOBAL_BUILTINS 452 +#define _LOAD_GLOBAL_MODULE 453 #define _LOAD_LOCALS LOAD_LOCALS #define _LOAD_NAME LOAD_NAME -#define _LOAD_SMALL_INT 452 -#define _LOAD_SMALL_INT_0 453 -#define _LOAD_SMALL_INT_1 454 -#define _LOAD_SMALL_INT_2 455 -#define _LOAD_SMALL_INT_3 456 +#define _LOAD_SMALL_INT 454 +#define _LOAD_SMALL_INT_0 455 +#define _LOAD_SMALL_INT_1 456 +#define _LOAD_SMALL_INT_2 457 +#define _LOAD_SMALL_INT_3 458 #define _LOAD_SPECIAL LOAD_SPECIAL #define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR #define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD -#define _MAKE_CALLARGS_A_TUPLE 457 +#define _MAKE_CALLARGS_A_TUPLE 459 #define _MAKE_CELL MAKE_CELL #define _MAKE_FUNCTION MAKE_FUNCTION -#define _MAKE_WARM 458 +#define _MAKE_WARM 460 #define _MAP_ADD MAP_ADD #define _MATCH_CLASS MATCH_CLASS #define _MATCH_KEYS MATCH_KEYS #define _MATCH_MAPPING MATCH_MAPPING #define _MATCH_SEQUENCE MATCH_SEQUENCE -#define _MAYBE_EXPAND_METHOD 459 -#define _MAYBE_EXPAND_METHOD_KW 460 -#define _MONITOR_CALL 461 -#define _MONITOR_CALL_KW 462 -#define _MONITOR_JUMP_BACKWARD 463 -#define _MONITOR_RESUME 464 +#define _MAYBE_EXPAND_METHOD 461 +#define _MAYBE_EXPAND_METHOD_KW 462 +#define _MONITOR_CALL 463 +#define _MONITOR_CALL_KW 464 +#define _MONITOR_JUMP_BACKWARD 465 +#define _MONITOR_RESUME 466 #define _NOP NOP #define _POP_EXCEPT POP_EXCEPT -#define _POP_JUMP_IF_FALSE 465 -#define _POP_JUMP_IF_TRUE 466 +#define _POP_JUMP_IF_FALSE 467 +#define _POP_JUMP_IF_TRUE 468 #define _POP_TOP POP_TOP -#define _POP_TOP_LOAD_CONST_INLINE 467 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 468 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 469 +#define _POP_TOP_LOAD_CONST_INLINE 469 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 470 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW 471 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 470 +#define _PUSH_FRAME 472 #define _PUSH_NULL PUSH_NULL -#define _PUSH_NULL_CONDITIONAL 471 -#define _PY_FRAME_GENERAL 472 -#define _PY_FRAME_KW 473 -#define _QUICKEN_RESUME 474 -#define _REPLACE_WITH_TRUE 475 +#define _PUSH_NULL_CONDITIONAL 473 +#define _PY_FRAME_GENERAL 474 +#define _PY_FRAME_KW 475 +#define _QUICKEN_RESUME 476 +#define _REPLACE_WITH_TRUE 477 #define _RESUME_CHECK RESUME_CHECK #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 476 -#define _SEND 477 -#define _SEND_GEN_FRAME 478 +#define _SAVE_RETURN_OFFSET 478 +#define _SEND 479 +#define _SEND_GEN_FRAME 480 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _START_EXECUTOR 479 -#define _STORE_ATTR 480 -#define _STORE_ATTR_INSTANCE_VALUE 481 -#define _STORE_ATTR_SLOT 482 -#define _STORE_ATTR_WITH_HINT 483 +#define _START_EXECUTOR 481 +#define _STORE_ATTR 482 +#define _STORE_ATTR_INSTANCE_VALUE 483 +#define _STORE_ATTR_SLOT 484 +#define _STORE_ATTR_WITH_HINT 485 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 484 -#define _STORE_FAST_0 485 -#define _STORE_FAST_1 486 -#define _STORE_FAST_2 487 -#define _STORE_FAST_3 488 -#define _STORE_FAST_4 489 -#define _STORE_FAST_5 490 -#define _STORE_FAST_6 491 -#define _STORE_FAST_7 492 +#define _STORE_FAST 486 +#define _STORE_FAST_0 487 +#define _STORE_FAST_1 488 +#define _STORE_FAST_2 489 +#define _STORE_FAST_3 490 +#define _STORE_FAST_4 491 +#define _STORE_FAST_5 492 +#define _STORE_FAST_6 493 +#define _STORE_FAST_7 494 #define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST #define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 493 -#define _STORE_SUBSCR 494 -#define _STORE_SUBSCR_DICT 495 -#define _STORE_SUBSCR_LIST_INT 496 +#define _STORE_SLICE 495 +#define _STORE_SUBSCR 496 +#define _STORE_SUBSCR_DICT 497 +#define _STORE_SUBSCR_LIST_INT 498 #define _SWAP SWAP -#define _TIER2_RESUME_CHECK 497 -#define _TO_BOOL 498 +#define _TIER2_RESUME_CHECK 499 +#define _TO_BOOL 500 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 499 +#define _TO_BOOL_LIST 501 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 500 +#define _TO_BOOL_STR 502 #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 501 -#define _UNPACK_SEQUENCE_LIST 502 -#define _UNPACK_SEQUENCE_TUPLE 503 -#define _UNPACK_SEQUENCE_TWO_TUPLE 504 +#define _UNPACK_SEQUENCE 503 +#define _UNPACK_SEQUENCE_LIST 504 +#define _UNPACK_SEQUENCE_TUPLE 505 +#define _UNPACK_SEQUENCE_TWO_TUPLE 506 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 504 +#define MAX_UOP_ID 506 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index ab26543a26fa98..28d09debf3a4ee 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -74,6 +74,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { [_TO_BOOL_INT] = HAS_EXIT_FLAG | HAS_ESCAPES_FLAG, [_GUARD_NOS_LIST] = HAS_EXIT_FLAG, [_GUARD_TOS_LIST] = HAS_EXIT_FLAG, + [_GUARD_TOS_SLICE] = HAS_EXIT_FLAG, [_TO_BOOL_LIST] = 0, [_TO_BOOL_NONE] = HAS_EXIT_FLAG, [_GUARD_NOS_UNICODE] = HAS_EXIT_FLAG, @@ -98,6 +99,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { [_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_BINARY_OP_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, + [_BINARY_OP_SUBSCR_LIST_SLICE] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, [_BINARY_OP_SUBSCR_STR_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, [_GUARD_NOS_TUPLE] = HAS_EXIT_FLAG, [_GUARD_TOS_TUPLE] = HAS_EXIT_FLAG, @@ -320,6 +322,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_BINARY_OP_SUBSCR_DICT] = "_BINARY_OP_SUBSCR_DICT", [_BINARY_OP_SUBSCR_INIT_CALL] = "_BINARY_OP_SUBSCR_INIT_CALL", [_BINARY_OP_SUBSCR_LIST_INT] = "_BINARY_OP_SUBSCR_LIST_INT", + [_BINARY_OP_SUBSCR_LIST_SLICE] = "_BINARY_OP_SUBSCR_LIST_SLICE", [_BINARY_OP_SUBSCR_STR_INT] = "_BINARY_OP_SUBSCR_STR_INT", [_BINARY_OP_SUBSCR_TUPLE_INT] = "_BINARY_OP_SUBSCR_TUPLE_INT", [_BINARY_OP_SUBTRACT_FLOAT] = "_BINARY_OP_SUBTRACT_FLOAT", @@ -432,6 +435,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_GUARD_TOS_FLOAT] = "_GUARD_TOS_FLOAT", [_GUARD_TOS_INT] = "_GUARD_TOS_INT", [_GUARD_TOS_LIST] = "_GUARD_TOS_LIST", + [_GUARD_TOS_SLICE] = "_GUARD_TOS_SLICE", [_GUARD_TOS_TUPLE] = "_GUARD_TOS_TUPLE", [_GUARD_TOS_UNICODE] = "_GUARD_TOS_UNICODE", [_GUARD_TYPE_VERSION] = "_GUARD_TYPE_VERSION", @@ -700,6 +704,8 @@ int _PyUop_num_popped(int opcode, int oparg) return 0; case _GUARD_TOS_LIST: return 0; + case _GUARD_TOS_SLICE: + return 0; case _TO_BOOL_LIST: return 1; case _TO_BOOL_NONE: @@ -748,6 +754,8 @@ int _PyUop_num_popped(int opcode, int oparg) return 4; case _BINARY_OP_SUBSCR_LIST_INT: return 2; + case _BINARY_OP_SUBSCR_LIST_SLICE: + return 2; case _BINARY_OP_SUBSCR_STR_INT: return 2; case _GUARD_NOS_TUPLE: diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h index 898dc580f4148e..ee6c2b318d9413 100644 --- a/Include/opcode_ids.h +++ b/Include/opcode_ids.h @@ -139,79 +139,80 @@ extern "C" { #define BINARY_OP_SUBSCR_DICT 135 #define BINARY_OP_SUBSCR_GETITEM 136 #define BINARY_OP_SUBSCR_LIST_INT 137 -#define BINARY_OP_SUBSCR_STR_INT 138 -#define BINARY_OP_SUBSCR_TUPLE_INT 139 -#define BINARY_OP_SUBTRACT_FLOAT 140 -#define BINARY_OP_SUBTRACT_INT 141 -#define CALL_ALLOC_AND_ENTER_INIT 142 -#define CALL_BOUND_METHOD_EXACT_ARGS 143 -#define CALL_BOUND_METHOD_GENERAL 144 -#define CALL_BUILTIN_CLASS 145 -#define CALL_BUILTIN_FAST 146 -#define CALL_BUILTIN_FAST_WITH_KEYWORDS 147 -#define CALL_BUILTIN_O 148 -#define CALL_ISINSTANCE 149 -#define CALL_KW_BOUND_METHOD 150 -#define CALL_KW_NON_PY 151 -#define CALL_KW_PY 152 -#define CALL_LEN 153 -#define CALL_LIST_APPEND 154 -#define CALL_METHOD_DESCRIPTOR_FAST 155 -#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 156 -#define CALL_METHOD_DESCRIPTOR_NOARGS 157 -#define CALL_METHOD_DESCRIPTOR_O 158 -#define CALL_NON_PY_GENERAL 159 -#define CALL_PY_EXACT_ARGS 160 -#define CALL_PY_GENERAL 161 -#define CALL_STR_1 162 -#define CALL_TUPLE_1 163 -#define CALL_TYPE_1 164 -#define COMPARE_OP_FLOAT 165 -#define COMPARE_OP_INT 166 -#define COMPARE_OP_STR 167 -#define CONTAINS_OP_DICT 168 -#define CONTAINS_OP_SET 169 -#define FOR_ITER_GEN 170 -#define FOR_ITER_LIST 171 -#define FOR_ITER_RANGE 172 -#define FOR_ITER_TUPLE 173 -#define JUMP_BACKWARD_JIT 174 -#define JUMP_BACKWARD_NO_JIT 175 -#define LOAD_ATTR_CLASS 176 -#define LOAD_ATTR_CLASS_WITH_METACLASS_CHECK 177 -#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 178 -#define LOAD_ATTR_INSTANCE_VALUE 179 -#define LOAD_ATTR_METHOD_LAZY_DICT 180 -#define LOAD_ATTR_METHOD_NO_DICT 181 -#define LOAD_ATTR_METHOD_WITH_VALUES 182 -#define LOAD_ATTR_MODULE 183 -#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 184 -#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 185 -#define LOAD_ATTR_PROPERTY 186 -#define LOAD_ATTR_SLOT 187 -#define LOAD_ATTR_WITH_HINT 188 -#define LOAD_CONST_IMMORTAL 189 -#define LOAD_CONST_MORTAL 190 -#define LOAD_GLOBAL_BUILTIN 191 -#define LOAD_GLOBAL_MODULE 192 -#define LOAD_SUPER_ATTR_ATTR 193 -#define LOAD_SUPER_ATTR_METHOD 194 -#define RESUME_CHECK 195 -#define SEND_GEN 196 -#define STORE_ATTR_INSTANCE_VALUE 197 -#define STORE_ATTR_SLOT 198 -#define STORE_ATTR_WITH_HINT 199 -#define STORE_SUBSCR_DICT 200 -#define STORE_SUBSCR_LIST_INT 201 -#define TO_BOOL_ALWAYS_TRUE 202 -#define TO_BOOL_BOOL 203 -#define TO_BOOL_INT 204 -#define TO_BOOL_LIST 205 -#define TO_BOOL_NONE 206 -#define TO_BOOL_STR 207 -#define UNPACK_SEQUENCE_LIST 208 -#define UNPACK_SEQUENCE_TUPLE 209 -#define UNPACK_SEQUENCE_TWO_TUPLE 210 +#define BINARY_OP_SUBSCR_LIST_SLICE 138 +#define BINARY_OP_SUBSCR_STR_INT 139 +#define BINARY_OP_SUBSCR_TUPLE_INT 140 +#define BINARY_OP_SUBTRACT_FLOAT 141 +#define BINARY_OP_SUBTRACT_INT 142 +#define CALL_ALLOC_AND_ENTER_INIT 143 +#define CALL_BOUND_METHOD_EXACT_ARGS 144 +#define CALL_BOUND_METHOD_GENERAL 145 +#define CALL_BUILTIN_CLASS 146 +#define CALL_BUILTIN_FAST 147 +#define CALL_BUILTIN_FAST_WITH_KEYWORDS 148 +#define CALL_BUILTIN_O 149 +#define CALL_ISINSTANCE 150 +#define CALL_KW_BOUND_METHOD 151 +#define CALL_KW_NON_PY 152 +#define CALL_KW_PY 153 +#define CALL_LEN 154 +#define CALL_LIST_APPEND 155 +#define CALL_METHOD_DESCRIPTOR_FAST 156 +#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 157 +#define CALL_METHOD_DESCRIPTOR_NOARGS 158 +#define CALL_METHOD_DESCRIPTOR_O 159 +#define CALL_NON_PY_GENERAL 160 +#define CALL_PY_EXACT_ARGS 161 +#define CALL_PY_GENERAL 162 +#define CALL_STR_1 163 +#define CALL_TUPLE_1 164 +#define CALL_TYPE_1 165 +#define COMPARE_OP_FLOAT 166 +#define COMPARE_OP_INT 167 +#define COMPARE_OP_STR 168 +#define CONTAINS_OP_DICT 169 +#define CONTAINS_OP_SET 170 +#define FOR_ITER_GEN 171 +#define FOR_ITER_LIST 172 +#define FOR_ITER_RANGE 173 +#define FOR_ITER_TUPLE 174 +#define JUMP_BACKWARD_JIT 175 +#define JUMP_BACKWARD_NO_JIT 176 +#define LOAD_ATTR_CLASS 177 +#define LOAD_ATTR_CLASS_WITH_METACLASS_CHECK 178 +#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 179 +#define LOAD_ATTR_INSTANCE_VALUE 180 +#define LOAD_ATTR_METHOD_LAZY_DICT 181 +#define LOAD_ATTR_METHOD_NO_DICT 182 +#define LOAD_ATTR_METHOD_WITH_VALUES 183 +#define LOAD_ATTR_MODULE 184 +#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 185 +#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 186 +#define LOAD_ATTR_PROPERTY 187 +#define LOAD_ATTR_SLOT 188 +#define LOAD_ATTR_WITH_HINT 189 +#define LOAD_CONST_IMMORTAL 190 +#define LOAD_CONST_MORTAL 191 +#define LOAD_GLOBAL_BUILTIN 192 +#define LOAD_GLOBAL_MODULE 193 +#define LOAD_SUPER_ATTR_ATTR 194 +#define LOAD_SUPER_ATTR_METHOD 195 +#define RESUME_CHECK 196 +#define SEND_GEN 197 +#define STORE_ATTR_INSTANCE_VALUE 198 +#define STORE_ATTR_SLOT 199 +#define STORE_ATTR_WITH_HINT 200 +#define STORE_SUBSCR_DICT 201 +#define STORE_SUBSCR_LIST_INT 202 +#define TO_BOOL_ALWAYS_TRUE 203 +#define TO_BOOL_BOOL 204 +#define TO_BOOL_INT 205 +#define TO_BOOL_LIST 206 +#define TO_BOOL_NONE 207 +#define TO_BOOL_STR 208 +#define UNPACK_SEQUENCE_LIST 209 +#define UNPACK_SEQUENCE_TUPLE 210 +#define UNPACK_SEQUENCE_TWO_TUPLE 211 #define INSTRUMENTED_END_FOR 234 #define INSTRUMENTED_POP_ITER 235 #define INSTRUMENTED_END_SEND 236 diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py index 15900265a01270..cb2225e11b14dc 100644 --- a/Lib/_opcode_metadata.py +++ b/Lib/_opcode_metadata.py @@ -27,6 +27,7 @@ "BINARY_OP_SUBTRACT_FLOAT", "BINARY_OP_ADD_UNICODE", "BINARY_OP_SUBSCR_LIST_INT", + "BINARY_OP_SUBSCR_LIST_SLICE", "BINARY_OP_SUBSCR_TUPLE_INT", "BINARY_OP_SUBSCR_STR_INT", "BINARY_OP_SUBSCR_DICT", @@ -133,79 +134,80 @@ 'BINARY_OP_SUBSCR_DICT': 135, 'BINARY_OP_SUBSCR_GETITEM': 136, 'BINARY_OP_SUBSCR_LIST_INT': 137, - 'BINARY_OP_SUBSCR_STR_INT': 138, - 'BINARY_OP_SUBSCR_TUPLE_INT': 139, - 'BINARY_OP_SUBTRACT_FLOAT': 140, - 'BINARY_OP_SUBTRACT_INT': 141, - 'CALL_ALLOC_AND_ENTER_INIT': 142, - 'CALL_BOUND_METHOD_EXACT_ARGS': 143, - 'CALL_BOUND_METHOD_GENERAL': 144, - 'CALL_BUILTIN_CLASS': 145, - 'CALL_BUILTIN_FAST': 146, - 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 147, - 'CALL_BUILTIN_O': 148, - 'CALL_ISINSTANCE': 149, - 'CALL_KW_BOUND_METHOD': 150, - 'CALL_KW_NON_PY': 151, - 'CALL_KW_PY': 152, - 'CALL_LEN': 153, - 'CALL_LIST_APPEND': 154, - 'CALL_METHOD_DESCRIPTOR_FAST': 155, - 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 156, - 'CALL_METHOD_DESCRIPTOR_NOARGS': 157, - 'CALL_METHOD_DESCRIPTOR_O': 158, - 'CALL_NON_PY_GENERAL': 159, - 'CALL_PY_EXACT_ARGS': 160, - 'CALL_PY_GENERAL': 161, - 'CALL_STR_1': 162, - 'CALL_TUPLE_1': 163, - 'CALL_TYPE_1': 164, - 'COMPARE_OP_FLOAT': 165, - 'COMPARE_OP_INT': 166, - 'COMPARE_OP_STR': 167, - 'CONTAINS_OP_DICT': 168, - 'CONTAINS_OP_SET': 169, - 'FOR_ITER_GEN': 170, - 'FOR_ITER_LIST': 171, - 'FOR_ITER_RANGE': 172, - 'FOR_ITER_TUPLE': 173, - 'JUMP_BACKWARD_JIT': 174, - 'JUMP_BACKWARD_NO_JIT': 175, - 'LOAD_ATTR_CLASS': 176, - 'LOAD_ATTR_CLASS_WITH_METACLASS_CHECK': 177, - 'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 178, - 'LOAD_ATTR_INSTANCE_VALUE': 179, - 'LOAD_ATTR_METHOD_LAZY_DICT': 180, - 'LOAD_ATTR_METHOD_NO_DICT': 181, - 'LOAD_ATTR_METHOD_WITH_VALUES': 182, - 'LOAD_ATTR_MODULE': 183, - 'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 184, - 'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 185, - 'LOAD_ATTR_PROPERTY': 186, - 'LOAD_ATTR_SLOT': 187, - 'LOAD_ATTR_WITH_HINT': 188, - 'LOAD_CONST_IMMORTAL': 189, - 'LOAD_CONST_MORTAL': 190, - 'LOAD_GLOBAL_BUILTIN': 191, - 'LOAD_GLOBAL_MODULE': 192, - 'LOAD_SUPER_ATTR_ATTR': 193, - 'LOAD_SUPER_ATTR_METHOD': 194, - 'RESUME_CHECK': 195, - 'SEND_GEN': 196, - 'STORE_ATTR_INSTANCE_VALUE': 197, - 'STORE_ATTR_SLOT': 198, - 'STORE_ATTR_WITH_HINT': 199, - 'STORE_SUBSCR_DICT': 200, - 'STORE_SUBSCR_LIST_INT': 201, - 'TO_BOOL_ALWAYS_TRUE': 202, - 'TO_BOOL_BOOL': 203, - 'TO_BOOL_INT': 204, - 'TO_BOOL_LIST': 205, - 'TO_BOOL_NONE': 206, - 'TO_BOOL_STR': 207, - 'UNPACK_SEQUENCE_LIST': 208, - 'UNPACK_SEQUENCE_TUPLE': 209, - 'UNPACK_SEQUENCE_TWO_TUPLE': 210, + 'BINARY_OP_SUBSCR_LIST_SLICE': 138, + 'BINARY_OP_SUBSCR_STR_INT': 139, + 'BINARY_OP_SUBSCR_TUPLE_INT': 140, + 'BINARY_OP_SUBTRACT_FLOAT': 141, + 'BINARY_OP_SUBTRACT_INT': 142, + 'CALL_ALLOC_AND_ENTER_INIT': 143, + 'CALL_BOUND_METHOD_EXACT_ARGS': 144, + 'CALL_BOUND_METHOD_GENERAL': 145, + 'CALL_BUILTIN_CLASS': 146, + 'CALL_BUILTIN_FAST': 147, + 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 148, + 'CALL_BUILTIN_O': 149, + 'CALL_ISINSTANCE': 150, + 'CALL_KW_BOUND_METHOD': 151, + 'CALL_KW_NON_PY': 152, + 'CALL_KW_PY': 153, + 'CALL_LEN': 154, + 'CALL_LIST_APPEND': 155, + 'CALL_METHOD_DESCRIPTOR_FAST': 156, + 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 157, + 'CALL_METHOD_DESCRIPTOR_NOARGS': 158, + 'CALL_METHOD_DESCRIPTOR_O': 159, + 'CALL_NON_PY_GENERAL': 160, + 'CALL_PY_EXACT_ARGS': 161, + 'CALL_PY_GENERAL': 162, + 'CALL_STR_1': 163, + 'CALL_TUPLE_1': 164, + 'CALL_TYPE_1': 165, + 'COMPARE_OP_FLOAT': 166, + 'COMPARE_OP_INT': 167, + 'COMPARE_OP_STR': 168, + 'CONTAINS_OP_DICT': 169, + 'CONTAINS_OP_SET': 170, + 'FOR_ITER_GEN': 171, + 'FOR_ITER_LIST': 172, + 'FOR_ITER_RANGE': 173, + 'FOR_ITER_TUPLE': 174, + 'JUMP_BACKWARD_JIT': 175, + 'JUMP_BACKWARD_NO_JIT': 176, + 'LOAD_ATTR_CLASS': 177, + 'LOAD_ATTR_CLASS_WITH_METACLASS_CHECK': 178, + 'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 179, + 'LOAD_ATTR_INSTANCE_VALUE': 180, + 'LOAD_ATTR_METHOD_LAZY_DICT': 181, + 'LOAD_ATTR_METHOD_NO_DICT': 182, + 'LOAD_ATTR_METHOD_WITH_VALUES': 183, + 'LOAD_ATTR_MODULE': 184, + 'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 185, + 'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 186, + 'LOAD_ATTR_PROPERTY': 187, + 'LOAD_ATTR_SLOT': 188, + 'LOAD_ATTR_WITH_HINT': 189, + 'LOAD_CONST_IMMORTAL': 190, + 'LOAD_CONST_MORTAL': 191, + 'LOAD_GLOBAL_BUILTIN': 192, + 'LOAD_GLOBAL_MODULE': 193, + 'LOAD_SUPER_ATTR_ATTR': 194, + 'LOAD_SUPER_ATTR_METHOD': 195, + 'RESUME_CHECK': 196, + 'SEND_GEN': 197, + 'STORE_ATTR_INSTANCE_VALUE': 198, + 'STORE_ATTR_SLOT': 199, + 'STORE_ATTR_WITH_HINT': 200, + 'STORE_SUBSCR_DICT': 201, + 'STORE_SUBSCR_LIST_INT': 202, + 'TO_BOOL_ALWAYS_TRUE': 203, + 'TO_BOOL_BOOL': 204, + 'TO_BOOL_INT': 205, + 'TO_BOOL_LIST': 206, + 'TO_BOOL_NONE': 207, + 'TO_BOOL_STR': 208, + 'UNPACK_SEQUENCE_LIST': 209, + 'UNPACK_SEQUENCE_TUPLE': 210, + 'UNPACK_SEQUENCE_TWO_TUPLE': 211, } opmap = { diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-17-11-40-13.gh-issue-100239.9RxIxY.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-17-11-40-13.gh-issue-100239.9RxIxY.rst new file mode 100644 index 00000000000000..87ff6836b82f71 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-17-11-40-13.gh-issue-100239.9RxIxY.rst @@ -0,0 +1 @@ +Add specialisation for ``BINARY_OP/SUBSCR`` on list and slice. diff --git a/Objects/listobject.c b/Objects/listobject.c index 12d5b33414a92a..31768eb5a915b2 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -3597,6 +3597,24 @@ list_slice_wrap(PyListObject *aa, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t return res; } +static inline PyObject* +list_slice_subscript(PyObject* self, PyObject* item) +{ + assert(PyList_Check(self)); + assert(PySlice_Check(item)); + Py_ssize_t start, stop, step; + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { + return NULL; + } + return list_slice_wrap((PyListObject *)self, start, stop, step); +} + +PyObject * +_PyList_SliceSubscript(PyObject* _self, PyObject* item) +{ + return list_slice_subscript(_self, item); +} + static PyObject * list_subscript(PyObject* _self, PyObject* item) { @@ -3611,11 +3629,7 @@ list_subscript(PyObject* _self, PyObject* item) return list_item((PyObject *)self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step; - if (PySlice_Unpack(item, &start, &stop, &step) < 0) { - return NULL; - } - return list_slice_wrap(self, start, stop, step); + return list_slice_subscript(_self, item); } else { PyErr_Format(PyExc_TypeError, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 95786c91371e98..503f58207846b6 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -518,6 +518,11 @@ dummy_func( EXIT_IF(!PyList_CheckExact(o)); } + op(_GUARD_TOS_SLICE, (tos -- tos)) { + PyObject *o = PyStackRef_AsPyObjectBorrow(tos); + EXIT_IF(!PySlice_Check(o)); + } + macro(TO_BOOL_LIST) = _GUARD_TOS_LIST + unused/1 + unused/2 + _TO_BOOL_LIST; op(_TO_BOOL_LIST, (value -- res)) { @@ -590,6 +595,7 @@ dummy_func( BINARY_OP_SUBTRACT_FLOAT, BINARY_OP_ADD_UNICODE, BINARY_OP_SUBSCR_LIST_INT, + BINARY_OP_SUBSCR_LIST_SLICE, BINARY_OP_SUBSCR_TUPLE_INT, BINARY_OP_SUBSCR_STR_INT, BINARY_OP_SUBSCR_DICT, @@ -899,6 +905,24 @@ dummy_func( DECREF_INPUTS(); } + macro(BINARY_OP_SUBSCR_LIST_SLICE) = + _GUARD_TOS_SLICE + _GUARD_NOS_LIST + unused/5 + _BINARY_OP_SUBSCR_LIST_SLICE; + + op(_BINARY_OP_SUBSCR_LIST_SLICE, (list_st, sub_st -- res)) { + PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); + PyObject *list = PyStackRef_AsPyObjectBorrow(list_st); + + assert(PySlice_Check(sub)); + assert(PyList_CheckExact(list)); + + PyObject *res_o = _PyList_SliceSubscript(list, sub); + DEOPT_IF(res_o == NULL); + STAT_INC(BINARY_OP, hit); + res = PyStackRef_FromPyObjectSteal(res_o); + STAT_INC(BINARY_OP, hit); + DECREF_INPUTS(); + } + macro(BINARY_OP_SUBSCR_STR_INT) = _GUARD_TOS_INT + _GUARD_NOS_UNICODE + unused/5 + _BINARY_OP_SUBSCR_STR_INT; diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 9bfb13e2d9773f..3df65a39595815 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -741,6 +741,17 @@ break; } + case _GUARD_TOS_SLICE: { + _PyStackRef tos; + tos = stack_pointer[-1]; + PyObject *o = PyStackRef_AsPyObjectBorrow(tos); + if (!PySlice_Check(o)) { + UOP_STAT_INC(uopcode, miss); + JUMP_TO_JUMP_TARGET(); + } + break; + } + case _TO_BOOL_LIST: { _PyStackRef value; _PyStackRef res; @@ -1325,6 +1336,41 @@ break; } + case _BINARY_OP_SUBSCR_LIST_SLICE: { + _PyStackRef sub_st; + _PyStackRef list_st; + _PyStackRef res; + sub_st = stack_pointer[-1]; + list_st = stack_pointer[-2]; + PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); + PyObject *list = PyStackRef_AsPyObjectBorrow(list_st); + assert(PySlice_Check(sub)); + assert(PyList_CheckExact(list)); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyObject *res_o = _PyList_SliceSubscript(list, sub); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (res_o == NULL) { + UOP_STAT_INC(uopcode, miss); + JUMP_TO_JUMP_TARGET(); + } + STAT_INC(BINARY_OP, hit); + res = PyStackRef_FromPyObjectSteal(res_o); + STAT_INC(BINARY_OP, hit); + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyStackRef tmp = list_st; + list_st = res; + stack_pointer[-2] = list_st; + PyStackRef_CLOSE(tmp); + tmp = sub_st; + sub_st = PyStackRef_NULL; + stack_pointer[-1] = sub_st; + PyStackRef_CLOSE(tmp); + stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + break; + } + case _BINARY_OP_SUBSCR_STR_INT: { _PyStackRef sub_st; _PyStackRef str_st; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 6fe647d6197a07..358c0741479b62 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -763,6 +763,78 @@ DISPATCH(); } + TARGET(BINARY_OP_SUBSCR_LIST_SLICE) { + #if Py_TAIL_CALL_INTERP + int opcode = BINARY_OP_SUBSCR_LIST_SLICE; + (void)(opcode); + #endif + _Py_CODEUNIT* const this_instr = next_instr; + (void)this_instr; + frame->instr_ptr = next_instr; + next_instr += 6; + INSTRUCTION_STATS(BINARY_OP_SUBSCR_LIST_SLICE); + static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size"); + _PyStackRef tos; + _PyStackRef nos; + _PyStackRef list_st; + _PyStackRef sub_st; + _PyStackRef res; + // _GUARD_TOS_SLICE + { + tos = stack_pointer[-1]; + PyObject *o = PyStackRef_AsPyObjectBorrow(tos); + if (!PySlice_Check(o)) { + UPDATE_MISS_STATS(BINARY_OP); + assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); + JUMP_TO_PREDICTED(BINARY_OP); + } + } + // _GUARD_NOS_LIST + { + nos = stack_pointer[-2]; + PyObject *o = PyStackRef_AsPyObjectBorrow(nos); + if (!PyList_CheckExact(o)) { + UPDATE_MISS_STATS(BINARY_OP); + assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); + JUMP_TO_PREDICTED(BINARY_OP); + } + } + /* Skip 5 cache entries */ + // _BINARY_OP_SUBSCR_LIST_SLICE + { + sub_st = tos; + list_st = nos; + PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); + PyObject *list = PyStackRef_AsPyObjectBorrow(list_st); + assert(PySlice_Check(sub)); + assert(PyList_CheckExact(list)); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyObject *res_o = _PyList_SliceSubscript(list, sub); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (res_o == NULL) { + UPDATE_MISS_STATS(BINARY_OP); + assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); + JUMP_TO_PREDICTED(BINARY_OP); + } + STAT_INC(BINARY_OP, hit); + res = PyStackRef_FromPyObjectSteal(res_o); + STAT_INC(BINARY_OP, hit); + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyStackRef tmp = list_st; + list_st = res; + stack_pointer[-2] = list_st; + PyStackRef_CLOSE(tmp); + tmp = sub_st; + sub_st = PyStackRef_NULL; + stack_pointer[-1] = sub_st; + PyStackRef_CLOSE(tmp); + stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + } + DISPATCH(); + } + TARGET(BINARY_OP_SUBSCR_STR_INT) { #if Py_TAIL_CALL_INTERP int opcode = BINARY_OP_SUBSCR_STR_INT; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 5b9fb794c6bddc..cc0a7cc3382753 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -138,6 +138,7 @@ static void *opcode_targets[256] = { &&TARGET_BINARY_OP_SUBSCR_DICT, &&TARGET_BINARY_OP_SUBSCR_GETITEM, &&TARGET_BINARY_OP_SUBSCR_LIST_INT, + &&TARGET_BINARY_OP_SUBSCR_LIST_SLICE, &&TARGET_BINARY_OP_SUBSCR_STR_INT, &&TARGET_BINARY_OP_SUBSCR_TUPLE_INT, &&TARGET_BINARY_OP_SUBTRACT_FLOAT, @@ -233,7 +234,6 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_INSTRUMENTED_END_FOR, &&TARGET_INSTRUMENTED_POP_ITER, &&TARGET_INSTRUMENTED_END_SEND, @@ -280,6 +280,7 @@ Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_MULTIPLY_INT(TAIL_CALL Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_DICT(TAIL_CALL_PARAMS); Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_GETITEM(TAIL_CALL_PARAMS); Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_LIST_INT(TAIL_CALL_PARAMS); +Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_LIST_SLICE(TAIL_CALL_PARAMS); Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_STR_INT(TAIL_CALL_PARAMS); Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_TUPLE_INT(TAIL_CALL_PARAMS); Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBTRACT_FLOAT(TAIL_CALL_PARAMS); @@ -516,6 +517,7 @@ static py_tail_call_funcptr INSTRUCTION_TABLE[256] = { [BINARY_OP_SUBSCR_DICT] = _TAIL_CALL_BINARY_OP_SUBSCR_DICT, [BINARY_OP_SUBSCR_GETITEM] = _TAIL_CALL_BINARY_OP_SUBSCR_GETITEM, [BINARY_OP_SUBSCR_LIST_INT] = _TAIL_CALL_BINARY_OP_SUBSCR_LIST_INT, + [BINARY_OP_SUBSCR_LIST_SLICE] = _TAIL_CALL_BINARY_OP_SUBSCR_LIST_SLICE, [BINARY_OP_SUBSCR_STR_INT] = _TAIL_CALL_BINARY_OP_SUBSCR_STR_INT, [BINARY_OP_SUBSCR_TUPLE_INT] = _TAIL_CALL_BINARY_OP_SUBSCR_TUPLE_INT, [BINARY_OP_SUBTRACT_FLOAT] = _TAIL_CALL_BINARY_OP_SUBTRACT_FLOAT, @@ -738,7 +740,6 @@ static py_tail_call_funcptr INSTRUCTION_TABLE[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [211] = _TAIL_CALL_UNKNOWN_OPCODE, [212] = _TAIL_CALL_UNKNOWN_OPCODE, [213] = _TAIL_CALL_UNKNOWN_OPCODE, [214] = _TAIL_CALL_UNKNOWN_OPCODE, diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 6a20cef906242b..27a9f3df1be008 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -215,6 +215,10 @@ break; } + case _GUARD_TOS_SLICE: { + break; + } + case _TO_BOOL_LIST: { JitOptSymbol *value; JitOptSymbol *res; @@ -586,6 +590,15 @@ break; } + case _BINARY_OP_SUBSCR_LIST_SLICE: { + JitOptSymbol *res; + res = sym_new_not_null(ctx); + stack_pointer[-2] = res; + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + break; + } + case _BINARY_OP_SUBSCR_STR_INT: { JitOptSymbol *res; res = sym_new_type(ctx, &PyUnicode_Type); diff --git a/Python/specialize.c b/Python/specialize.c index ceb396c5b54815..79bb11e8421f35 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -2652,6 +2652,10 @@ _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *in specialize(instr, BINARY_OP_SUBSCR_DICT); return; } + if (PyList_CheckExact(lhs) && PySlice_Check(rhs)) { + specialize(instr, BINARY_OP_SUBSCR_LIST_SLICE); + return; + } unsigned int tp_version; PyTypeObject *container_type = Py_TYPE(lhs); PyObject *descriptor = _PyType_LookupRefAndVersion(container_type, &_Py_ID(__getitem__), &tp_version);