diff options
Diffstat (limited to 'Include')
-rw-r--r-- | Include/cpython/object.h | 5 | ||||
-rw-r--r-- | Include/cpython/unicodeobject.h | 30 | ||||
-rw-r--r-- | Include/internal/pycore_opcode_metadata.h | 10 | ||||
-rw-r--r-- | Include/internal/pycore_uop_ids.h | 331 | ||||
-rw-r--r-- | Include/internal/pycore_uop_metadata.h | 4 | ||||
-rw-r--r-- | Include/pymacro.h | 41 |
6 files changed, 241 insertions, 180 deletions
diff --git a/Include/cpython/object.h b/Include/cpython/object.h index b6c508e6e29..3a4d65f7712 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -476,6 +476,11 @@ PyAPI_FUNC(PyRefTracer) PyRefTracer_GetTracer(void**); */ PyAPI_FUNC(int) PyUnstable_Object_EnableDeferredRefcount(PyObject *); +/* Determine if the object exists as a unique temporary variable on the + * topmost frame of the interpreter. + */ +PyAPI_FUNC(int) PyUnstable_Object_IsUniqueReferencedTemporary(PyObject *); + /* Check whether the object is immortal. This cannot fail. */ PyAPI_FUNC(int) PyUnstable_IsImmortal(PyObject *); diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index e8b04d158b0..136f5d5c5f8 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -99,6 +99,11 @@ typedef struct { PyObject_HEAD Py_ssize_t length; /* Number of code points in the string */ Py_hash_t hash; /* Hash value; -1 if not set */ +#ifdef Py_GIL_DISABLED + /* Ensure 4 byte alignment for PyUnicode_DATA(), see gh-63736 on m68k. + In the non-free-threaded build, we'll use explicit padding instead */ + _Py_ALIGN_AS(4) +#endif struct { /* If interned is non-zero, the two references from the dictionary to this object are *not* counted in ob_refcnt. @@ -109,7 +114,12 @@ typedef struct { 3: Interned, Immortal, and Static This categorization allows the runtime to determine the right cleanup mechanism at runtime shutdown. */ - uint16_t interned; +#ifdef Py_GIL_DISABLED + // Needs to be accessed atomically, so can't be a bit field. + unsigned char interned; +#else + unsigned int interned:2; +#endif /* Character size: - PyUnicode_1BYTE_KIND (1): @@ -132,23 +142,23 @@ typedef struct { * all characters are in the range U+0000-U+10FFFF * at least one character is in the range U+10000-U+10FFFF */ - unsigned short kind:3; + unsigned int kind:3; /* Compact is with respect to the allocation scheme. Compact unicode objects only require one memory block while non-compact objects use one block for the PyUnicodeObject struct and another for its data buffer. */ - unsigned short compact:1; + unsigned int compact:1; /* The string only contains characters in the range U+0000-U+007F (ASCII) and the kind is PyUnicode_1BYTE_KIND. If ascii is set and compact is set, use the PyASCIIObject structure. */ - unsigned short ascii:1; + unsigned int ascii:1; /* The object is statically allocated. */ - unsigned short statically_allocated:1; + unsigned int statically_allocated:1; +#ifndef Py_GIL_DISABLED /* Padding to ensure that PyUnicode_DATA() is always aligned to - 4 bytes (see issue #19537 on m68k) and we use unsigned short to avoid - the extra four bytes on 32-bit Windows. This is restricted features - for specific compilers including GCC, MSVC, Clang and IBM's XL compiler. */ - unsigned short :10; + 4 bytes (see issue gh-63736 on m68k) */ + unsigned int :24; +#endif } state; } PyASCIIObject; @@ -198,7 +208,7 @@ typedef struct { /* Use only if you know it's a string */ static inline unsigned int PyUnicode_CHECK_INTERNED(PyObject *op) { #ifdef Py_GIL_DISABLED - return _Py_atomic_load_uint16_relaxed(&_PyASCIIObject_CAST(op)->state.interned); + return _Py_atomic_load_uint8_relaxed(&_PyASCIIObject_CAST(op)->state.interned); #else return _PyASCIIObject_CAST(op)->state.interned; #endif diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 852d6313394..4006a99382d 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1319,7 +1319,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { }; #endif -#define MAX_UOP_PER_EXPANSION 9 +#define MAX_UOP_PER_EXPANSION 10 struct opcode_macro_expansion { int nuops; struct { int16_t uop; int8_t size; int8_t offset; } uops[MAX_UOP_PER_EXPANSION]; @@ -1355,8 +1355,8 @@ _PyOpcode_macro_expansion[256] = { [BUILD_TEMPLATE] = { .nuops = 1, .uops = { { _BUILD_TEMPLATE, OPARG_SIMPLE, 0 } } }, [BUILD_TUPLE] = { .nuops = 1, .uops = { { _BUILD_TUPLE, OPARG_SIMPLE, 0 } } }, [CALL_ALLOC_AND_ENTER_INIT] = { .nuops = 4, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_AND_ALLOCATE_OBJECT, 2, 1 }, { _CREATE_INIT_FRAME, OPARG_SIMPLE, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, - [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 9, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, - [CALL_BOUND_METHOD_GENERAL] = { .nuops = 6, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_METHOD_VERSION, 2, 1 }, { _EXPAND_METHOD, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, + [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 10, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, + [CALL_BOUND_METHOD_GENERAL] = { .nuops = 7, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_METHOD_VERSION, 2, 1 }, { _EXPAND_METHOD, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, [CALL_BUILTIN_CLASS] = { .nuops = 2, .uops = { { _CALL_BUILTIN_CLASS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, [CALL_BUILTIN_FAST] = { .nuops = 2, .uops = { { _CALL_BUILTIN_FAST, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { .nuops = 2, .uops = { { _CALL_BUILTIN_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, @@ -1374,8 +1374,8 @@ _PyOpcode_macro_expansion[256] = { [CALL_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_NOARGS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, [CALL_METHOD_DESCRIPTOR_O] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_O, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, [CALL_NON_PY_GENERAL] = { .nuops = 3, .uops = { { _CHECK_IS_NOT_PY_CALLABLE, OPARG_SIMPLE, 3 }, { _CALL_NON_PY_GENERAL, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, - [CALL_PY_EXACT_ARGS] = { .nuops = 7, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, - [CALL_PY_GENERAL] = { .nuops = 5, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, + [CALL_PY_EXACT_ARGS] = { .nuops = 8, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, + [CALL_PY_GENERAL] = { .nuops = 6, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, [CALL_STR_1] = { .nuops = 4, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_STR_1, OPARG_SIMPLE, 3 }, { _CALL_STR_1, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, [CALL_TUPLE_1] = { .nuops = 4, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_TUPLE_1, OPARG_SIMPLE, 3 }, { _CALL_TUPLE_1, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, [CALL_TYPE_1] = { .nuops = 3, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_TYPE_1, OPARG_SIMPLE, 3 }, { _CALL_TYPE_1, OPARG_SIMPLE, 3 } } }, diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index 371b77e2c96..b4eef763da3 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -74,92 +74,93 @@ extern "C" { #define _CHECK_PEP_523 347 #define _CHECK_PERIODIC 348 #define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 349 -#define _CHECK_STACK_SPACE 350 -#define _CHECK_STACK_SPACE_OPERAND 351 -#define _CHECK_VALIDITY 352 -#define _COMPARE_OP 353 -#define _COMPARE_OP_FLOAT 354 -#define _COMPARE_OP_INT 355 -#define _COMPARE_OP_STR 356 -#define _CONTAINS_OP 357 -#define _CONTAINS_OP_DICT 358 -#define _CONTAINS_OP_SET 359 +#define _CHECK_RECURSION_REMAINING 350 +#define _CHECK_STACK_SPACE 351 +#define _CHECK_STACK_SPACE_OPERAND 352 +#define _CHECK_VALIDITY 353 +#define _COMPARE_OP 354 +#define _COMPARE_OP_FLOAT 355 +#define _COMPARE_OP_INT 356 +#define _COMPARE_OP_STR 357 +#define _CONTAINS_OP 358 +#define _CONTAINS_OP_DICT 359 +#define _CONTAINS_OP_SET 360 #define _CONVERT_VALUE CONVERT_VALUE #define _COPY COPY #define _COPY_FREE_VARS COPY_FREE_VARS -#define _CREATE_INIT_FRAME 360 +#define _CREATE_INIT_FRAME 361 #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 361 +#define _DEOPT 362 #define _DICT_MERGE DICT_MERGE #define _DICT_UPDATE DICT_UPDATE -#define _DO_CALL 362 -#define _DO_CALL_FUNCTION_EX 363 -#define _DO_CALL_KW 364 +#define _DO_CALL 363 +#define _DO_CALL_FUNCTION_EX 364 +#define _DO_CALL_KW 365 #define _END_FOR END_FOR #define _END_SEND END_SEND -#define _ERROR_POP_N 365 +#define _ERROR_POP_N 366 #define _EXIT_INIT_CHECK EXIT_INIT_CHECK -#define _EXPAND_METHOD 366 -#define _EXPAND_METHOD_KW 367 -#define _FATAL_ERROR 368 +#define _EXPAND_METHOD 367 +#define _EXPAND_METHOD_KW 368 +#define _FATAL_ERROR 369 #define _FORMAT_SIMPLE FORMAT_SIMPLE #define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC -#define _FOR_ITER 369 -#define _FOR_ITER_GEN_FRAME 370 -#define _FOR_ITER_TIER_TWO 371 +#define _FOR_ITER 370 +#define _FOR_ITER_GEN_FRAME 371 +#define _FOR_ITER_TIER_TWO 372 #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 372 -#define _GUARD_CALLABLE_STR_1 373 -#define _GUARD_CALLABLE_TUPLE_1 374 -#define _GUARD_CALLABLE_TYPE_1 375 -#define _GUARD_DORV_NO_DICT 376 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 377 -#define _GUARD_GLOBALS_VERSION 378 -#define _GUARD_IS_FALSE_POP 379 -#define _GUARD_IS_NONE_POP 380 -#define _GUARD_IS_NOT_NONE_POP 381 -#define _GUARD_IS_TRUE_POP 382 -#define _GUARD_KEYS_VERSION 383 -#define _GUARD_NOS_DICT 384 -#define _GUARD_NOS_FLOAT 385 -#define _GUARD_NOS_INT 386 -#define _GUARD_NOS_LIST 387 -#define _GUARD_NOS_NULL 388 -#define _GUARD_NOS_TUPLE 389 -#define _GUARD_NOS_UNICODE 390 -#define _GUARD_NOT_EXHAUSTED_LIST 391 -#define _GUARD_NOT_EXHAUSTED_RANGE 392 -#define _GUARD_NOT_EXHAUSTED_TUPLE 393 -#define _GUARD_TOS_ANY_SET 394 -#define _GUARD_TOS_DICT 395 -#define _GUARD_TOS_FLOAT 396 -#define _GUARD_TOS_INT 397 -#define _GUARD_TOS_LIST 398 -#define _GUARD_TOS_SLICE 399 -#define _GUARD_TOS_TUPLE 400 -#define _GUARD_TOS_UNICODE 401 -#define _GUARD_TYPE_VERSION 402 -#define _GUARD_TYPE_VERSION_AND_LOCK 403 +#define _GUARD_BINARY_OP_EXTEND 373 +#define _GUARD_CALLABLE_STR_1 374 +#define _GUARD_CALLABLE_TUPLE_1 375 +#define _GUARD_CALLABLE_TYPE_1 376 +#define _GUARD_DORV_NO_DICT 377 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 378 +#define _GUARD_GLOBALS_VERSION 379 +#define _GUARD_IS_FALSE_POP 380 +#define _GUARD_IS_NONE_POP 381 +#define _GUARD_IS_NOT_NONE_POP 382 +#define _GUARD_IS_TRUE_POP 383 +#define _GUARD_KEYS_VERSION 384 +#define _GUARD_NOS_DICT 385 +#define _GUARD_NOS_FLOAT 386 +#define _GUARD_NOS_INT 387 +#define _GUARD_NOS_LIST 388 +#define _GUARD_NOS_NULL 389 +#define _GUARD_NOS_TUPLE 390 +#define _GUARD_NOS_UNICODE 391 +#define _GUARD_NOT_EXHAUSTED_LIST 392 +#define _GUARD_NOT_EXHAUSTED_RANGE 393 +#define _GUARD_NOT_EXHAUSTED_TUPLE 394 +#define _GUARD_TOS_ANY_SET 395 +#define _GUARD_TOS_DICT 396 +#define _GUARD_TOS_FLOAT 397 +#define _GUARD_TOS_INT 398 +#define _GUARD_TOS_LIST 399 +#define _GUARD_TOS_SLICE 400 +#define _GUARD_TOS_TUPLE 401 +#define _GUARD_TOS_UNICODE 402 +#define _GUARD_TYPE_VERSION 403 +#define _GUARD_TYPE_VERSION_AND_LOCK 404 #define _IMPORT_FROM IMPORT_FROM #define _IMPORT_NAME IMPORT_NAME -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 404 -#define _INIT_CALL_PY_EXACT_ARGS 405 -#define _INIT_CALL_PY_EXACT_ARGS_0 406 -#define _INIT_CALL_PY_EXACT_ARGS_1 407 -#define _INIT_CALL_PY_EXACT_ARGS_2 408 -#define _INIT_CALL_PY_EXACT_ARGS_3 409 -#define _INIT_CALL_PY_EXACT_ARGS_4 410 -#define _INSERT_NULL 411 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 405 +#define _INIT_CALL_PY_EXACT_ARGS 406 +#define _INIT_CALL_PY_EXACT_ARGS_0 407 +#define _INIT_CALL_PY_EXACT_ARGS_1 408 +#define _INIT_CALL_PY_EXACT_ARGS_2 409 +#define _INIT_CALL_PY_EXACT_ARGS_3 410 +#define _INIT_CALL_PY_EXACT_ARGS_4 411 +#define _INSERT_NULL 412 #define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER #define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION #define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD @@ -169,163 +170,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 412 +#define _IS_NONE 413 #define _IS_OP IS_OP -#define _ITER_CHECK_LIST 413 -#define _ITER_CHECK_RANGE 414 -#define _ITER_CHECK_TUPLE 415 -#define _ITER_JUMP_LIST 416 -#define _ITER_JUMP_RANGE 417 -#define _ITER_JUMP_TUPLE 418 -#define _ITER_NEXT_LIST 419 -#define _ITER_NEXT_LIST_TIER_TWO 420 -#define _ITER_NEXT_RANGE 421 -#define _ITER_NEXT_TUPLE 422 -#define _JUMP_TO_TOP 423 +#define _ITER_CHECK_LIST 414 +#define _ITER_CHECK_RANGE 415 +#define _ITER_CHECK_TUPLE 416 +#define _ITER_JUMP_LIST 417 +#define _ITER_JUMP_RANGE 418 +#define _ITER_JUMP_TUPLE 419 +#define _ITER_NEXT_LIST 420 +#define _ITER_NEXT_LIST_TIER_TWO 421 +#define _ITER_NEXT_RANGE 422 +#define _ITER_NEXT_TUPLE 423 +#define _JUMP_TO_TOP 424 #define _LIST_APPEND LIST_APPEND #define _LIST_EXTEND LIST_EXTEND -#define _LOAD_ATTR 424 -#define _LOAD_ATTR_CLASS 425 +#define _LOAD_ATTR 425 +#define _LOAD_ATTR_CLASS 426 #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN -#define _LOAD_ATTR_INSTANCE_VALUE 426 -#define _LOAD_ATTR_METHOD_LAZY_DICT 427 -#define _LOAD_ATTR_METHOD_NO_DICT 428 -#define _LOAD_ATTR_METHOD_WITH_VALUES 429 -#define _LOAD_ATTR_MODULE 430 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 431 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 432 -#define _LOAD_ATTR_PROPERTY_FRAME 433 -#define _LOAD_ATTR_SLOT 434 -#define _LOAD_ATTR_WITH_HINT 435 +#define _LOAD_ATTR_INSTANCE_VALUE 427 +#define _LOAD_ATTR_METHOD_LAZY_DICT 428 +#define _LOAD_ATTR_METHOD_NO_DICT 429 +#define _LOAD_ATTR_METHOD_WITH_VALUES 430 +#define _LOAD_ATTR_MODULE 431 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 432 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 433 +#define _LOAD_ATTR_PROPERTY_FRAME 434 +#define _LOAD_ATTR_SLOT 435 +#define _LOAD_ATTR_WITH_HINT 436 #define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS -#define _LOAD_BYTECODE 436 +#define _LOAD_BYTECODE 437 #define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT #define _LOAD_CONST LOAD_CONST #define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL -#define _LOAD_CONST_INLINE 437 -#define _LOAD_CONST_INLINE_BORROW 438 +#define _LOAD_CONST_INLINE 438 +#define _LOAD_CONST_INLINE_BORROW 439 #define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL #define _LOAD_DEREF LOAD_DEREF -#define _LOAD_FAST 439 -#define _LOAD_FAST_0 440 -#define _LOAD_FAST_1 441 -#define _LOAD_FAST_2 442 -#define _LOAD_FAST_3 443 -#define _LOAD_FAST_4 444 -#define _LOAD_FAST_5 445 -#define _LOAD_FAST_6 446 -#define _LOAD_FAST_7 447 +#define _LOAD_FAST 440 +#define _LOAD_FAST_0 441 +#define _LOAD_FAST_1 442 +#define _LOAD_FAST_2 443 +#define _LOAD_FAST_3 444 +#define _LOAD_FAST_4 445 +#define _LOAD_FAST_5 446 +#define _LOAD_FAST_6 447 +#define _LOAD_FAST_7 448 #define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR -#define _LOAD_FAST_BORROW 448 -#define _LOAD_FAST_BORROW_0 449 -#define _LOAD_FAST_BORROW_1 450 -#define _LOAD_FAST_BORROW_2 451 -#define _LOAD_FAST_BORROW_3 452 -#define _LOAD_FAST_BORROW_4 453 -#define _LOAD_FAST_BORROW_5 454 -#define _LOAD_FAST_BORROW_6 455 -#define _LOAD_FAST_BORROW_7 456 +#define _LOAD_FAST_BORROW 449 +#define _LOAD_FAST_BORROW_0 450 +#define _LOAD_FAST_BORROW_1 451 +#define _LOAD_FAST_BORROW_2 452 +#define _LOAD_FAST_BORROW_3 453 +#define _LOAD_FAST_BORROW_4 454 +#define _LOAD_FAST_BORROW_5 455 +#define _LOAD_FAST_BORROW_6 456 +#define _LOAD_FAST_BORROW_7 457 #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 457 -#define _LOAD_GLOBAL_BUILTINS 458 -#define _LOAD_GLOBAL_MODULE 459 +#define _LOAD_GLOBAL 458 +#define _LOAD_GLOBAL_BUILTINS 459 +#define _LOAD_GLOBAL_MODULE 460 #define _LOAD_LOCALS LOAD_LOCALS #define _LOAD_NAME LOAD_NAME -#define _LOAD_SMALL_INT 460 -#define _LOAD_SMALL_INT_0 461 -#define _LOAD_SMALL_INT_1 462 -#define _LOAD_SMALL_INT_2 463 -#define _LOAD_SMALL_INT_3 464 -#define _LOAD_SPECIAL 465 +#define _LOAD_SMALL_INT 461 +#define _LOAD_SMALL_INT_0 462 +#define _LOAD_SMALL_INT_1 463 +#define _LOAD_SMALL_INT_2 464 +#define _LOAD_SMALL_INT_3 465 +#define _LOAD_SPECIAL 466 #define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR #define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD -#define _MAKE_CALLARGS_A_TUPLE 466 +#define _MAKE_CALLARGS_A_TUPLE 467 #define _MAKE_CELL MAKE_CELL #define _MAKE_FUNCTION MAKE_FUNCTION -#define _MAKE_WARM 467 +#define _MAKE_WARM 468 #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 468 -#define _MAYBE_EXPAND_METHOD_KW 469 -#define _MONITOR_CALL 470 -#define _MONITOR_CALL_KW 471 -#define _MONITOR_JUMP_BACKWARD 472 -#define _MONITOR_RESUME 473 +#define _MAYBE_EXPAND_METHOD 469 +#define _MAYBE_EXPAND_METHOD_KW 470 +#define _MONITOR_CALL 471 +#define _MONITOR_CALL_KW 472 +#define _MONITOR_JUMP_BACKWARD 473 +#define _MONITOR_RESUME 474 #define _NOP NOP #define _POP_EXCEPT POP_EXCEPT -#define _POP_JUMP_IF_FALSE 474 -#define _POP_JUMP_IF_TRUE 475 +#define _POP_JUMP_IF_FALSE 475 +#define _POP_JUMP_IF_TRUE 476 #define _POP_TOP POP_TOP -#define _POP_TOP_LOAD_CONST_INLINE 476 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 477 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 478 +#define _POP_TOP_LOAD_CONST_INLINE 477 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 478 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW 479 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 479 +#define _PUSH_FRAME 480 #define _PUSH_NULL PUSH_NULL -#define _PUSH_NULL_CONDITIONAL 480 -#define _PY_FRAME_GENERAL 481 -#define _PY_FRAME_KW 482 -#define _QUICKEN_RESUME 483 -#define _REPLACE_WITH_TRUE 484 +#define _PUSH_NULL_CONDITIONAL 481 +#define _PY_FRAME_GENERAL 482 +#define _PY_FRAME_KW 483 +#define _QUICKEN_RESUME 484 +#define _REPLACE_WITH_TRUE 485 #define _RESUME_CHECK RESUME_CHECK #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 485 -#define _SEND 486 -#define _SEND_GEN_FRAME 487 +#define _SAVE_RETURN_OFFSET 486 +#define _SEND 487 +#define _SEND_GEN_FRAME 488 #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 488 -#define _STORE_ATTR 489 -#define _STORE_ATTR_INSTANCE_VALUE 490 -#define _STORE_ATTR_SLOT 491 -#define _STORE_ATTR_WITH_HINT 492 +#define _START_EXECUTOR 489 +#define _STORE_ATTR 490 +#define _STORE_ATTR_INSTANCE_VALUE 491 +#define _STORE_ATTR_SLOT 492 +#define _STORE_ATTR_WITH_HINT 493 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 493 -#define _STORE_FAST_0 494 -#define _STORE_FAST_1 495 -#define _STORE_FAST_2 496 -#define _STORE_FAST_3 497 -#define _STORE_FAST_4 498 -#define _STORE_FAST_5 499 -#define _STORE_FAST_6 500 -#define _STORE_FAST_7 501 +#define _STORE_FAST 494 +#define _STORE_FAST_0 495 +#define _STORE_FAST_1 496 +#define _STORE_FAST_2 497 +#define _STORE_FAST_3 498 +#define _STORE_FAST_4 499 +#define _STORE_FAST_5 500 +#define _STORE_FAST_6 501 +#define _STORE_FAST_7 502 #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 502 -#define _STORE_SUBSCR 503 -#define _STORE_SUBSCR_DICT 504 -#define _STORE_SUBSCR_LIST_INT 505 +#define _STORE_SLICE 503 +#define _STORE_SUBSCR 504 +#define _STORE_SUBSCR_DICT 505 +#define _STORE_SUBSCR_LIST_INT 506 #define _SWAP SWAP -#define _TIER2_RESUME_CHECK 506 -#define _TO_BOOL 507 +#define _TIER2_RESUME_CHECK 507 +#define _TO_BOOL 508 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 508 +#define _TO_BOOL_LIST 509 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 509 +#define _TO_BOOL_STR 510 #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 510 -#define _UNPACK_SEQUENCE_LIST 511 -#define _UNPACK_SEQUENCE_TUPLE 512 -#define _UNPACK_SEQUENCE_TWO_TUPLE 513 +#define _UNPACK_SEQUENCE 511 +#define _UNPACK_SEQUENCE_LIST 512 +#define _UNPACK_SEQUENCE_TUPLE 513 +#define _UNPACK_SEQUENCE_TWO_TUPLE 514 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 513 +#define MAX_UOP_ID 514 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index 03113cd4c96..7304fc6e299 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -238,6 +238,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { [_CHECK_PEP_523] = HAS_DEOPT_FLAG, [_CHECK_FUNCTION_EXACT_ARGS] = HAS_ARG_FLAG | HAS_EXIT_FLAG, [_CHECK_STACK_SPACE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_CHECK_RECURSION_REMAINING] = HAS_DEOPT_FLAG, [_INIT_CALL_PY_EXACT_ARGS_0] = HAS_PURE_FLAG, [_INIT_CALL_PY_EXACT_ARGS_1] = HAS_PURE_FLAG, [_INIT_CALL_PY_EXACT_ARGS_2] = HAS_PURE_FLAG, @@ -380,6 +381,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_CHECK_PEP_523] = "_CHECK_PEP_523", [_CHECK_PERIODIC] = "_CHECK_PERIODIC", [_CHECK_PERIODIC_IF_NOT_YIELD_FROM] = "_CHECK_PERIODIC_IF_NOT_YIELD_FROM", + [_CHECK_RECURSION_REMAINING] = "_CHECK_RECURSION_REMAINING", [_CHECK_STACK_SPACE] = "_CHECK_STACK_SPACE", [_CHECK_STACK_SPACE_OPERAND] = "_CHECK_STACK_SPACE_OPERAND", [_CHECK_VALIDITY] = "_CHECK_VALIDITY", @@ -1046,6 +1048,8 @@ int _PyUop_num_popped(int opcode, int oparg) return 0; case _CHECK_STACK_SPACE: return 0; + case _CHECK_RECURSION_REMAINING: + return 0; case _INIT_CALL_PY_EXACT_ARGS_0: return 2 + oparg; case _INIT_CALL_PY_EXACT_ARGS_1: diff --git a/Include/pymacro.h b/Include/pymacro.h index a82f347866e..218987a80b0 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -23,6 +23,47 @@ # define static_assert _Static_assert #endif + +// _Py_ALIGN_AS: this compiler's spelling of `alignas` keyword, +// We currently use alignas for free-threaded builds only; additional compat +// checking would be great before we add it to the default build. +// Standards/compiler support: +// - `alignas` is a keyword in C23 and C++11. +// - `_Alignas` is a keyword in C11 +// - GCC & clang has __attribute__((aligned)) +// (use that for older standards in pedantic mode) +// - MSVC has __declspec(align) +// - `_Alignas` is common C compiler extension +// Older compilers may name it differently; to allow compilation on such +// unsupported platforms, we don't redefine _Py_ALIGN_AS if it's already +// defined. Note that defining it wrong (including defining it to nothing) will +// cause ABI incompatibilities. +#ifdef Py_GIL_DISABLED +# ifndef _Py_ALIGN_AS +# ifdef __cplusplus +# if __cplusplus >= 201103L +# define _Py_ALIGN_AS(V) alignas(V) +# elif defined(__GNUC__) || defined(__clang__) +# define _Py_ALIGN_AS(V) __attribute__((aligned(V))) +# elif defined(_MSC_VER) +# define _Py_ALIGN_AS(V) __declspec(align(V)) +# else +# define _Py_ALIGN_AS(V) alignas(V) +# endif +# elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +# define _Py_ALIGN_AS(V) alignas(V) +# elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +# define _Py_ALIGN_AS(V) _Alignas(V) +# elif (defined(__GNUC__) || defined(__clang__)) +# define _Py_ALIGN_AS(V) __attribute__((aligned(V))) +# elif defined(_MSC_VER) +# define _Py_ALIGN_AS(V) __declspec(align(V)) +# else +# define _Py_ALIGN_AS(V) _Alignas(V) +# endif +# endif +#endif + /* Minimum value between x and y */ #define Py_MIN(x, y) (((x) > (y)) ? (y) : (x)) |