diff options
author | Mark Shannon <mark@hotpy.org> | 2024-08-16 16:11:24 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-16 16:11:24 (GMT) |
commit | c13e7d98fb8581014a225b900b1b88ccbfc28097 (patch) | |
tree | 2b27e6bbae922f421fbbae0fb761492031752b8a /Include | |
parent | e2f2dc708eae89f41e328501b5ea7c97b8e39907 (diff) | |
download | cpython-c13e7d98fb8581014a225b900b1b88ccbfc28097.zip cpython-c13e7d98fb8581014a225b900b1b88ccbfc28097.tar.gz cpython-c13e7d98fb8581014a225b900b1b88ccbfc28097.tar.bz2 |
GH-118093: Specialize `CALL_KW` (GH-123006)
Diffstat (limited to 'Include')
-rw-r--r-- | Include/internal/pycore_code.h | 3 | ||||
-rw-r--r-- | Include/internal/pycore_magic_number.h | 3 | ||||
-rw-r--r-- | Include/internal/pycore_opcode_metadata.h | 32 | ||||
-rw-r--r-- | Include/internal/pycore_uop_ids.h | 298 | ||||
-rw-r--r-- | Include/internal/pycore_uop_metadata.h | 24 | ||||
-rw-r--r-- | Include/opcode_ids.h | 109 |
6 files changed, 264 insertions, 205 deletions
diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 67aeab2..2e76e9f 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -156,6 +156,7 @@ typedef struct { } _PyCallCache; #define INLINE_CACHE_ENTRIES_CALL CACHE_ENTRIES(_PyCallCache) +#define INLINE_CACHE_ENTRIES_CALL_KW CACHE_ENTRIES(_PyCallCache) typedef struct { _Py_BackoffCounter counter; @@ -335,6 +336,8 @@ extern void _Py_Specialize_StoreSubscr(_PyStackRef container, _PyStackRef sub, _Py_CODEUNIT *instr); extern void _Py_Specialize_Call(_PyStackRef callable, _Py_CODEUNIT *instr, int nargs); +extern void _Py_Specialize_CallKw(_PyStackRef callable, _Py_CODEUNIT *instr, + int nargs); extern void _Py_Specialize_BinaryOp(_PyStackRef lhs, _PyStackRef rhs, _Py_CODEUNIT *instr, int oparg, _PyStackRef *locals); extern void _Py_Specialize_CompareOp(_PyStackRef lhs, _PyStackRef rhs, diff --git a/Include/internal/pycore_magic_number.h b/Include/internal/pycore_magic_number.h index 0af6e3f..095eb0f 100644 --- a/Include/internal/pycore_magic_number.h +++ b/Include/internal/pycore_magic_number.h @@ -257,6 +257,7 @@ Known values: Python 3.14a1 3603 (Remove BUILD_CONST_KEY_MAP) Python 3.14a1 3604 (Do not duplicate test at end of while statements) Python 3.14a1 3605 (Move ENTER_EXECUTOR to opcode 255) + Python 3.14a1 3606 (Specialize CALL_KW) Python 3.15 will start with 3650 @@ -269,7 +270,7 @@ PC/launcher.c must also be updated. */ -#define PYC_MAGIC_NUMBER 3605 +#define PYC_MAGIC_NUMBER 3606 /* 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 a39d239..8e38855 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -105,6 +105,12 @@ int _PyOpcode_num_popped(int opcode, int oparg) { return 2 + oparg; case CALL_KW: return 3 + oparg; + case CALL_KW_BOUND_METHOD: + return 3 + oparg; + case CALL_KW_NON_PY: + return 3 + oparg; + case CALL_KW_PY: + return 3 + oparg; case CALL_LEN: return 2 + oparg; case CALL_LIST_APPEND: @@ -554,6 +560,12 @@ int _PyOpcode_num_pushed(int opcode, int oparg) { return 1; case CALL_KW: return 1; + case CALL_KW_BOUND_METHOD: + return 0; + case CALL_KW_NON_PY: + return 1; + case CALL_KW_PY: + return 0; case CALL_LEN: return 1; case CALL_LIST_APPEND: @@ -1027,7 +1039,10 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[264] = { [CALL_INTRINSIC_1] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [CALL_INTRINSIC_2] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [CALL_ISINSTANCE] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, - [CALL_KW] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_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 }, + [CALL_KW_BOUND_METHOD] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_KW_NON_PY] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_KW_PY] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [CALL_LEN] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [CALL_LIST_APPEND] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, [CALL_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, @@ -1084,7 +1099,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[264] = { [IMPORT_NAME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_CALL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_CALL_FUNCTION_EX] = { true, INSTR_FMT_IX, 0 }, - [INSTRUMENTED_CALL_KW] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_CALL_KW] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_END_FOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG }, [INSTRUMENTED_END_SEND] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG }, [INSTRUMENTED_FOR_ITER] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, @@ -1255,6 +1270,9 @@ _PyOpcode_macro_expansion[256] = { [CALL_INTRINSIC_1] = { .nuops = 1, .uops = { { _CALL_INTRINSIC_1, 0, 0 } } }, [CALL_INTRINSIC_2] = { .nuops = 1, .uops = { { _CALL_INTRINSIC_2, 0, 0 } } }, [CALL_ISINSTANCE] = { .nuops = 1, .uops = { { _CALL_ISINSTANCE, 0, 0 } } }, + [CALL_KW_BOUND_METHOD] = { .nuops = 6, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_METHOD_VERSION_KW, 2, 1 }, { _EXPAND_METHOD_KW, 0, 0 }, { _PY_FRAME_KW, 0, 0 }, { _SAVE_RETURN_OFFSET, 7, 3 }, { _PUSH_FRAME, 0, 0 } } }, + [CALL_KW_NON_PY] = { .nuops = 3, .uops = { { _CHECK_IS_NOT_PY_CALLABLE_KW, 0, 0 }, { _CALL_KW_NON_PY, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_KW_PY] = { .nuops = 5, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_FUNCTION_VERSION_KW, 2, 1 }, { _PY_FRAME_KW, 0, 0 }, { _SAVE_RETURN_OFFSET, 7, 3 }, { _PUSH_FRAME, 0, 0 } } }, [CALL_LEN] = { .nuops = 1, .uops = { { _CALL_LEN, 0, 0 } } }, [CALL_LIST_APPEND] = { .nuops = 1, .uops = { { _CALL_LIST_APPEND, 0, 0 } } }, [CALL_METHOD_DESCRIPTOR_FAST] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, @@ -1436,6 +1454,9 @@ const char *_PyOpcode_OpName[264] = { [CALL_INTRINSIC_2] = "CALL_INTRINSIC_2", [CALL_ISINSTANCE] = "CALL_ISINSTANCE", [CALL_KW] = "CALL_KW", + [CALL_KW_BOUND_METHOD] = "CALL_KW_BOUND_METHOD", + [CALL_KW_NON_PY] = "CALL_KW_NON_PY", + [CALL_KW_PY] = "CALL_KW_PY", [CALL_LEN] = "CALL_LEN", [CALL_LIST_APPEND] = "CALL_LIST_APPEND", [CALL_METHOD_DESCRIPTOR_FAST] = "CALL_METHOD_DESCRIPTOR_FAST", @@ -1643,6 +1664,7 @@ const uint8_t _PyOpcode_Caches[256] = { [POP_JUMP_IF_NOT_NONE] = 1, [FOR_ITER] = 1, [CALL] = 3, + [CALL_KW] = 3, [BINARY_OP] = 1, }; #endif @@ -1686,6 +1708,9 @@ const uint8_t _PyOpcode_Deopt[256] = { [CALL_INTRINSIC_2] = CALL_INTRINSIC_2, [CALL_ISINSTANCE] = CALL, [CALL_KW] = CALL_KW, + [CALL_KW_BOUND_METHOD] = CALL_KW, + [CALL_KW_NON_PY] = CALL_KW, + [CALL_KW_PY] = CALL_KW, [CALL_LEN] = CALL, [CALL_LIST_APPEND] = CALL, [CALL_METHOD_DESCRIPTOR_FAST] = CALL, @@ -1898,9 +1923,6 @@ const uint8_t _PyOpcode_Deopt[256] = { case 146: \ case 147: \ case 148: \ - case 223: \ - case 224: \ - case 225: \ case 226: \ case 227: \ case 228: \ diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index 74c7cc9..2a25514 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -42,41 +42,45 @@ extern "C" { #define _CALL_INTRINSIC_1 CALL_INTRINSIC_1 #define _CALL_INTRINSIC_2 CALL_INTRINSIC_2 #define _CALL_ISINSTANCE CALL_ISINSTANCE +#define _CALL_KW_NON_PY 318 #define _CALL_LEN CALL_LEN #define _CALL_LIST_APPEND CALL_LIST_APPEND -#define _CALL_METHOD_DESCRIPTOR_FAST 318 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 319 -#define _CALL_METHOD_DESCRIPTOR_NOARGS 320 -#define _CALL_METHOD_DESCRIPTOR_O 321 -#define _CALL_NON_PY_GENERAL 322 -#define _CALL_STR_1 323 -#define _CALL_TUPLE_1 324 +#define _CALL_METHOD_DESCRIPTOR_FAST 319 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 320 +#define _CALL_METHOD_DESCRIPTOR_NOARGS 321 +#define _CALL_METHOD_DESCRIPTOR_O 322 +#define _CALL_NON_PY_GENERAL 323 +#define _CALL_STR_1 324 +#define _CALL_TUPLE_1 325 #define _CALL_TYPE_1 CALL_TYPE_1 -#define _CHECK_ATTR_CLASS 325 -#define _CHECK_ATTR_METHOD_LAZY_DICT 326 -#define _CHECK_ATTR_MODULE 327 -#define _CHECK_ATTR_WITH_HINT 328 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 329 +#define _CHECK_ATTR_CLASS 326 +#define _CHECK_ATTR_METHOD_LAZY_DICT 327 +#define _CHECK_ATTR_MODULE 328 +#define _CHECK_ATTR_WITH_HINT 329 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 330 #define _CHECK_EG_MATCH CHECK_EG_MATCH #define _CHECK_EXC_MATCH CHECK_EXC_MATCH -#define _CHECK_FUNCTION 330 -#define _CHECK_FUNCTION_EXACT_ARGS 331 -#define _CHECK_FUNCTION_VERSION 332 -#define _CHECK_IS_NOT_PY_CALLABLE 333 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES 334 -#define _CHECK_METHOD_VERSION 335 -#define _CHECK_PEP_523 336 -#define _CHECK_PERIODIC 337 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 338 -#define _CHECK_STACK_SPACE 339 -#define _CHECK_STACK_SPACE_OPERAND 340 -#define _CHECK_VALIDITY 341 -#define _CHECK_VALIDITY_AND_SET_IP 342 -#define _COMPARE_OP 343 -#define _COMPARE_OP_FLOAT 344 -#define _COMPARE_OP_INT 345 -#define _COMPARE_OP_STR 346 -#define _CONTAINS_OP 347 +#define _CHECK_FUNCTION 331 +#define _CHECK_FUNCTION_EXACT_ARGS 332 +#define _CHECK_FUNCTION_VERSION 333 +#define _CHECK_FUNCTION_VERSION_KW 334 +#define _CHECK_IS_NOT_PY_CALLABLE 335 +#define _CHECK_IS_NOT_PY_CALLABLE_KW 336 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES 337 +#define _CHECK_METHOD_VERSION 338 +#define _CHECK_METHOD_VERSION_KW 339 +#define _CHECK_PEP_523 340 +#define _CHECK_PERIODIC 341 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 342 +#define _CHECK_STACK_SPACE 343 +#define _CHECK_STACK_SPACE_OPERAND 344 +#define _CHECK_VALIDITY 345 +#define _CHECK_VALIDITY_AND_SET_IP 346 +#define _COMPARE_OP 347 +#define _COMPARE_OP_FLOAT 348 +#define _COMPARE_OP_INT 349 +#define _COMPARE_OP_STR 350 +#define _CONTAINS_OP 351 #define _CONTAINS_OP_DICT CONTAINS_OP_DICT #define _CONTAINS_OP_SET CONTAINS_OP_SET #define _CONVERT_VALUE CONVERT_VALUE @@ -88,57 +92,58 @@ extern "C" { #define _DELETE_GLOBAL DELETE_GLOBAL #define _DELETE_NAME DELETE_NAME #define _DELETE_SUBSCR DELETE_SUBSCR -#define _DEOPT 348 +#define _DEOPT 352 #define _DICT_MERGE DICT_MERGE #define _DICT_UPDATE DICT_UPDATE -#define _DO_CALL 349 -#define _DO_CALL_KW 350 -#define _DYNAMIC_EXIT 351 +#define _DO_CALL 353 +#define _DO_CALL_KW 354 +#define _DYNAMIC_EXIT 355 #define _END_SEND END_SEND -#define _ERROR_POP_N 352 +#define _ERROR_POP_N 356 #define _EXIT_INIT_CHECK EXIT_INIT_CHECK -#define _EXPAND_METHOD 353 -#define _FATAL_ERROR 354 +#define _EXPAND_METHOD 357 +#define _EXPAND_METHOD_KW 358 +#define _FATAL_ERROR 359 #define _FORMAT_SIMPLE FORMAT_SIMPLE #define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC -#define _FOR_ITER 355 -#define _FOR_ITER_GEN_FRAME 356 -#define _FOR_ITER_TIER_TWO 357 +#define _FOR_ITER 360 +#define _FOR_ITER_GEN_FRAME 361 +#define _FOR_ITER_TIER_TWO 362 #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_BOTH_FLOAT 358 -#define _GUARD_BOTH_INT 359 -#define _GUARD_BOTH_UNICODE 360 -#define _GUARD_BUILTINS_VERSION 361 -#define _GUARD_DORV_NO_DICT 362 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 363 -#define _GUARD_GLOBALS_VERSION 364 -#define _GUARD_IS_FALSE_POP 365 -#define _GUARD_IS_NONE_POP 366 -#define _GUARD_IS_NOT_NONE_POP 367 -#define _GUARD_IS_TRUE_POP 368 -#define _GUARD_KEYS_VERSION 369 -#define _GUARD_NOS_FLOAT 370 -#define _GUARD_NOS_INT 371 -#define _GUARD_NOT_EXHAUSTED_LIST 372 -#define _GUARD_NOT_EXHAUSTED_RANGE 373 -#define _GUARD_NOT_EXHAUSTED_TUPLE 374 -#define _GUARD_TOS_FLOAT 375 -#define _GUARD_TOS_INT 376 -#define _GUARD_TYPE_VERSION 377 +#define _GUARD_BOTH_FLOAT 363 +#define _GUARD_BOTH_INT 364 +#define _GUARD_BOTH_UNICODE 365 +#define _GUARD_BUILTINS_VERSION 366 +#define _GUARD_DORV_NO_DICT 367 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 368 +#define _GUARD_GLOBALS_VERSION 369 +#define _GUARD_IS_FALSE_POP 370 +#define _GUARD_IS_NONE_POP 371 +#define _GUARD_IS_NOT_NONE_POP 372 +#define _GUARD_IS_TRUE_POP 373 +#define _GUARD_KEYS_VERSION 374 +#define _GUARD_NOS_FLOAT 375 +#define _GUARD_NOS_INT 376 +#define _GUARD_NOT_EXHAUSTED_LIST 377 +#define _GUARD_NOT_EXHAUSTED_RANGE 378 +#define _GUARD_NOT_EXHAUSTED_TUPLE 379 +#define _GUARD_TOS_FLOAT 380 +#define _GUARD_TOS_INT 381 +#define _GUARD_TYPE_VERSION 382 #define _IMPORT_FROM IMPORT_FROM #define _IMPORT_NAME IMPORT_NAME -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 378 -#define _INIT_CALL_PY_EXACT_ARGS 379 -#define _INIT_CALL_PY_EXACT_ARGS_0 380 -#define _INIT_CALL_PY_EXACT_ARGS_1 381 -#define _INIT_CALL_PY_EXACT_ARGS_2 382 -#define _INIT_CALL_PY_EXACT_ARGS_3 383 -#define _INIT_CALL_PY_EXACT_ARGS_4 384 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 383 +#define _INIT_CALL_PY_EXACT_ARGS 384 +#define _INIT_CALL_PY_EXACT_ARGS_0 385 +#define _INIT_CALL_PY_EXACT_ARGS_1 386 +#define _INIT_CALL_PY_EXACT_ARGS_2 387 +#define _INIT_CALL_PY_EXACT_ARGS_3 388 +#define _INIT_CALL_PY_EXACT_ARGS_4 389 #define _INSTRUMENTED_CALL_FUNCTION_EX INSTRUMENTED_CALL_FUNCTION_EX #define _INSTRUMENTED_CALL_KW INSTRUMENTED_CALL_KW #define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER @@ -150,65 +155,65 @@ 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 _INTERNAL_INCREMENT_OPT_COUNTER 385 -#define _IS_NONE 386 +#define _INTERNAL_INCREMENT_OPT_COUNTER 390 +#define _IS_NONE 391 #define _IS_OP IS_OP -#define _ITER_CHECK_LIST 387 -#define _ITER_CHECK_RANGE 388 -#define _ITER_CHECK_TUPLE 389 -#define _ITER_JUMP_LIST 390 -#define _ITER_JUMP_RANGE 391 -#define _ITER_JUMP_TUPLE 392 -#define _ITER_NEXT_LIST 393 -#define _ITER_NEXT_RANGE 394 -#define _ITER_NEXT_TUPLE 395 -#define _JUMP_TO_TOP 396 +#define _ITER_CHECK_LIST 392 +#define _ITER_CHECK_RANGE 393 +#define _ITER_CHECK_TUPLE 394 +#define _ITER_JUMP_LIST 395 +#define _ITER_JUMP_RANGE 396 +#define _ITER_JUMP_TUPLE 397 +#define _ITER_NEXT_LIST 398 +#define _ITER_NEXT_RANGE 399 +#define _ITER_NEXT_TUPLE 400 +#define _JUMP_TO_TOP 401 #define _LIST_APPEND LIST_APPEND #define _LIST_EXTEND LIST_EXTEND -#define _LOAD_ATTR 397 -#define _LOAD_ATTR_CLASS 398 -#define _LOAD_ATTR_CLASS_0 399 -#define _LOAD_ATTR_CLASS_1 400 +#define _LOAD_ATTR 402 +#define _LOAD_ATTR_CLASS 403 +#define _LOAD_ATTR_CLASS_0 404 +#define _LOAD_ATTR_CLASS_1 405 #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN -#define _LOAD_ATTR_INSTANCE_VALUE 401 -#define _LOAD_ATTR_INSTANCE_VALUE_0 402 -#define _LOAD_ATTR_INSTANCE_VALUE_1 403 -#define _LOAD_ATTR_METHOD_LAZY_DICT 404 -#define _LOAD_ATTR_METHOD_NO_DICT 405 -#define _LOAD_ATTR_METHOD_WITH_VALUES 406 -#define _LOAD_ATTR_MODULE 407 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 408 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 409 -#define _LOAD_ATTR_PROPERTY_FRAME 410 -#define _LOAD_ATTR_SLOT 411 -#define _LOAD_ATTR_SLOT_0 412 -#define _LOAD_ATTR_SLOT_1 413 -#define _LOAD_ATTR_WITH_HINT 414 +#define _LOAD_ATTR_INSTANCE_VALUE 406 +#define _LOAD_ATTR_INSTANCE_VALUE_0 407 +#define _LOAD_ATTR_INSTANCE_VALUE_1 408 +#define _LOAD_ATTR_METHOD_LAZY_DICT 409 +#define _LOAD_ATTR_METHOD_NO_DICT 410 +#define _LOAD_ATTR_METHOD_WITH_VALUES 411 +#define _LOAD_ATTR_MODULE 412 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 413 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 414 +#define _LOAD_ATTR_PROPERTY_FRAME 415 +#define _LOAD_ATTR_SLOT 416 +#define _LOAD_ATTR_SLOT_0 417 +#define _LOAD_ATTR_SLOT_1 418 +#define _LOAD_ATTR_WITH_HINT 419 #define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS #define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT #define _LOAD_CONST LOAD_CONST -#define _LOAD_CONST_INLINE 415 -#define _LOAD_CONST_INLINE_BORROW 416 -#define _LOAD_CONST_INLINE_BORROW_WITH_NULL 417 -#define _LOAD_CONST_INLINE_WITH_NULL 418 +#define _LOAD_CONST_INLINE 420 +#define _LOAD_CONST_INLINE_BORROW 421 +#define _LOAD_CONST_INLINE_BORROW_WITH_NULL 422 +#define _LOAD_CONST_INLINE_WITH_NULL 423 #define _LOAD_DEREF LOAD_DEREF -#define _LOAD_FAST 419 -#define _LOAD_FAST_0 420 -#define _LOAD_FAST_1 421 -#define _LOAD_FAST_2 422 -#define _LOAD_FAST_3 423 -#define _LOAD_FAST_4 424 -#define _LOAD_FAST_5 425 -#define _LOAD_FAST_6 426 -#define _LOAD_FAST_7 427 +#define _LOAD_FAST 424 +#define _LOAD_FAST_0 425 +#define _LOAD_FAST_1 426 +#define _LOAD_FAST_2 427 +#define _LOAD_FAST_3 428 +#define _LOAD_FAST_4 429 +#define _LOAD_FAST_5 430 +#define _LOAD_FAST_6 431 +#define _LOAD_FAST_7 432 #define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR #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 428 -#define _LOAD_GLOBAL_BUILTINS 429 -#define _LOAD_GLOBAL_MODULE 430 +#define _LOAD_GLOBAL 433 +#define _LOAD_GLOBAL_BUILTINS 434 +#define _LOAD_GLOBAL_MODULE 435 #define _LOAD_LOCALS LOAD_LOCALS #define _LOAD_NAME LOAD_NAME #define _LOAD_SPECIAL LOAD_SPECIAL @@ -221,58 +226,59 @@ extern "C" { #define _MATCH_KEYS MATCH_KEYS #define _MATCH_MAPPING MATCH_MAPPING #define _MATCH_SEQUENCE MATCH_SEQUENCE -#define _MAYBE_EXPAND_METHOD 431 -#define _MONITOR_CALL 432 -#define _MONITOR_JUMP_BACKWARD 433 -#define _MONITOR_RESUME 434 +#define _MAYBE_EXPAND_METHOD 436 +#define _MONITOR_CALL 437 +#define _MONITOR_JUMP_BACKWARD 438 +#define _MONITOR_RESUME 439 #define _NOP NOP #define _POP_EXCEPT POP_EXCEPT -#define _POP_JUMP_IF_FALSE 435 -#define _POP_JUMP_IF_TRUE 436 +#define _POP_JUMP_IF_FALSE 440 +#define _POP_JUMP_IF_TRUE 441 #define _POP_TOP POP_TOP -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 437 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 442 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 438 +#define _PUSH_FRAME 443 #define _PUSH_NULL PUSH_NULL -#define _PY_FRAME_GENERAL 439 -#define _QUICKEN_RESUME 440 -#define _REPLACE_WITH_TRUE 441 +#define _PY_FRAME_GENERAL 444 +#define _PY_FRAME_KW 445 +#define _QUICKEN_RESUME 446 +#define _REPLACE_WITH_TRUE 447 #define _RESUME_CHECK RESUME_CHECK #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 442 -#define _SEND 443 -#define _SEND_GEN_FRAME 444 +#define _SAVE_RETURN_OFFSET 448 +#define _SEND 449 +#define _SEND_GEN_FRAME 450 #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 445 -#define _STORE_ATTR 446 -#define _STORE_ATTR_INSTANCE_VALUE 447 -#define _STORE_ATTR_SLOT 448 -#define _STORE_ATTR_WITH_HINT 449 +#define _START_EXECUTOR 451 +#define _STORE_ATTR 452 +#define _STORE_ATTR_INSTANCE_VALUE 453 +#define _STORE_ATTR_SLOT 454 +#define _STORE_ATTR_WITH_HINT 455 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 450 -#define _STORE_FAST_0 451 -#define _STORE_FAST_1 452 -#define _STORE_FAST_2 453 -#define _STORE_FAST_3 454 -#define _STORE_FAST_4 455 -#define _STORE_FAST_5 456 -#define _STORE_FAST_6 457 -#define _STORE_FAST_7 458 +#define _STORE_FAST 456 +#define _STORE_FAST_0 457 +#define _STORE_FAST_1 458 +#define _STORE_FAST_2 459 +#define _STORE_FAST_3 460 +#define _STORE_FAST_4 461 +#define _STORE_FAST_5 462 +#define _STORE_FAST_6 463 +#define _STORE_FAST_7 464 #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 STORE_SLICE -#define _STORE_SUBSCR 459 +#define _STORE_SUBSCR 465 #define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT #define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT #define _SWAP SWAP -#define _TIER2_RESUME_CHECK 460 -#define _TO_BOOL 461 +#define _TIER2_RESUME_CHECK 466 +#define _TO_BOOL 467 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT #define _TO_BOOL_LIST TO_BOOL_LIST @@ -282,14 +288,14 @@ extern "C" { #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 462 +#define _UNPACK_SEQUENCE 468 #define _UNPACK_SEQUENCE_LIST UNPACK_SEQUENCE_LIST #define _UNPACK_SEQUENCE_TUPLE UNPACK_SEQUENCE_TUPLE #define _UNPACK_SEQUENCE_TWO_TUPLE UNPACK_SEQUENCE_TWO_TUPLE #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE #define __DO_CALL_FUNCTION_EX _DO_CALL_FUNCTION_EX -#define MAX_UOP_ID 462 +#define MAX_UOP_ID 468 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index 69833e4..98757b6 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -237,6 +237,12 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_CALL_METHOD_DESCRIPTOR_NOARGS] = HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_CALL_METHOD_DESCRIPTOR_FAST] = HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_PY_FRAME_KW] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_CHECK_FUNCTION_VERSION_KW] = HAS_ARG_FLAG | HAS_EXIT_FLAG, + [_CHECK_METHOD_VERSION_KW] = HAS_ARG_FLAG | HAS_EXIT_FLAG, + [_EXPAND_METHOD_KW] = HAS_ARG_FLAG, + [_CHECK_IS_NOT_PY_CALLABLE_KW] = HAS_ARG_FLAG | HAS_EXIT_FLAG, + [_CALL_KW_NON_PY] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_MAKE_FUNCTION] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, [_SET_FUNCTION_ATTRIBUTE] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG, [_RETURN_GENERATOR] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, @@ -310,6 +316,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_CALL_INTRINSIC_1] = "_CALL_INTRINSIC_1", [_CALL_INTRINSIC_2] = "_CALL_INTRINSIC_2", [_CALL_ISINSTANCE] = "_CALL_ISINSTANCE", + [_CALL_KW_NON_PY] = "_CALL_KW_NON_PY", [_CALL_LEN] = "_CALL_LEN", [_CALL_LIST_APPEND] = "_CALL_LIST_APPEND", [_CALL_METHOD_DESCRIPTOR_FAST] = "_CALL_METHOD_DESCRIPTOR_FAST", @@ -330,9 +337,12 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_CHECK_FUNCTION] = "_CHECK_FUNCTION", [_CHECK_FUNCTION_EXACT_ARGS] = "_CHECK_FUNCTION_EXACT_ARGS", [_CHECK_FUNCTION_VERSION] = "_CHECK_FUNCTION_VERSION", + [_CHECK_FUNCTION_VERSION_KW] = "_CHECK_FUNCTION_VERSION_KW", [_CHECK_IS_NOT_PY_CALLABLE] = "_CHECK_IS_NOT_PY_CALLABLE", + [_CHECK_IS_NOT_PY_CALLABLE_KW] = "_CHECK_IS_NOT_PY_CALLABLE_KW", [_CHECK_MANAGED_OBJECT_HAS_VALUES] = "_CHECK_MANAGED_OBJECT_HAS_VALUES", [_CHECK_METHOD_VERSION] = "_CHECK_METHOD_VERSION", + [_CHECK_METHOD_VERSION_KW] = "_CHECK_METHOD_VERSION_KW", [_CHECK_PEP_523] = "_CHECK_PEP_523", [_CHECK_PERIODIC] = "_CHECK_PERIODIC", [_CHECK_PERIODIC_IF_NOT_YIELD_FROM] = "_CHECK_PERIODIC_IF_NOT_YIELD_FROM", @@ -365,6 +375,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_EXIT_INIT_CHECK] = "_EXIT_INIT_CHECK", [_EXIT_TRACE] = "_EXIT_TRACE", [_EXPAND_METHOD] = "_EXPAND_METHOD", + [_EXPAND_METHOD_KW] = "_EXPAND_METHOD_KW", [_FATAL_ERROR] = "_FATAL_ERROR", [_FORMAT_SIMPLE] = "_FORMAT_SIMPLE", [_FORMAT_WITH_SPEC] = "_FORMAT_WITH_SPEC", @@ -480,6 +491,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_PUSH_FRAME] = "_PUSH_FRAME", [_PUSH_NULL] = "_PUSH_NULL", [_PY_FRAME_GENERAL] = "_PY_FRAME_GENERAL", + [_PY_FRAME_KW] = "_PY_FRAME_KW", [_REPLACE_WITH_TRUE] = "_REPLACE_WITH_TRUE", [_RESUME_CHECK] = "_RESUME_CHECK", [_RETURN_GENERATOR] = "_RETURN_GENERATOR", @@ -972,6 +984,18 @@ int _PyUop_num_popped(int opcode, int oparg) return 2 + oparg; case _CALL_METHOD_DESCRIPTOR_FAST: return 2 + oparg; + case _PY_FRAME_KW: + return 3 + oparg; + case _CHECK_FUNCTION_VERSION_KW: + return 3 + oparg; + case _CHECK_METHOD_VERSION_KW: + return 3 + oparg; + case _EXPAND_METHOD_KW: + return 3 + oparg; + case _CHECK_IS_NOT_PY_CALLABLE_KW: + return 3 + oparg; + case _CALL_KW_NON_PY: + return 3 + oparg; case _MAKE_FUNCTION: return 1; case _SET_FUNCTION_ATTRIBUTE: diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h index 95984a9..1189712 100644 --- a/Include/opcode_ids.h +++ b/Include/opcode_ids.h @@ -148,59 +148,62 @@ extern "C" { #define CALL_BUILTIN_FAST_WITH_KEYWORDS 167 #define CALL_BUILTIN_O 168 #define CALL_ISINSTANCE 169 -#define CALL_LEN 170 -#define CALL_LIST_APPEND 171 -#define CALL_METHOD_DESCRIPTOR_FAST 172 -#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 173 -#define CALL_METHOD_DESCRIPTOR_NOARGS 174 -#define CALL_METHOD_DESCRIPTOR_O 175 -#define CALL_NON_PY_GENERAL 176 -#define CALL_PY_EXACT_ARGS 177 -#define CALL_PY_GENERAL 178 -#define CALL_STR_1 179 -#define CALL_TUPLE_1 180 -#define CALL_TYPE_1 181 -#define COMPARE_OP_FLOAT 182 -#define COMPARE_OP_INT 183 -#define COMPARE_OP_STR 184 -#define CONTAINS_OP_DICT 185 -#define CONTAINS_OP_SET 186 -#define FOR_ITER_GEN 187 -#define FOR_ITER_LIST 188 -#define FOR_ITER_RANGE 189 -#define FOR_ITER_TUPLE 190 -#define LOAD_ATTR_CLASS 191 -#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 192 -#define LOAD_ATTR_INSTANCE_VALUE 193 -#define LOAD_ATTR_METHOD_LAZY_DICT 194 -#define LOAD_ATTR_METHOD_NO_DICT 195 -#define LOAD_ATTR_METHOD_WITH_VALUES 196 -#define LOAD_ATTR_MODULE 197 -#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 198 -#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 199 -#define LOAD_ATTR_PROPERTY 200 -#define LOAD_ATTR_SLOT 201 -#define LOAD_ATTR_WITH_HINT 202 -#define LOAD_GLOBAL_BUILTIN 203 -#define LOAD_GLOBAL_MODULE 204 -#define LOAD_SUPER_ATTR_ATTR 205 -#define LOAD_SUPER_ATTR_METHOD 206 -#define RESUME_CHECK 207 -#define SEND_GEN 208 -#define STORE_ATTR_INSTANCE_VALUE 209 -#define STORE_ATTR_SLOT 210 -#define STORE_ATTR_WITH_HINT 211 -#define STORE_SUBSCR_DICT 212 -#define STORE_SUBSCR_LIST_INT 213 -#define TO_BOOL_ALWAYS_TRUE 214 -#define TO_BOOL_BOOL 215 -#define TO_BOOL_INT 216 -#define TO_BOOL_LIST 217 -#define TO_BOOL_NONE 218 -#define TO_BOOL_STR 219 -#define UNPACK_SEQUENCE_LIST 220 -#define UNPACK_SEQUENCE_TUPLE 221 -#define UNPACK_SEQUENCE_TWO_TUPLE 222 +#define CALL_KW_BOUND_METHOD 170 +#define CALL_KW_NON_PY 171 +#define CALL_KW_PY 172 +#define CALL_LEN 173 +#define CALL_LIST_APPEND 174 +#define CALL_METHOD_DESCRIPTOR_FAST 175 +#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 176 +#define CALL_METHOD_DESCRIPTOR_NOARGS 177 +#define CALL_METHOD_DESCRIPTOR_O 178 +#define CALL_NON_PY_GENERAL 179 +#define CALL_PY_EXACT_ARGS 180 +#define CALL_PY_GENERAL 181 +#define CALL_STR_1 182 +#define CALL_TUPLE_1 183 +#define CALL_TYPE_1 184 +#define COMPARE_OP_FLOAT 185 +#define COMPARE_OP_INT 186 +#define COMPARE_OP_STR 187 +#define CONTAINS_OP_DICT 188 +#define CONTAINS_OP_SET 189 +#define FOR_ITER_GEN 190 +#define FOR_ITER_LIST 191 +#define FOR_ITER_RANGE 192 +#define FOR_ITER_TUPLE 193 +#define LOAD_ATTR_CLASS 194 +#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 195 +#define LOAD_ATTR_INSTANCE_VALUE 196 +#define LOAD_ATTR_METHOD_LAZY_DICT 197 +#define LOAD_ATTR_METHOD_NO_DICT 198 +#define LOAD_ATTR_METHOD_WITH_VALUES 199 +#define LOAD_ATTR_MODULE 200 +#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 201 +#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 202 +#define LOAD_ATTR_PROPERTY 203 +#define LOAD_ATTR_SLOT 204 +#define LOAD_ATTR_WITH_HINT 205 +#define LOAD_GLOBAL_BUILTIN 206 +#define LOAD_GLOBAL_MODULE 207 +#define LOAD_SUPER_ATTR_ATTR 208 +#define LOAD_SUPER_ATTR_METHOD 209 +#define RESUME_CHECK 210 +#define SEND_GEN 211 +#define STORE_ATTR_INSTANCE_VALUE 212 +#define STORE_ATTR_SLOT 213 +#define STORE_ATTR_WITH_HINT 214 +#define STORE_SUBSCR_DICT 215 +#define STORE_SUBSCR_LIST_INT 216 +#define TO_BOOL_ALWAYS_TRUE 217 +#define TO_BOOL_BOOL 218 +#define TO_BOOL_INT 219 +#define TO_BOOL_LIST 220 +#define TO_BOOL_NONE 221 +#define TO_BOOL_STR 222 +#define UNPACK_SEQUENCE_LIST 223 +#define UNPACK_SEQUENCE_TUPLE 224 +#define UNPACK_SEQUENCE_TWO_TUPLE 225 #define INSTRUMENTED_END_FOR 236 #define INSTRUMENTED_END_SEND 237 #define INSTRUMENTED_LOAD_SUPER_ATTR 238 |