Python-checkins
Threads by month
- ----- 2025 -----
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
January 2025
- 1 participants
- 705 discussions
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
Jan. 27, 2025
https://github.com/python/cpython/commit/75b49621578a45415bfeedd6cc68d50e82…
commit: 75b49621578a45415bfeedd6cc68d50e821d8281
branch: main
author: Mark Shannon <mark(a)hotpy.org>
committer: markshannon <mark(a)hotpy.org>
date: 2025-01-27T16:24:48Z
summary:
GH-128914: Remove all but one conditional stack effects (GH-129226)
* Remove all 'if (0)' and 'if (1)' conditional stack effects
* Use array instead of conditional for BUILD_SLICE args
* Refactor LOAD_GLOBAL to use a common conditional uop
* Remove conditional stack effects from LOAD_ATTR specializations
* Replace conditional stack effects in LOAD_ATTR with a 0 or 1 sized array.
* Remove conditional stack effects from CALL_FUNCTION_EX
files:
M Include/internal/pycore_magic_number.h
M Include/internal/pycore_opcode_metadata.h
M Include/internal/pycore_uop_ids.h
M Include/internal/pycore_uop_metadata.h
M Include/opcode_ids.h
M Lib/_opcode_metadata.py
M Lib/test/test__opcode.py
M Lib/test/test_capi/test_opt.py
M Lib/test/test_dis.py
M Programs/test_frozenmain.h
M Python/bytecodes.c
M Python/codegen.c
M Python/executor_cases.c.h
M Python/generated_cases.c.h
M Python/opcode_targets.h
M Python/optimizer.c
M Python/optimizer_analysis.c
M Python/optimizer_bytecodes.c
M Python/optimizer_cases.c.h
diff --git a/Include/internal/pycore_magic_number.h b/Include/internal/pycore_magic_number.h
index 1dd155abf3babf..5a0b6dae8a5ad6 100644
--- a/Include/internal/pycore_magic_number.h
+++ b/Include/internal/pycore_magic_number.h
@@ -267,6 +267,7 @@ Known values:
Python 3.14a4 3612 (Add POP_ITER and INSTRUMENTED_POP_ITER)
Python 3.14a4 3613 (Add LOAD_CONST_MORTAL instruction)
Python 3.14a5 3614 (Add BINARY_OP_EXTEND)
+ Python 3.14a5 3615 (CALL_FUNCTION_EX always take a kwargs argument)
Python 3.15 will start with 3650
@@ -279,7 +280,7 @@ PC/launcher.c must also be updated.
*/
-#define PYC_MAGIC_NUMBER 3614
+#define PYC_MAGIC_NUMBER 3615
/* 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 10061c988d5f4b..bad5e515a99565 100644
--- a/Include/internal/pycore_opcode_metadata.h
+++ b/Include/internal/pycore_opcode_metadata.h
@@ -76,7 +76,7 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
case BUILD_SET:
return oparg;
case BUILD_SLICE:
- return 2 + ((oparg == 3) ? 1 : 0);
+ return oparg;
case BUILD_STRING:
return oparg;
case BUILD_TUPLE:
@@ -100,7 +100,7 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
case CALL_BUILTIN_O:
return 2 + oparg;
case CALL_FUNCTION_EX:
- return 3 + (oparg & 1);
+ return 4;
case CALL_INTRINSIC_1:
return 1;
case CALL_INTRINSIC_2:
@@ -757,7 +757,7 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
case LIST_EXTEND:
return 1 + (oparg-1);
case LOAD_ATTR:
- return 1 + (oparg & 1);
+ return 1 + (oparg&1);
case LOAD_ATTR_CLASS:
return 1 + (oparg & 1);
case LOAD_ATTR_CLASS_WITH_METACLASS_CHECK:
@@ -1058,7 +1058,7 @@ int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
return 0;
}
case BUILD_SLICE: {
- *effect = -1 - ((oparg == 3) ? 1 : 0);
+ *effect = 1 - oparg;
return 0;
}
case BUILD_STRING: {
@@ -1114,7 +1114,7 @@ int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
return 0;
}
case CALL_FUNCTION_EX: {
- *effect = Py_MAX(0, -2 - (oparg & 1));
+ *effect = 0;
return 0;
}
case CALL_INTRINSIC_1: {
@@ -1496,7 +1496,9 @@ int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
return 0;
}
case LOAD_ATTR: {
- *effect = Py_MAX(1, (oparg & 1));
+ int max_eff = Py_MAX(1, (oparg & 1));
+ max_eff = Py_MAX(max_eff, (oparg&1));
+ *effect = max_eff;
return 0;
}
case LOAD_ATTR_CLASS: {
@@ -2023,7 +2025,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[266] = {
[CALL_BUILTIN_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[CALL_BUILTIN_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [CALL_FUNCTION_EX] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
+ [CALL_FUNCTION_EX] = { true, INSTR_FMT_IX, HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
[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 },
@@ -2324,18 +2326,18 @@ _PyOpcode_macro_expansion[256] = {
[LIST_APPEND] = { .nuops = 1, .uops = { { _LIST_APPEND, 0, 0 } } },
[LIST_EXTEND] = { .nuops = 1, .uops = { { _LIST_EXTEND, 0, 0 } } },
[LOAD_ATTR] = { .nuops = 1, .uops = { { _LOAD_ATTR, 0, 0 } } },
- [LOAD_ATTR_CLASS] = { .nuops = 2, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _LOAD_ATTR_CLASS, 4, 5 } } },
- [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { .nuops = 3, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _GUARD_TYPE_VERSION, 2, 3 }, { _LOAD_ATTR_CLASS, 4, 5 } } },
- [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, 0, 0 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 } } },
+ [LOAD_ATTR_CLASS] = { .nuops = 3, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
+ [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { .nuops = 4, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _GUARD_TYPE_VERSION, 2, 3 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
+ [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, 0, 0 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
[LOAD_ATTR_METHOD_LAZY_DICT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_METHOD_LAZY_DICT, 1, 3 }, { _LOAD_ATTR_METHOD_LAZY_DICT, 4, 5 } } },
[LOAD_ATTR_METHOD_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_METHOD_NO_DICT, 4, 5 } } },
[LOAD_ATTR_METHOD_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 0, 0 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_METHOD_WITH_VALUES, 4, 5 } } },
- [LOAD_ATTR_MODULE] = { .nuops = 2, .uops = { { _CHECK_ATTR_MODULE_PUSH_KEYS, 2, 1 }, { _LOAD_ATTR_MODULE_FROM_KEYS, 1, 3 } } },
+ [LOAD_ATTR_MODULE] = { .nuops = 3, .uops = { { _CHECK_ATTR_MODULE_PUSH_KEYS, 2, 1 }, { _LOAD_ATTR_MODULE_FROM_KEYS, 1, 3 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
[LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 4, 5 } } },
[LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 0, 0 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 4, 5 } } },
[LOAD_ATTR_PROPERTY] = { .nuops = 5, .uops = { { _CHECK_PEP_523, 0, 0 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_PROPERTY_FRAME, 4, 5 }, { _SAVE_RETURN_OFFSET, 7, 9 }, { _PUSH_FRAME, 0, 0 } } },
- [LOAD_ATTR_SLOT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 } } },
- [LOAD_ATTR_WITH_HINT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_WITH_HINT, 0, 0 }, { _LOAD_ATTR_WITH_HINT, 1, 3 } } },
+ [LOAD_ATTR_SLOT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
+ [LOAD_ATTR_WITH_HINT] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_WITH_HINT, 0, 0 }, { _LOAD_ATTR_WITH_HINT, 1, 3 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
[LOAD_BUILD_CLASS] = { .nuops = 1, .uops = { { _LOAD_BUILD_CLASS, 0, 0 } } },
[LOAD_COMMON_CONSTANT] = { .nuops = 1, .uops = { { _LOAD_COMMON_CONSTANT, 0, 0 } } },
[LOAD_CONST_IMMORTAL] = { .nuops = 1, .uops = { { _LOAD_CONST_IMMORTAL, 0, 0 } } },
@@ -2346,9 +2348,9 @@ _PyOpcode_macro_expansion[256] = {
[LOAD_FAST_CHECK] = { .nuops = 1, .uops = { { _LOAD_FAST_CHECK, 0, 0 } } },
[LOAD_FAST_LOAD_FAST] = { .nuops = 2, .uops = { { _LOAD_FAST, 5, 0 }, { _LOAD_FAST, 6, 0 } } },
[LOAD_FROM_DICT_OR_DEREF] = { .nuops = 1, .uops = { { _LOAD_FROM_DICT_OR_DEREF, 0, 0 } } },
- [LOAD_GLOBAL] = { .nuops = 1, .uops = { { _LOAD_GLOBAL, 0, 0 } } },
- [LOAD_GLOBAL_BUILTIN] = { .nuops = 3, .uops = { { _GUARD_GLOBALS_VERSION, 1, 1 }, { _GUARD_BUILTINS_VERSION_PUSH_KEYS, 1, 2 }, { _LOAD_GLOBAL_BUILTINS_FROM_KEYS, 1, 3 } } },
- [LOAD_GLOBAL_MODULE] = { .nuops = 2, .uops = { { _GUARD_GLOBALS_VERSION_PUSH_KEYS, 1, 1 }, { _LOAD_GLOBAL_MODULE_FROM_KEYS, 1, 3 } } },
+ [LOAD_GLOBAL] = { .nuops = 2, .uops = { { _LOAD_GLOBAL, 0, 0 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
+ [LOAD_GLOBAL_BUILTIN] = { .nuops = 4, .uops = { { _GUARD_GLOBALS_VERSION, 1, 1 }, { _GUARD_BUILTINS_VERSION_PUSH_KEYS, 1, 2 }, { _LOAD_GLOBAL_BUILTINS_FROM_KEYS, 1, 3 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
+ [LOAD_GLOBAL_MODULE] = { .nuops = 3, .uops = { { _GUARD_GLOBALS_VERSION_PUSH_KEYS, 1, 1 }, { _LOAD_GLOBAL_MODULE_FROM_KEYS, 1, 3 }, { _PUSH_NULL_CONDITIONAL, 0, 0 } } },
[LOAD_LOCALS] = { .nuops = 1, .uops = { { _LOAD_LOCALS, 0, 0 } } },
[LOAD_NAME] = { .nuops = 1, .uops = { { _LOAD_NAME, 0, 0 } } },
[LOAD_SMALL_INT] = { .nuops = 1, .uops = { { _LOAD_SMALL_INT, 0, 0 } } },
diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h
index 066165a2c810d5..7a6c0d22fe24e5 100644
--- a/Include/internal/pycore_uop_ids.h
+++ b/Include/internal/pycore_uop_ids.h
@@ -180,127 +180,120 @@ extern "C" {
#define _LIST_EXTEND LIST_EXTEND
#define _LOAD_ATTR 410
#define _LOAD_ATTR_CLASS 411
-#define _LOAD_ATTR_CLASS_0 412
-#define _LOAD_ATTR_CLASS_1 413
#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN
-#define _LOAD_ATTR_INSTANCE_VALUE 414
-#define _LOAD_ATTR_INSTANCE_VALUE_0 415
-#define _LOAD_ATTR_INSTANCE_VALUE_1 416
-#define _LOAD_ATTR_METHOD_LAZY_DICT 417
-#define _LOAD_ATTR_METHOD_NO_DICT 418
-#define _LOAD_ATTR_METHOD_WITH_VALUES 419
-#define _LOAD_ATTR_MODULE 420
-#define _LOAD_ATTR_MODULE_FROM_KEYS 421
-#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 422
-#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 423
-#define _LOAD_ATTR_PROPERTY_FRAME 424
-#define _LOAD_ATTR_SLOT 425
-#define _LOAD_ATTR_SLOT_0 426
-#define _LOAD_ATTR_SLOT_1 427
-#define _LOAD_ATTR_WITH_HINT 428
+#define _LOAD_ATTR_INSTANCE_VALUE 412
+#define _LOAD_ATTR_METHOD_LAZY_DICT 413
+#define _LOAD_ATTR_METHOD_NO_DICT 414
+#define _LOAD_ATTR_METHOD_WITH_VALUES 415
+#define _LOAD_ATTR_MODULE 416
+#define _LOAD_ATTR_MODULE_FROM_KEYS 417
+#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 418
+#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 419
+#define _LOAD_ATTR_PROPERTY_FRAME 420
+#define _LOAD_ATTR_SLOT 421
+#define _LOAD_ATTR_WITH_HINT 422
#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS
-#define _LOAD_BYTECODE 429
+#define _LOAD_BYTECODE 423
#define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT
#define _LOAD_CONST LOAD_CONST
#define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL
-#define _LOAD_CONST_INLINE 430
-#define _LOAD_CONST_INLINE_BORROW 431
-#define _LOAD_CONST_INLINE_BORROW_WITH_NULL 432
-#define _LOAD_CONST_INLINE_WITH_NULL 433
+#define _LOAD_CONST_INLINE 424
+#define _LOAD_CONST_INLINE_BORROW 425
#define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL
#define _LOAD_DEREF LOAD_DEREF
-#define _LOAD_FAST 434
-#define _LOAD_FAST_0 435
-#define _LOAD_FAST_1 436
-#define _LOAD_FAST_2 437
-#define _LOAD_FAST_3 438
-#define _LOAD_FAST_4 439
-#define _LOAD_FAST_5 440
-#define _LOAD_FAST_6 441
-#define _LOAD_FAST_7 442
+#define _LOAD_FAST 426
+#define _LOAD_FAST_0 427
+#define _LOAD_FAST_1 428
+#define _LOAD_FAST_2 429
+#define _LOAD_FAST_3 430
+#define _LOAD_FAST_4 431
+#define _LOAD_FAST_5 432
+#define _LOAD_FAST_6 433
+#define _LOAD_FAST_7 434
#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 443
-#define _LOAD_GLOBAL_BUILTINS 444
-#define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 445
-#define _LOAD_GLOBAL_MODULE 446
-#define _LOAD_GLOBAL_MODULE_FROM_KEYS 447
+#define _LOAD_GLOBAL 435
+#define _LOAD_GLOBAL_BUILTINS 436
+#define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 437
+#define _LOAD_GLOBAL_MODULE 438
+#define _LOAD_GLOBAL_MODULE_FROM_KEYS 439
#define _LOAD_LOCALS LOAD_LOCALS
#define _LOAD_NAME LOAD_NAME
-#define _LOAD_SMALL_INT 448
-#define _LOAD_SMALL_INT_0 449
-#define _LOAD_SMALL_INT_1 450
-#define _LOAD_SMALL_INT_2 451
-#define _LOAD_SMALL_INT_3 452
+#define _LOAD_SMALL_INT 440
+#define _LOAD_SMALL_INT_0 441
+#define _LOAD_SMALL_INT_1 442
+#define _LOAD_SMALL_INT_2 443
+#define _LOAD_SMALL_INT_3 444
#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 453
+#define _MAKE_CALLARGS_A_TUPLE 445
#define _MAKE_CELL MAKE_CELL
#define _MAKE_FUNCTION MAKE_FUNCTION
-#define _MAKE_WARM 454
+#define _MAKE_WARM 446
#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 455
-#define _MAYBE_EXPAND_METHOD_KW 456
-#define _MONITOR_CALL 457
-#define _MONITOR_JUMP_BACKWARD 458
-#define _MONITOR_RESUME 459
+#define _MAYBE_EXPAND_METHOD 447
+#define _MAYBE_EXPAND_METHOD_KW 448
+#define _MONITOR_CALL 449
+#define _MONITOR_JUMP_BACKWARD 450
+#define _MONITOR_RESUME 451
#define _NOP NOP
#define _POP_EXCEPT POP_EXCEPT
-#define _POP_JUMP_IF_FALSE 460
-#define _POP_JUMP_IF_TRUE 461
+#define _POP_JUMP_IF_FALSE 452
+#define _POP_JUMP_IF_TRUE 453
#define _POP_TOP POP_TOP
-#define _POP_TOP_LOAD_CONST_INLINE_BORROW 462
+#define _POP_TOP_LOAD_CONST_INLINE_BORROW 454
#define _PUSH_EXC_INFO PUSH_EXC_INFO
-#define _PUSH_FRAME 463
+#define _PUSH_FRAME 455
#define _PUSH_NULL PUSH_NULL
-#define _PY_FRAME_GENERAL 464
-#define _PY_FRAME_KW 465
-#define _QUICKEN_RESUME 466
-#define _REPLACE_WITH_TRUE 467
+#define _PUSH_NULL_CONDITIONAL 456
+#define _PY_FRAME_GENERAL 457
+#define _PY_FRAME_KW 458
+#define _QUICKEN_RESUME 459
+#define _REPLACE_WITH_TRUE 460
#define _RESUME_CHECK RESUME_CHECK
#define _RETURN_GENERATOR RETURN_GENERATOR
#define _RETURN_VALUE RETURN_VALUE
-#define _SAVE_RETURN_OFFSET 468
-#define _SEND 469
-#define _SEND_GEN_FRAME 470
+#define _SAVE_RETURN_OFFSET 461
+#define _SEND 462
+#define _SEND_GEN_FRAME 463
#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 471
-#define _STORE_ATTR 472
-#define _STORE_ATTR_INSTANCE_VALUE 473
-#define _STORE_ATTR_SLOT 474
-#define _STORE_ATTR_WITH_HINT 475
+#define _START_EXECUTOR 464
+#define _STORE_ATTR 465
+#define _STORE_ATTR_INSTANCE_VALUE 466
+#define _STORE_ATTR_SLOT 467
+#define _STORE_ATTR_WITH_HINT 468
#define _STORE_DEREF STORE_DEREF
-#define _STORE_FAST 476
-#define _STORE_FAST_0 477
-#define _STORE_FAST_1 478
-#define _STORE_FAST_2 479
-#define _STORE_FAST_3 480
-#define _STORE_FAST_4 481
-#define _STORE_FAST_5 482
-#define _STORE_FAST_6 483
-#define _STORE_FAST_7 484
+#define _STORE_FAST 469
+#define _STORE_FAST_0 470
+#define _STORE_FAST_1 471
+#define _STORE_FAST_2 472
+#define _STORE_FAST_3 473
+#define _STORE_FAST_4 474
+#define _STORE_FAST_5 475
+#define _STORE_FAST_6 476
+#define _STORE_FAST_7 477
#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 485
-#define _STORE_SUBSCR 486
+#define _STORE_SLICE 478
+#define _STORE_SUBSCR 479
#define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT
#define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT
#define _SWAP SWAP
-#define _TIER2_RESUME_CHECK 487
-#define _TO_BOOL 488
+#define _TIER2_RESUME_CHECK 480
+#define _TO_BOOL 481
#define _TO_BOOL_BOOL TO_BOOL_BOOL
#define _TO_BOOL_INT TO_BOOL_INT
#define _TO_BOOL_LIST TO_BOOL_LIST
@@ -310,13 +303,13 @@ extern "C" {
#define _UNARY_NEGATIVE UNARY_NEGATIVE
#define _UNARY_NOT UNARY_NOT
#define _UNPACK_EX UNPACK_EX
-#define _UNPACK_SEQUENCE 489
+#define _UNPACK_SEQUENCE 482
#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 MAX_UOP_ID 489
+#define MAX_UOP_ID 482
#ifdef __cplusplus
}
diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h
index c9bef792e5b3e3..59740dbb57072e 100644
--- a/Include/internal/pycore_uop_metadata.h
+++ b/Include/internal/pycore_uop_metadata.h
@@ -124,11 +124,12 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_LOAD_LOCALS] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_LOAD_NAME] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_LOAD_GLOBAL] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
+ [_PUSH_NULL_CONDITIONAL] = HAS_ARG_FLAG,
[_GUARD_GLOBALS_VERSION] = HAS_DEOPT_FLAG,
[_GUARD_GLOBALS_VERSION_PUSH_KEYS] = HAS_DEOPT_FLAG,
[_GUARD_BUILTINS_VERSION_PUSH_KEYS] = HAS_DEOPT_FLAG,
- [_LOAD_GLOBAL_MODULE_FROM_KEYS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
- [_LOAD_GLOBAL_BUILTINS_FROM_KEYS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
+ [_LOAD_GLOBAL_MODULE_FROM_KEYS] = HAS_DEOPT_FLAG,
+ [_LOAD_GLOBAL_BUILTINS_FROM_KEYS] = HAS_DEOPT_FLAG,
[_DELETE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_MAKE_CELL] = HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
[_DELETE_DEREF] = HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
@@ -153,20 +154,14 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_GUARD_TYPE_VERSION] = HAS_EXIT_FLAG,
[_GUARD_TYPE_VERSION_AND_LOCK] = HAS_EXIT_FLAG,
[_CHECK_MANAGED_OBJECT_HAS_VALUES] = HAS_DEOPT_FLAG,
- [_LOAD_ATTR_INSTANCE_VALUE_0] = HAS_DEOPT_FLAG,
- [_LOAD_ATTR_INSTANCE_VALUE_1] = HAS_DEOPT_FLAG,
- [_LOAD_ATTR_INSTANCE_VALUE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_OPARG_AND_1_FLAG,
+ [_LOAD_ATTR_INSTANCE_VALUE] = HAS_DEOPT_FLAG,
[_CHECK_ATTR_MODULE_PUSH_KEYS] = HAS_DEOPT_FLAG,
- [_LOAD_ATTR_MODULE_FROM_KEYS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
+ [_LOAD_ATTR_MODULE_FROM_KEYS] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
[_CHECK_ATTR_WITH_HINT] = HAS_EXIT_FLAG,
[_LOAD_ATTR_WITH_HINT] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG,
- [_LOAD_ATTR_SLOT_0] = HAS_DEOPT_FLAG,
- [_LOAD_ATTR_SLOT_1] = HAS_DEOPT_FLAG,
- [_LOAD_ATTR_SLOT] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_OPARG_AND_1_FLAG,
+ [_LOAD_ATTR_SLOT] = HAS_DEOPT_FLAG,
[_CHECK_ATTR_CLASS] = HAS_EXIT_FLAG,
- [_LOAD_ATTR_CLASS_0] = 0,
- [_LOAD_ATTR_CLASS_1] = 0,
- [_LOAD_ATTR_CLASS] = HAS_ARG_FLAG | HAS_OPARG_AND_1_FLAG,
+ [_LOAD_ATTR_CLASS] = 0,
[_LOAD_ATTR_PROPERTY_FRAME] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
[_GUARD_DORV_NO_DICT] = HAS_EXIT_FLAG,
[_STORE_ATTR_INSTANCE_VALUE] = HAS_ESCAPES_FLAG,
@@ -258,7 +253,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_EXPAND_METHOD_KW] = HAS_ARG_FLAG | HAS_ESCAPES_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_CALLARGS_A_TUPLE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
+ [_MAKE_CALLARGS_A_TUPLE] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
[_MAKE_FUNCTION] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_SET_FUNCTION_ATTRIBUTE] = HAS_ARG_FLAG,
[_RETURN_GENERATOR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
@@ -282,12 +277,10 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_LOAD_CONST_INLINE] = HAS_PURE_FLAG,
[_LOAD_CONST_INLINE_BORROW] = HAS_PURE_FLAG,
[_POP_TOP_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
- [_LOAD_CONST_INLINE_WITH_NULL] = HAS_PURE_FLAG,
- [_LOAD_CONST_INLINE_BORROW_WITH_NULL] = HAS_PURE_FLAG,
[_CHECK_FUNCTION] = HAS_DEOPT_FLAG,
- [_LOAD_GLOBAL_MODULE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
- [_LOAD_GLOBAL_BUILTINS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
- [_LOAD_ATTR_MODULE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
+ [_LOAD_GLOBAL_MODULE] = HAS_DEOPT_FLAG,
+ [_LOAD_GLOBAL_BUILTINS] = HAS_DEOPT_FLAG,
+ [_LOAD_ATTR_MODULE] = HAS_DEOPT_FLAG,
[_DYNAMIC_EXIT] = HAS_ESCAPES_FLAG,
[_START_EXECUTOR] = HAS_ESCAPES_FLAG,
[_MAKE_WARM] = 0,
@@ -457,11 +450,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_LIST_EXTEND] = "_LIST_EXTEND",
[_LOAD_ATTR] = "_LOAD_ATTR",
[_LOAD_ATTR_CLASS] = "_LOAD_ATTR_CLASS",
- [_LOAD_ATTR_CLASS_0] = "_LOAD_ATTR_CLASS_0",
- [_LOAD_ATTR_CLASS_1] = "_LOAD_ATTR_CLASS_1",
[_LOAD_ATTR_INSTANCE_VALUE] = "_LOAD_ATTR_INSTANCE_VALUE",
- [_LOAD_ATTR_INSTANCE_VALUE_0] = "_LOAD_ATTR_INSTANCE_VALUE_0",
- [_LOAD_ATTR_INSTANCE_VALUE_1] = "_LOAD_ATTR_INSTANCE_VALUE_1",
[_LOAD_ATTR_METHOD_LAZY_DICT] = "_LOAD_ATTR_METHOD_LAZY_DICT",
[_LOAD_ATTR_METHOD_NO_DICT] = "_LOAD_ATTR_METHOD_NO_DICT",
[_LOAD_ATTR_METHOD_WITH_VALUES] = "_LOAD_ATTR_METHOD_WITH_VALUES",
@@ -471,16 +460,12 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = "_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES",
[_LOAD_ATTR_PROPERTY_FRAME] = "_LOAD_ATTR_PROPERTY_FRAME",
[_LOAD_ATTR_SLOT] = "_LOAD_ATTR_SLOT",
- [_LOAD_ATTR_SLOT_0] = "_LOAD_ATTR_SLOT_0",
- [_LOAD_ATTR_SLOT_1] = "_LOAD_ATTR_SLOT_1",
[_LOAD_ATTR_WITH_HINT] = "_LOAD_ATTR_WITH_HINT",
[_LOAD_BUILD_CLASS] = "_LOAD_BUILD_CLASS",
[_LOAD_COMMON_CONSTANT] = "_LOAD_COMMON_CONSTANT",
[_LOAD_CONST_IMMORTAL] = "_LOAD_CONST_IMMORTAL",
[_LOAD_CONST_INLINE] = "_LOAD_CONST_INLINE",
[_LOAD_CONST_INLINE_BORROW] = "_LOAD_CONST_INLINE_BORROW",
- [_LOAD_CONST_INLINE_BORROW_WITH_NULL] = "_LOAD_CONST_INLINE_BORROW_WITH_NULL",
- [_LOAD_CONST_INLINE_WITH_NULL] = "_LOAD_CONST_INLINE_WITH_NULL",
[_LOAD_CONST_MORTAL] = "_LOAD_CONST_MORTAL",
[_LOAD_DEREF] = "_LOAD_DEREF",
[_LOAD_FAST] = "_LOAD_FAST",
@@ -529,6 +514,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_PUSH_EXC_INFO] = "_PUSH_EXC_INFO",
[_PUSH_FRAME] = "_PUSH_FRAME",
[_PUSH_NULL] = "_PUSH_NULL",
+ [_PUSH_NULL_CONDITIONAL] = "_PUSH_NULL_CONDITIONAL",
[_PY_FRAME_GENERAL] = "_PY_FRAME_GENERAL",
[_PY_FRAME_KW] = "_PY_FRAME_KW",
[_REPLACE_WITH_TRUE] = "_REPLACE_WITH_TRUE",
@@ -797,6 +783,8 @@ int _PyUop_num_popped(int opcode, int oparg)
return 0;
case _LOAD_GLOBAL:
return 0;
+ case _PUSH_NULL_CONDITIONAL:
+ return 0;
case _GUARD_GLOBALS_VERSION:
return 0;
case _GUARD_GLOBALS_VERSION_PUSH_KEYS:
@@ -855,10 +843,6 @@ int _PyUop_num_popped(int opcode, int oparg)
return 0;
case _CHECK_MANAGED_OBJECT_HAS_VALUES:
return 0;
- case _LOAD_ATTR_INSTANCE_VALUE_0:
- return 1;
- case _LOAD_ATTR_INSTANCE_VALUE_1:
- return 1;
case _LOAD_ATTR_INSTANCE_VALUE:
return 1;
case _CHECK_ATTR_MODULE_PUSH_KEYS:
@@ -869,18 +853,10 @@ int _PyUop_num_popped(int opcode, int oparg)
return 0;
case _LOAD_ATTR_WITH_HINT:
return 2;
- case _LOAD_ATTR_SLOT_0:
- return 1;
- case _LOAD_ATTR_SLOT_1:
- return 1;
case _LOAD_ATTR_SLOT:
return 1;
case _CHECK_ATTR_CLASS:
return 0;
- case _LOAD_ATTR_CLASS_0:
- return 1;
- case _LOAD_ATTR_CLASS_1:
- return 1;
case _LOAD_ATTR_CLASS:
return 1;
case _LOAD_ATTR_PROPERTY_FRAME:
@@ -1066,7 +1042,7 @@ int _PyUop_num_popped(int opcode, int oparg)
case _CALL_KW_NON_PY:
return 3 + oparg;
case _MAKE_CALLARGS_A_TUPLE:
- return 1 + (oparg & 1);
+ return 2;
case _MAKE_FUNCTION:
return 1;
case _SET_FUNCTION_ATTRIBUTE:
@@ -1074,7 +1050,7 @@ int _PyUop_num_popped(int opcode, int oparg)
case _RETURN_GENERATOR:
return 0;
case _BUILD_SLICE:
- return 2 + ((oparg == 3) ? 1 : 0);
+ return oparg;
case _CONVERT_VALUE:
return 1;
case _FORMAT_SIMPLE:
@@ -1113,10 +1089,6 @@ int _PyUop_num_popped(int opcode, int oparg)
return 0;
case _POP_TOP_LOAD_CONST_INLINE_BORROW:
return 1;
- case _LOAD_CONST_INLINE_WITH_NULL:
- return 0;
- case _LOAD_CONST_INLINE_BORROW_WITH_NULL:
- return 0;
case _CHECK_FUNCTION:
return 0;
case _LOAD_GLOBAL_MODULE:
diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h
index 06b207b347e504..c3b58825bfc938 100644
--- a/Include/opcode_ids.h
+++ b/Include/opcode_ids.h
@@ -14,55 +14,55 @@ extern "C" {
#define BINARY_SLICE 1
#define BINARY_SUBSCR 2
#define BINARY_OP_INPLACE_ADD_UNICODE 3
-#define CHECK_EG_MATCH 4
-#define CHECK_EXC_MATCH 5
-#define CLEANUP_THROW 6
-#define DELETE_SUBSCR 7
-#define END_ASYNC_FOR 8
-#define END_FOR 9
-#define END_SEND 10
-#define EXIT_INIT_CHECK 11
-#define FORMAT_SIMPLE 12
-#define FORMAT_WITH_SPEC 13
-#define GET_AITER 14
-#define GET_ANEXT 15
-#define GET_ITER 16
+#define CALL_FUNCTION_EX 4
+#define CHECK_EG_MATCH 5
+#define CHECK_EXC_MATCH 6
+#define CLEANUP_THROW 7
+#define DELETE_SUBSCR 8
+#define END_ASYNC_FOR 9
+#define END_FOR 10
+#define END_SEND 11
+#define EXIT_INIT_CHECK 12
+#define FORMAT_SIMPLE 13
+#define FORMAT_WITH_SPEC 14
+#define GET_AITER 15
+#define GET_ANEXT 16
#define RESERVED 17
-#define GET_LEN 18
-#define GET_YIELD_FROM_ITER 19
-#define INTERPRETER_EXIT 20
-#define LOAD_BUILD_CLASS 21
-#define LOAD_LOCALS 22
-#define MAKE_FUNCTION 23
-#define MATCH_KEYS 24
-#define MATCH_MAPPING 25
-#define MATCH_SEQUENCE 26
-#define NOP 27
-#define NOT_TAKEN 28
-#define POP_EXCEPT 29
-#define POP_ITER 30
-#define POP_TOP 31
-#define PUSH_EXC_INFO 32
-#define PUSH_NULL 33
-#define RETURN_GENERATOR 34
-#define RETURN_VALUE 35
-#define SETUP_ANNOTATIONS 36
-#define STORE_SLICE 37
-#define STORE_SUBSCR 38
-#define TO_BOOL 39
-#define UNARY_INVERT 40
-#define UNARY_NEGATIVE 41
-#define UNARY_NOT 42
-#define WITH_EXCEPT_START 43
-#define BINARY_OP 44
-#define BUILD_LIST 45
-#define BUILD_MAP 46
-#define BUILD_SET 47
-#define BUILD_SLICE 48
-#define BUILD_STRING 49
-#define BUILD_TUPLE 50
-#define CALL 51
-#define CALL_FUNCTION_EX 52
+#define GET_ITER 18
+#define GET_LEN 19
+#define GET_YIELD_FROM_ITER 20
+#define INTERPRETER_EXIT 21
+#define LOAD_BUILD_CLASS 22
+#define LOAD_LOCALS 23
+#define MAKE_FUNCTION 24
+#define MATCH_KEYS 25
+#define MATCH_MAPPING 26
+#define MATCH_SEQUENCE 27
+#define NOP 28
+#define NOT_TAKEN 29
+#define POP_EXCEPT 30
+#define POP_ITER 31
+#define POP_TOP 32
+#define PUSH_EXC_INFO 33
+#define PUSH_NULL 34
+#define RETURN_GENERATOR 35
+#define RETURN_VALUE 36
+#define SETUP_ANNOTATIONS 37
+#define STORE_SLICE 38
+#define STORE_SUBSCR 39
+#define TO_BOOL 40
+#define UNARY_INVERT 41
+#define UNARY_NEGATIVE 42
+#define UNARY_NOT 43
+#define WITH_EXCEPT_START 44
+#define BINARY_OP 45
+#define BUILD_LIST 46
+#define BUILD_MAP 47
+#define BUILD_SET 48
+#define BUILD_SLICE 49
+#define BUILD_STRING 50
+#define BUILD_TUPLE 51
+#define CALL 52
#define CALL_INTRINSIC_1 53
#define CALL_INTRINSIC_2 54
#define CALL_KW 55
@@ -241,7 +241,7 @@ extern "C" {
#define SETUP_WITH 264
#define STORE_FAST_MAYBE_NULL 265
-#define HAVE_ARGUMENT 43
+#define HAVE_ARGUMENT 44
#define MIN_SPECIALIZED_OPCODE 150
#define MIN_INSTRUMENTED_OPCODE 235
diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py
index 7dd528ef74df33..459f7411296bcd 100644
--- a/Lib/_opcode_metadata.py
+++ b/Lib/_opcode_metadata.py
@@ -212,54 +212,54 @@
'ENTER_EXECUTOR': 255,
'BINARY_SLICE': 1,
'BINARY_SUBSCR': 2,
- 'CHECK_EG_MATCH': 4,
- 'CHECK_EXC_MATCH': 5,
- 'CLEANUP_THROW': 6,
- 'DELETE_SUBSCR': 7,
- 'END_ASYNC_FOR': 8,
- 'END_FOR': 9,
- 'END_SEND': 10,
- 'EXIT_INIT_CHECK': 11,
- 'FORMAT_SIMPLE': 12,
- 'FORMAT_WITH_SPEC': 13,
- 'GET_AITER': 14,
- 'GET_ANEXT': 15,
- 'GET_ITER': 16,
- 'GET_LEN': 18,
- 'GET_YIELD_FROM_ITER': 19,
- 'INTERPRETER_EXIT': 20,
- 'LOAD_BUILD_CLASS': 21,
- 'LOAD_LOCALS': 22,
- 'MAKE_FUNCTION': 23,
- 'MATCH_KEYS': 24,
- 'MATCH_MAPPING': 25,
- 'MATCH_SEQUENCE': 26,
- 'NOP': 27,
- 'NOT_TAKEN': 28,
- 'POP_EXCEPT': 29,
- 'POP_ITER': 30,
- 'POP_TOP': 31,
- 'PUSH_EXC_INFO': 32,
- 'PUSH_NULL': 33,
- 'RETURN_GENERATOR': 34,
- 'RETURN_VALUE': 35,
- 'SETUP_ANNOTATIONS': 36,
- 'STORE_SLICE': 37,
- 'STORE_SUBSCR': 38,
- 'TO_BOOL': 39,
- 'UNARY_INVERT': 40,
- 'UNARY_NEGATIVE': 41,
- 'UNARY_NOT': 42,
- 'WITH_EXCEPT_START': 43,
- 'BINARY_OP': 44,
- 'BUILD_LIST': 45,
- 'BUILD_MAP': 46,
- 'BUILD_SET': 47,
- 'BUILD_SLICE': 48,
- 'BUILD_STRING': 49,
- 'BUILD_TUPLE': 50,
- 'CALL': 51,
- 'CALL_FUNCTION_EX': 52,
+ 'CALL_FUNCTION_EX': 4,
+ 'CHECK_EG_MATCH': 5,
+ 'CHECK_EXC_MATCH': 6,
+ 'CLEANUP_THROW': 7,
+ 'DELETE_SUBSCR': 8,
+ 'END_ASYNC_FOR': 9,
+ 'END_FOR': 10,
+ 'END_SEND': 11,
+ 'EXIT_INIT_CHECK': 12,
+ 'FORMAT_SIMPLE': 13,
+ 'FORMAT_WITH_SPEC': 14,
+ 'GET_AITER': 15,
+ 'GET_ANEXT': 16,
+ 'GET_ITER': 18,
+ 'GET_LEN': 19,
+ 'GET_YIELD_FROM_ITER': 20,
+ 'INTERPRETER_EXIT': 21,
+ 'LOAD_BUILD_CLASS': 22,
+ 'LOAD_LOCALS': 23,
+ 'MAKE_FUNCTION': 24,
+ 'MATCH_KEYS': 25,
+ 'MATCH_MAPPING': 26,
+ 'MATCH_SEQUENCE': 27,
+ 'NOP': 28,
+ 'NOT_TAKEN': 29,
+ 'POP_EXCEPT': 30,
+ 'POP_ITER': 31,
+ 'POP_TOP': 32,
+ 'PUSH_EXC_INFO': 33,
+ 'PUSH_NULL': 34,
+ 'RETURN_GENERATOR': 35,
+ 'RETURN_VALUE': 36,
+ 'SETUP_ANNOTATIONS': 37,
+ 'STORE_SLICE': 38,
+ 'STORE_SUBSCR': 39,
+ 'TO_BOOL': 40,
+ 'UNARY_INVERT': 41,
+ 'UNARY_NEGATIVE': 42,
+ 'UNARY_NOT': 43,
+ 'WITH_EXCEPT_START': 44,
+ 'BINARY_OP': 45,
+ 'BUILD_LIST': 46,
+ 'BUILD_MAP': 47,
+ 'BUILD_SET': 48,
+ 'BUILD_SLICE': 49,
+ 'BUILD_STRING': 50,
+ 'BUILD_TUPLE': 51,
+ 'CALL': 52,
'CALL_INTRINSIC_1': 53,
'CALL_INTRINSIC_2': 54,
'CALL_KW': 55,
@@ -356,5 +356,5 @@
'STORE_FAST_MAYBE_NULL': 265,
}
-HAVE_ARGUMENT = 43
+HAVE_ARGUMENT = 44
MIN_INSTRUMENTED_OPCODE = 235
diff --git a/Lib/test/test__opcode.py b/Lib/test/test__opcode.py
index 95e09500df51d0..4b11e83ae59a78 100644
--- a/Lib/test/test__opcode.py
+++ b/Lib/test/test__opcode.py
@@ -65,8 +65,7 @@ def check_function(self, func, expected):
class StackEffectTests(unittest.TestCase):
def test_stack_effect(self):
self.assertEqual(stack_effect(dis.opmap['POP_TOP']), -1)
- self.assertEqual(stack_effect(dis.opmap['BUILD_SLICE'], 0), -1)
- self.assertEqual(stack_effect(dis.opmap['BUILD_SLICE'], 1), -1)
+ self.assertEqual(stack_effect(dis.opmap['BUILD_SLICE'], 2), -1)
self.assertEqual(stack_effect(dis.opmap['BUILD_SLICE'], 3), -2)
self.assertRaises(ValueError, stack_effect, 30000)
# All defined opcodes
diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py
index 9cfc6c142da6cd..6a2f7726222f9b 100644
--- a/Lib/test/test_capi/test_opt.py
+++ b/Lib/test/test_capi/test_opt.py
@@ -711,7 +711,7 @@ def testfunc(n):
assert ex is not None
uops = get_opnames(ex)
assert "_LOAD_GLOBAL_BUILTINS" not in uops
- assert "_LOAD_CONST_INLINE_BORROW_WITH_NULL" in uops
+ assert "_LOAD_CONST_INLINE_BORROW" in uops
"""))
self.assertEqual(result[0].rc, 0, result)
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index da57aad2f84fbd..df4bdf4a3dd312 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -1711,9 +1711,9 @@ def _prepare_test_cases():
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='BUILD_TUPLE', opcode=50, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='BUILD_TUPLE', opcode=51, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='MAKE_FUNCTION', opcode=23, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='MAKE_FUNCTION', opcode=24, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=105, arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=105, arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
Instruction(opname='STORE_FAST', opcode=109, arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
@@ -1722,13 +1722,13 @@ def _prepare_test_cases():
Instruction(opname='LOAD_DEREF', opcode=82, arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=1, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=40, start_offset=40, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='BUILD_LIST', opcode=45, arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='BUILD_MAP', opcode=46, arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='BUILD_LIST', opcode=46, arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='BUILD_MAP', opcode=47, arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=2, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8, label=None, positions=None, cache_info=None),
- Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, label=None, positions=None, cache_info=None),
+ Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, label=None, positions=None, cache_info=None),
]
expected_opinfo_f = [
@@ -1741,9 +1741,9 @@ def _prepare_test_cases():
Instruction(opname='LOAD_FAST', opcode=83, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='BUILD_TUPLE', opcode=50, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='BUILD_TUPLE', opcode=51, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='MAKE_FUNCTION', opcode=23, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='MAKE_FUNCTION', opcode=24, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=105, arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=105, arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='STORE_FAST', opcode=109, arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
@@ -1752,10 +1752,10 @@ def _prepare_test_cases():
Instruction(opname='LOAD_DEREF', opcode=82, arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_DEREF', opcode=82, arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_DEREF', opcode=82, arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, label=None, positions=None, cache_info=None),
- Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, label=None, positions=None, cache_info=None),
+ Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, label=None, positions=None, cache_info=None),
]
expected_opinfo_inner = [
@@ -1767,140 +1767,140 @@ def _prepare_test_cases():
Instruction(opname='LOAD_DEREF', opcode=82, arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_DEREF', opcode=82, arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=86, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=36, start_offset=36, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=36, start_offset=36, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
]
expected_opinfo_jumpy = [
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=10, argval=10, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='GET_ITER', opcode=16, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='GET_ITER', opcode=18, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='FOR_ITER', opcode=69, arg=32, argval=92, argrepr='to L4', offset=24, start_offset=24, starts_line=False, line_number=3, label=1, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='STORE_FAST', opcode=109, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=4, argval=4, argrepr='', offset=54, start_offset=54, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
Instruction(opname='COMPARE_OP', opcode=56, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=3, argval=70, argrepr='to L2', offset=60, start_offset=60, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=64, start_offset=64, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=64, start_offset=64, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD', opcode=74, arg=23, argval=24, argrepr='to L1', offset=66, start_offset=66, starts_line=True, line_number=6, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=70, start_offset=70, starts_line=True, line_number=7, label=2, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=6, argval=6, argrepr='', offset=72, start_offset=72, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
Instruction(opname='COMPARE_OP', opcode=56, arg=148, argval='>', argrepr='bool(>)', offset=74, start_offset=74, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=3, argval=88, argrepr='to L3', offset=78, start_offset=78, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=82, start_offset=82, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=82, start_offset=82, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD', opcode=74, arg=32, argval=24, argrepr='to L1', offset=84, start_offset=84, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=8, label=3, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=8, label=3, positions=None, cache_info=None),
Instruction(opname='JUMP_FORWARD', opcode=76, arg=13, argval=118, argrepr='to L5', offset=90, start_offset=90, starts_line=False, line_number=8, label=None, positions=None, cache_info=None),
- Instruction(opname='END_FOR', opcode=9, arg=None, argval=None, argrepr='', offset=92, start_offset=92, starts_line=True, line_number=3, label=4, positions=None, cache_info=None),
- Instruction(opname='POP_ITER', opcode=30, arg=None, argval=None, argrepr='', offset=94, start_offset=94, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='END_FOR', opcode=10, arg=None, argval=None, argrepr='', offset=92, start_offset=92, starts_line=True, line_number=3, label=4, positions=None, cache_info=None),
+ Instruction(opname='POP_ITER', opcode=31, arg=None, argval=None, argrepr='', offset=94, start_offset=94, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=96, start_offset=96, starts_line=True, line_number=10, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=106, start_offset=106, starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=108, start_offset=108, starts_line=False, line_number=10, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=116, start_offset=116, starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=108, start_offset=108, starts_line=False, line_number=10, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=116, start_offset=116, starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST_CHECK', opcode=85, arg=0, argval='i', argrepr='i', offset=118, start_offset=118, starts_line=True, line_number=11, label=5, positions=None, cache_info=None),
- Instruction(opname='TO_BOOL', opcode=39, arg=None, argval=None, argrepr='', offset=120, start_offset=120, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='TO_BOOL', opcode=40, arg=None, argval=None, argrepr='', offset=120, start_offset=120, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=40, argval=212, argrepr='to L8', offset=128, start_offset=128, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=11, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=11, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=134, start_offset=134, starts_line=True, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=144, start_offset=144, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=146, start_offset=146, starts_line=False, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=154, start_offset=154, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=146, start_offset=146, starts_line=False, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=154, start_offset=154, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=True, line_number=13, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=158, start_offset=158, starts_line=False, line_number=13, label=None, positions=None, cache_info=None),
- Instruction(opname='BINARY_OP', opcode=44, arg=23, argval=23, argrepr='-=', offset=160, start_offset=160, starts_line=False, line_number=13, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
+ Instruction(opname='BINARY_OP', opcode=45, arg=23, argval=23, argrepr='-=', offset=160, start_offset=160, starts_line=False, line_number=13, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
Instruction(opname='STORE_FAST', opcode=109, arg=0, argval='i', argrepr='i', offset=172, start_offset=172, starts_line=False, line_number=13, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=True, line_number=14, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=6, argval=6, argrepr='', offset=176, start_offset=176, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
Instruction(opname='COMPARE_OP', opcode=56, arg=148, argval='>', argrepr='bool(>)', offset=178, start_offset=178, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=3, argval=192, argrepr='to L6', offset=182, start_offset=182, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=186, start_offset=186, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=186, start_offset=186, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD', opcode=74, arg=37, argval=118, argrepr='to L5', offset=188, start_offset=188, starts_line=True, line_number=15, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=192, start_offset=192, starts_line=True, line_number=16, label=6, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=4, argval=4, argrepr='', offset=194, start_offset=194, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
Instruction(opname='COMPARE_OP', opcode=56, arg=18, argval='<', argrepr='bool(<)', offset=196, start_offset=196, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=3, argval=210, argrepr='to L7', offset=200, start_offset=200, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=204, start_offset=204, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=204, start_offset=204, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD', opcode=74, arg=46, argval=118, argrepr='to L5', offset=206, start_offset=206, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='JUMP_FORWARD', opcode=76, arg=11, argval=234, argrepr='to L9', offset=210, start_offset=210, starts_line=True, line_number=17, label=7, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=212, start_offset=212, starts_line=True, line_number=19, label=8, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=1, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=222, start_offset=222, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=224, start_offset=224, starts_line=False, line_number=19, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=232, start_offset=232, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
- Instruction(opname='NOP', opcode=27, arg=None, argval=None, argrepr='', offset=234, start_offset=234, starts_line=True, line_number=20, label=9, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=224, start_offset=224, starts_line=False, line_number=19, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=232, start_offset=232, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOP', opcode=28, arg=None, argval=None, argrepr='', offset=234, start_offset=234, starts_line=True, line_number=20, label=9, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=236, start_offset=236, starts_line=True, line_number=21, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=0, argval=0, argrepr='', offset=238, start_offset=238, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
- Instruction(opname='BINARY_OP', opcode=44, arg=11, argval=11, argrepr='/', offset=240, start_offset=240, starts_line=False, line_number=21, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=252, start_offset=252, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
+ Instruction(opname='BINARY_OP', opcode=45, arg=11, argval=11, argrepr='/', offset=240, start_offset=240, starts_line=False, line_number=21, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=252, start_offset=252, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=254, start_offset=254, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='COPY', opcode=59, arg=1, argval=1, argrepr='', offset=256, start_offset=256, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SPECIAL', opcode=92, arg=1, argval=1, argrepr='__exit__', offset=258, start_offset=258, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='SWAP', opcode=114, arg=2, argval=2, argrepr='', offset=260, start_offset=260, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='SWAP', opcode=114, arg=3, argval=3, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SPECIAL', opcode=92, arg=0, argval=0, argrepr='__enter__', offset=264, start_offset=264, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=0, argval=0, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='CALL', opcode=52, arg=0, argval=0, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='STORE_FAST', opcode=109, arg=1, argval='dodgy', argrepr='dodgy', offset=274, start_offset=274, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=276, start_offset=276, starts_line=True, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=2, argval='Never reach this', argrepr="'Never reach this'", offset=286, start_offset=286, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=288, start_offset=288, starts_line=False, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=288, start_offset=288, starts_line=False, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=298, start_offset=298, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=300, start_offset=300, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=302, start_offset=302, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=3, argval=3, argrepr='', offset=304, start_offset=304, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=3, argval=3, argrepr='', offset=304, start_offset=304, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=314, start_offset=314, starts_line=True, line_number=28, label=10, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=324, start_offset=324, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=334, start_offset=334, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=334, start_offset=334, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=336, start_offset=336, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=338, start_offset=338, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='WITH_EXCEPT_START', opcode=43, arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='TO_BOOL', opcode=39, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=338, start_offset=338, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='WITH_EXCEPT_START', opcode=44, arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='TO_BOOL', opcode=40, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=2, argval=360, argrepr='to L11', offset=352, start_offset=352, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=2, argval=2, argrepr='', offset=358, start_offset=358, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25, label=11, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25, label=11, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=75, arg=29, argval=314, argrepr='to L10', offset=370, start_offset=370, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=372, start_offset=372, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=374, start_offset=374, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=374, start_offset=374, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=380, start_offset=380, starts_line=True, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='CHECK_EXC_MATCH', opcode=5, arg=None, argval=None, argrepr='', offset=390, start_offset=390, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
+ Instruction(opname='CHECK_EXC_MATCH', opcode=6, arg=None, argval=None, argrepr='', offset=390, start_offset=390, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=15, argval=426, argrepr='to L12', offset=392, start_offset=392, starts_line=False, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=400, start_offset=400, starts_line=True, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=4, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=410, start_offset=410, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=412, start_offset=412, starts_line=False, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=420, start_offset=420, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=412, start_offset=412, starts_line=False, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=420, start_offset=420, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=75, arg=56, argval=314, argrepr='to L10', offset=424, start_offset=424, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=426, start_offset=426, starts_line=True, line_number=22, label=12, positions=None, cache_info=None),
Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=428, start_offset=428, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=432, start_offset=432, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=436, start_offset=436, starts_line=True, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=446, start_offset=446, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=448, start_offset=448, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=456, start_offset=456, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=448, start_offset=448, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=456, start_offset=456, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=458, start_offset=458, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=460, start_offset=460, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=462, start_offset=462, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=462, start_offset=462, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=464, start_offset=464, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
]
@@ -1909,7 +1909,7 @@ def simple(): pass
expected_opinfo_simple = [
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=simple.__code__.co_firstlineno, label=None, positions=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno, label=None),
- Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=4, start_offset=4, starts_line=False, line_number=simple.__code__.co_firstlineno, label=None),
+ Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=4, start_offset=4, starts_line=False, line_number=simple.__code__.co_firstlineno, label=None),
]
diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h
index 4f6933ac0ddcd6..1442434f9eba26 100644
--- a/Programs/test_frozenmain.h
+++ b/Programs/test_frozenmain.h
@@ -2,17 +2,17 @@
unsigned char M_test_frozenmain[] = {
227,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,
0,0,0,0,0,243,168,0,0,0,149,0,91,0,81,0,
- 72,0,113,0,91,0,81,0,72,1,113,1,90,2,33,0,
- 81,1,51,1,0,0,0,0,0,0,31,0,90,2,33,0,
+ 72,0,113,0,91,0,81,0,72,1,113,1,90,2,34,0,
+ 81,1,52,1,0,0,0,0,0,0,32,0,90,2,34,0,
81,2,90,0,79,6,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,51,2,0,0,0,0,0,0,
- 31,0,90,1,79,8,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,33,0,51,0,0,0,0,0,
- 0,0,81,3,2,0,0,0,113,5,81,4,16,0,69,20,
- 0,0,113,6,90,2,33,0,81,5,90,6,12,0,81,6,
- 90,5,90,6,2,0,0,0,12,0,49,4,51,1,0,0,
- 0,0,0,0,31,0,74,22,0,0,9,0,30,0,81,0,
- 35,0,41,7,78,122,18,70,114,111,122,101,110,32,72,101,
+ 0,0,0,0,0,0,0,0,52,2,0,0,0,0,0,0,
+ 32,0,90,1,79,8,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,34,0,52,0,0,0,0,0,
+ 0,0,81,3,2,0,0,0,113,5,81,4,18,0,69,20,
+ 0,0,113,6,90,2,34,0,81,5,90,6,13,0,81,6,
+ 90,5,90,6,2,0,0,0,13,0,50,4,52,1,0,0,
+ 0,0,0,0,32,0,74,22,0,0,10,0,31,0,81,0,
+ 36,0,41,7,78,122,18,70,114,111,122,101,110,32,72,101,
108,108,111,32,87,111,114,108,100,122,8,115,121,115,46,97,
114,103,118,218,6,99,111,110,102,105,103,41,5,218,12,112,
114,111,103,114,97,109,95,110,97,109,101,218,10,101,120,101,
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 940ea9d4da6e41..5f0be8d3feefd4 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1665,10 +1665,13 @@ dummy_func(
}
// res[1] because we need a pointer to res to pass it to _PyEval_LoadGlobalStackRef
- op(_LOAD_GLOBAL, ( -- res[1], null if (oparg & 1))) {
+ op(_LOAD_GLOBAL, ( -- res[1])) {
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
_PyEval_LoadGlobalStackRef(GLOBALS(), BUILTINS(), name, res);
ERROR_IF(PyStackRef_IsNull(*res), error);
+ }
+
+ op(_PUSH_NULL_CONDITIONAL, ( -- null if (oparg & 1))) {
null = PyStackRef_NULL;
}
@@ -1677,7 +1680,8 @@ dummy_func(
counter/1 +
globals_version/1 +
builtins_version/1 +
- _LOAD_GLOBAL;
+ _LOAD_GLOBAL +
+ _PUSH_NULL_CONDITIONAL;
op(_GUARD_GLOBALS_VERSION, (version/1 --)) {
PyDictObject *dict = (PyDictObject *)GLOBALS();
@@ -1707,7 +1711,7 @@ dummy_func(
assert(DK_IS_UNICODE(builtins_keys));
}
- op(_LOAD_GLOBAL_MODULE_FROM_KEYS, (index/1, globals_keys: PyDictKeysObject* -- res, null if (oparg & 1))) {
+ op(_LOAD_GLOBAL_MODULE_FROM_KEYS, (index/1, globals_keys: PyDictKeysObject* -- res)) {
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(globals_keys);
PyObject *res_o = FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
DEAD(globals_keys);
@@ -1721,10 +1725,9 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o);
#endif
STAT_INC(LOAD_GLOBAL, hit);
- null = PyStackRef_NULL;
}
- op(_LOAD_GLOBAL_BUILTINS_FROM_KEYS, (index/1, builtins_keys: PyDictKeysObject* -- res, null if (oparg & 1))) {
+ op(_LOAD_GLOBAL_BUILTINS_FROM_KEYS, (index/1, builtins_keys: PyDictKeysObject* -- res)) {
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(builtins_keys);
PyObject *res_o = FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
DEAD(builtins_keys);
@@ -1738,20 +1741,21 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o);
#endif
STAT_INC(LOAD_GLOBAL, hit);
- null = PyStackRef_NULL;
}
macro(LOAD_GLOBAL_MODULE) =
unused/1 + // Skip over the counter
_GUARD_GLOBALS_VERSION_PUSH_KEYS +
unused/1 + // Skip over the builtins version
- _LOAD_GLOBAL_MODULE_FROM_KEYS;
+ _LOAD_GLOBAL_MODULE_FROM_KEYS +
+ _PUSH_NULL_CONDITIONAL;
macro(LOAD_GLOBAL_BUILTIN) =
unused/1 + // Skip over the counter
_GUARD_GLOBALS_VERSION +
_GUARD_BUILTINS_VERSION_PUSH_KEYS +
- _LOAD_GLOBAL_BUILTINS_FROM_KEYS;
+ _LOAD_GLOBAL_BUILTINS_FROM_KEYS +
+ _PUSH_NULL_CONDITIONAL;
inst(DELETE_FAST, (--)) {
_PyStackRef v = GETLOCAL(oparg);
@@ -2030,7 +2034,7 @@ dummy_func(
#endif /* ENABLE_SPECIALIZATION_FT */
}
- tier1 op(_LOAD_SUPER_ATTR, (global_super_st, class_st, self_st -- attr, null if (oparg & 1))) {
+ tier1 op(_LOAD_SUPER_ATTR, (global_super_st, class_st, self_st -- attr)) {
PyObject *global_super = PyStackRef_AsPyObjectBorrow(global_super_st);
PyObject *class = PyStackRef_AsPyObjectBorrow(class_st);
PyObject *self = PyStackRef_AsPyObjectBorrow(self_st);
@@ -2072,12 +2076,11 @@ dummy_func(
Py_DECREF(super);
ERROR_IF(attr_o == NULL, error);
attr = PyStackRef_FromPyObjectSteal(attr_o);
- null = PyStackRef_NULL;
}
- macro(LOAD_SUPER_ATTR) = _SPECIALIZE_LOAD_SUPER_ATTR + _LOAD_SUPER_ATTR;
+ macro(LOAD_SUPER_ATTR) = _SPECIALIZE_LOAD_SUPER_ATTR + _LOAD_SUPER_ATTR + _PUSH_NULL_CONDITIONAL;
- inst(LOAD_SUPER_ATTR_ATTR, (unused/1, global_super_st, class_st, self_st -- attr_st, unused if (0))) {
+ inst(LOAD_SUPER_ATTR_ATTR, (unused/1, global_super_st, class_st, self_st -- attr_st)) {
PyObject *global_super = PyStackRef_AsPyObjectBorrow(global_super_st);
PyObject *class = PyStackRef_AsPyObjectBorrow(class_st);
PyObject *self = PyStackRef_AsPyObjectBorrow(self_st);
@@ -2152,7 +2155,7 @@ dummy_func(
#endif /* ENABLE_SPECIALIZATION_FT */
}
- op(_LOAD_ATTR, (owner -- attr, self_or_null if (oparg & 1))) {
+ op(_LOAD_ATTR, (owner -- attr, self_or_null[oparg&1])) {
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 1);
PyObject *attr_o;
if (oparg & 1) {
@@ -2165,7 +2168,7 @@ dummy_func(
meth | self | arg1 | ... | argN
*/
assert(attr_o != NULL); // No errors on this branch
- self_or_null = owner; // Transfer ownership
+ self_or_null[0] = owner; // Transfer ownership
DEAD(owner);
}
else {
@@ -2177,7 +2180,7 @@ dummy_func(
*/
DECREF_INPUTS();
ERROR_IF(attr_o == NULL, error);
- self_or_null = PyStackRef_NULL;
+ self_or_null[0] = PyStackRef_NULL;
}
}
else {
@@ -2185,12 +2188,11 @@ dummy_func(
attr_o = PyObject_GetAttr(PyStackRef_AsPyObjectBorrow(owner), name);
DECREF_INPUTS();
ERROR_IF(attr_o == NULL, error);
- /* We need to define self_or_null on all paths */
- self_or_null = PyStackRef_NULL;
}
attr = PyStackRef_FromPyObjectSteal(attr_o);
}
+
macro(LOAD_ATTR) =
_SPECIALIZE_LOAD_ATTR +
unused/8 +
@@ -2220,7 +2222,7 @@ dummy_func(
DEOPT_IF(!FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid));
}
- split op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr)) {
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
PyObject *attr_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(*value_ptr);
@@ -2233,7 +2235,6 @@ dummy_func(
attr = PyStackRef_FromPyObjectNew(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
DECREF_INPUTS();
}
@@ -2242,7 +2243,8 @@ dummy_func(
_GUARD_TYPE_VERSION +
_CHECK_MANAGED_OBJECT_HAS_VALUES +
_LOAD_ATTR_INSTANCE_VALUE +
- unused/5; // Skip over rest of cache
+ unused/5 +
+ _PUSH_NULL_CONDITIONAL;
op(_CHECK_ATTR_MODULE_PUSH_KEYS, (dict_version/2, owner -- owner, mod_keys: PyDictKeysObject *)) {
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
@@ -2254,7 +2256,7 @@ dummy_func(
mod_keys = keys;
}
- op(_LOAD_ATTR_MODULE_FROM_KEYS, (index/1, owner, mod_keys: PyDictKeysObject * -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_MODULE_FROM_KEYS, (index/1, owner, mod_keys: PyDictKeysObject * -- attr)) {
assert(mod_keys->dk_kind == DICT_KEYS_UNICODE);
assert(index < FT_ATOMIC_LOAD_SSIZE_RELAXED(mod_keys->dk_nentries));
PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(mod_keys) + index;
@@ -2272,7 +2274,6 @@ dummy_func(
attr = PyStackRef_FromPyObjectSteal(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
}
@@ -2280,7 +2281,8 @@ dummy_func(
unused/1 +
_CHECK_ATTR_MODULE_PUSH_KEYS +
_LOAD_ATTR_MODULE_FROM_KEYS +
- unused/5;
+ unused/5 +
+ _PUSH_NULL_CONDITIONAL;
op(_CHECK_ATTR_WITH_HINT, (owner -- owner, dict: PyDictObject *)) {
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
@@ -2292,7 +2294,7 @@ dummy_func(
dict = dict_o;
}
- op(_LOAD_ATTR_WITH_HINT, (hint/1, owner, dict: PyDictObject * -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_WITH_HINT, (hint/1, owner, dict: PyDictObject * -- attr)) {
PyObject *attr_o;
if (!LOCK_OBJECT(dict)) {
POP_INPUT(dict);
@@ -2326,7 +2328,6 @@ dummy_func(
attr = PyStackRef_FromPyObjectNew(attr_o);
UNLOCK_OBJECT(dict);
DEAD(dict);
- null = PyStackRef_NULL;
DECREF_INPUTS();
}
@@ -2335,9 +2336,10 @@ dummy_func(
_GUARD_TYPE_VERSION +
_CHECK_ATTR_WITH_HINT +
_LOAD_ATTR_WITH_HINT +
- unused/5;
+ unused/5 +
+ _PUSH_NULL_CONDITIONAL;
- split op(_LOAD_ATTR_SLOT, (index/1, owner -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_SLOT, (index/1, owner -- attr)) {
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyObject **addr = (PyObject **)((char *)owner_o + index);
@@ -2350,7 +2352,6 @@ dummy_func(
attr = PyStackRef_FromPyObjectNew(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
DECREF_INPUTS();
}
@@ -2358,7 +2359,8 @@ dummy_func(
unused/1 +
_GUARD_TYPE_VERSION +
_LOAD_ATTR_SLOT + // NOTE: This action may also deopt
- unused/5;
+ unused/5 +
+ _PUSH_NULL_CONDITIONAL;
op(_CHECK_ATTR_CLASS, (type_version/2, owner -- owner)) {
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
@@ -2368,11 +2370,10 @@ dummy_func(
EXIT_IF(FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version);
}
- split op(_LOAD_ATTR_CLASS, (descr/4, owner -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_CLASS, (descr/4, owner -- attr)) {
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
attr = PyStackRef_FromPyObjectNew(descr);
- null = PyStackRef_NULL;
DECREF_INPUTS();
}
@@ -2380,13 +2381,15 @@ dummy_func(
unused/1 +
_CHECK_ATTR_CLASS +
unused/2 +
- _LOAD_ATTR_CLASS;
+ _LOAD_ATTR_CLASS +
+ _PUSH_NULL_CONDITIONAL;
macro(LOAD_ATTR_CLASS_WITH_METACLASS_CHECK) =
unused/1 +
_CHECK_ATTR_CLASS +
_GUARD_TYPE_VERSION +
- _LOAD_ATTR_CLASS;
+ _LOAD_ATTR_CLASS +
+ _PUSH_NULL_CONDITIONAL;
op(_LOAD_ATTR_PROPERTY_FRAME, (fget/4, owner -- new_frame: _PyInterpreterFrame *)) {
assert((oparg & 1) == 0);
@@ -2412,7 +2415,7 @@ dummy_func(
_SAVE_RETURN_OFFSET +
_PUSH_FRAME;
- inst(LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN, (unused/1, type_version/2, func_version/2, getattribute/4, owner -- unused, unused if (0))) {
+ inst(LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN, (unused/1, type_version/2, func_version/2, getattribute/4, owner -- unused)) {
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
assert((oparg & 1) == 0);
@@ -3348,7 +3351,7 @@ dummy_func(
DEOPT_IF(FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != keys_version);
}
- split op(_LOAD_ATTR_METHOD_WITH_VALUES, (descr/4, owner -- attr, self if (1))) {
+ op(_LOAD_ATTR_METHOD_WITH_VALUES, (descr/4, owner -- attr, self)) {
assert(oparg & 1);
/* Cached method object */
STAT_INC(LOAD_ATTR, hit);
@@ -3366,7 +3369,7 @@ dummy_func(
_GUARD_KEYS_VERSION +
_LOAD_ATTR_METHOD_WITH_VALUES;
- op(_LOAD_ATTR_METHOD_NO_DICT, (descr/4, owner -- attr, self if (1))) {
+ op(_LOAD_ATTR_METHOD_NO_DICT, (descr/4, owner -- attr, self)) {
assert(oparg & 1);
assert(Py_TYPE(PyStackRef_AsPyObjectBorrow(owner))->tp_dictoffset == 0);
STAT_INC(LOAD_ATTR, hit);
@@ -3383,7 +3386,7 @@ dummy_func(
unused/2 +
_LOAD_ATTR_METHOD_NO_DICT;
- op(_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, (descr/4, owner -- attr, unused if (0))) {
+ op(_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, (descr/4, owner -- attr)) {
assert((oparg & 1) == 0);
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
@@ -3398,7 +3401,7 @@ dummy_func(
_GUARD_KEYS_VERSION +
_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES;
- op(_LOAD_ATTR_NONDESCRIPTOR_NO_DICT, (descr/4, owner -- attr, unused if (0))) {
+ op(_LOAD_ATTR_NONDESCRIPTOR_NO_DICT, (descr/4, owner -- attr)) {
assert((oparg & 1) == 0);
assert(Py_TYPE(PyStackRef_AsPyObjectBorrow(owner))->tp_dictoffset == 0);
STAT_INC(LOAD_ATTR, hit);
@@ -3420,7 +3423,7 @@ dummy_func(
DEOPT_IF(dict != NULL);
}
- op(_LOAD_ATTR_METHOD_LAZY_DICT, (descr/4, owner -- attr, self if (1))) {
+ op(_LOAD_ATTR_METHOD_LAZY_DICT, (descr/4, owner -- attr, self)) {
assert(oparg & 1);
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
@@ -4537,7 +4540,7 @@ dummy_func(
GO_TO_INSTRUCTION(CALL_FUNCTION_EX);
}
- op(_MAKE_CALLARGS_A_TUPLE, (func, unused, callargs, kwargs_in if (oparg & 1) -- func, unused, tuple, kwargs_out if (oparg & 1))) {
+ op(_MAKE_CALLARGS_A_TUPLE, (func, unused, callargs, kwargs_in -- func, unused, tuple, kwargs_out)) {
PyObject *callargs_o = PyStackRef_AsPyObjectBorrow(callargs);
if (PyTuple_CheckExact(callargs_o)) {
tuple = callargs;
@@ -4561,7 +4564,7 @@ dummy_func(
}
}
- op(_DO_CALL_FUNCTION_EX, (func_st, unused, callargs_st, kwargs_st if (oparg & 1) -- result)) {
+ op(_DO_CALL_FUNCTION_EX, (func_st, unused, callargs_st, kwargs_st -- result)) {
PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
// DICT_MERGE is called before this opcode if there are kwargs.
@@ -4695,11 +4698,10 @@ dummy_func(
LLTRACE_RESUME_FRAME();
}
- inst(BUILD_SLICE, (start, stop, step if (oparg == 3) -- slice)) {
- PyObject *start_o = PyStackRef_AsPyObjectBorrow(start);
- PyObject *stop_o = PyStackRef_AsPyObjectBorrow(stop);
- PyObject *step_o = PyStackRef_AsPyObjectBorrow(step);
-
+ inst(BUILD_SLICE, (args[oparg] -- slice)) {
+ PyObject *start_o = PyStackRef_AsPyObjectBorrow(args[0]);
+ PyObject *stop_o = PyStackRef_AsPyObjectBorrow(args[1]);
+ PyObject *step_o = oparg == 3 ? PyStackRef_AsPyObjectBorrow(args[2]) : NULL;
PyObject *slice_o = PySlice_New(start_o, stop_o, step_o);
DECREF_INPUTS();
ERROR_IF(slice_o == NULL, error);
@@ -5026,43 +5028,31 @@ dummy_func(
value = PyStackRef_FromPyObjectImmortal(ptr);
}
- tier2 pure op(_LOAD_CONST_INLINE_WITH_NULL, (ptr/4 -- value, null)) {
- value = PyStackRef_FromPyObjectNew(ptr);
- null = PyStackRef_NULL;
- }
-
- tier2 pure op(_LOAD_CONST_INLINE_BORROW_WITH_NULL, (ptr/4 -- value, null)) {
- value = PyStackRef_FromPyObjectImmortal(ptr);
- null = PyStackRef_NULL;
- }
-
tier2 op(_CHECK_FUNCTION, (func_version/2 -- )) {
assert(PyStackRef_FunctionCheck(frame->f_funcobj));
PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
DEOPT_IF(func->func_version != func_version);
}
- tier2 op(_LOAD_GLOBAL_MODULE, (index/1 -- res, null if (oparg & 1))) {
+ tier2 op(_LOAD_GLOBAL_MODULE, (index/1 -- res)) {
PyDictObject *dict = (PyDictObject *)GLOBALS();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
PyObject *res_o = entries[index].me_value;
DEOPT_IF(res_o == NULL);
Py_INCREF(res_o);
res = PyStackRef_FromPyObjectSteal(res_o);
- null = PyStackRef_NULL;
}
- tier2 op(_LOAD_GLOBAL_BUILTINS, (index/1 -- res, null if (oparg & 1))) {
+ tier2 op(_LOAD_GLOBAL_BUILTINS, (index/1 -- res)) {
PyDictObject *dict = (PyDictObject *)BUILTINS();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
PyObject *res_o = entries[index].me_value;
DEOPT_IF(res_o == NULL);
Py_INCREF(res_o);
res = PyStackRef_FromPyObjectSteal(res_o);
- null = PyStackRef_NULL;
}
- tier2 op(_LOAD_ATTR_MODULE, (index/1, owner -- attr, null if (oparg & 1))) {
+ tier2 op(_LOAD_ATTR_MODULE, (index/1, owner -- attr)) {
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner_o)->md_dict;
assert(dict->ma_keys->dk_kind == DICT_KEYS_UNICODE);
@@ -5073,7 +5063,6 @@ dummy_func(
STAT_INC(LOAD_ATTR, hit);
Py_INCREF(attr_o);
attr = PyStackRef_FromPyObjectSteal(attr_o);
- null = PyStackRef_NULL;
DECREF_INPUTS();
}
diff --git a/Python/codegen.c b/Python/codegen.c
index 61707ba677097c..df3b5aaac1d0d9 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -4108,7 +4108,10 @@ codegen_call_helper_impl(compiler *c, location loc,
}
assert(have_dict);
}
- ADDOP_I(c, loc, CALL_FUNCTION_EX, nkwelts > 0);
+ if (nkwelts == 0) {
+ ADDOP(c, loc, PUSH_NULL);
+ }
+ ADDOP(c, loc, CALL_FUNCTION_EX);
return SUCCESS;
}
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index b253850e78ddbb..4addfbcf6d6419 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -1953,7 +1953,6 @@
case _LOAD_GLOBAL: {
_PyStackRef *res;
- _PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
res = &stack_pointer[0];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
@@ -1961,9 +1960,17 @@
_PyEval_LoadGlobalStackRef(GLOBALS(), BUILTINS(), name, res);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (PyStackRef_IsNull(*res)) JUMP_TO_ERROR();
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
+
+ case _PUSH_NULL_CONDITIONAL: {
+ _PyStackRef null = PyStackRef_NULL;
+ oparg = CURRENT_OPARG();
null = PyStackRef_NULL;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ if (oparg & 1) stack_pointer[0] = null;
+ stack_pointer += (oparg & 1);
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2029,8 +2036,6 @@
case _LOAD_GLOBAL_MODULE_FROM_KEYS: {
PyDictKeysObject *globals_keys;
_PyStackRef res;
- _PyStackRef null = PyStackRef_NULL;
- oparg = CURRENT_OPARG();
globals_keys = (PyDictKeysObject *)stack_pointer[-1].bits;
uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(globals_keys);
@@ -2052,10 +2057,8 @@
res = PyStackRef_FromPyObjectSteal(res_o);
#endif
STAT_INC(LOAD_GLOBAL, hit);
- null = PyStackRef_NULL;
stack_pointer[0] = res;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2063,8 +2066,6 @@
case _LOAD_GLOBAL_BUILTINS_FROM_KEYS: {
PyDictKeysObject *builtins_keys;
_PyStackRef res;
- _PyStackRef null = PyStackRef_NULL;
- oparg = CURRENT_OPARG();
builtins_keys = (PyDictKeysObject *)stack_pointer[-1].bits;
uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(builtins_keys);
@@ -2086,10 +2087,8 @@
res = PyStackRef_FromPyObjectSteal(res_o);
#endif
STAT_INC(LOAD_GLOBAL, hit);
- null = PyStackRef_NULL;
stack_pointer[0] = res;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2608,9 +2607,10 @@
case _LOAD_ATTR: {
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef self_or_null = PyStackRef_NULL;
+ _PyStackRef *self_or_null;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
+ self_or_null = &stack_pointer[0];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 1);
PyObject *attr_o;
if (oparg & 1) {
@@ -2625,7 +2625,7 @@
meth | self | arg1 | ... | argN
*/
assert(attr_o != NULL); // No errors on this branch
- self_or_null = owner; // Transfer ownership
+ self_or_null[0] = owner; // Transfer ownership
}
else {
/* meth is not an unbound method (but a regular attr, or
@@ -2636,7 +2636,7 @@
*/
PyStackRef_CLOSE(owner);
if (attr_o == NULL) JUMP_TO_ERROR();
- self_or_null = PyStackRef_NULL;
+ self_or_null[0] = PyStackRef_NULL;
}
}
else {
@@ -2646,13 +2646,10 @@
stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(owner);
if (attr_o == NULL) JUMP_TO_ERROR();
- /* We need to define self_or_null on all paths */
- self_or_null = PyStackRef_NULL;
}
attr = PyStackRef_FromPyObjectSteal(attr_o);
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = self_or_null;
- stack_pointer += (oparg & 1);
+ stack_pointer += (oparg&1);
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2704,42 +2701,9 @@
break;
}
- case _LOAD_ATTR_INSTANCE_VALUE_0: {
- _PyStackRef owner;
- _PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
- (void)null;
- owner = stack_pointer[-1];
- uint16_t offset = (uint16_t)CURRENT_OPERAND0();
- PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
- PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
- PyObject *attr_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(*value_ptr);
- if (attr_o == NULL) {
- UOP_STAT_INC(uopcode, miss);
- JUMP_TO_JUMP_TARGET();
- }
- #ifdef Py_GIL_DISABLED
- if (!_Py_TryIncrefCompareStackRef(value_ptr, attr_o, &attr)) {
- if (true) {
- UOP_STAT_INC(uopcode, miss);
- JUMP_TO_JUMP_TARGET();
- }
- }
- #else
- attr = PyStackRef_FromPyObjectNew(attr_o);
- #endif
- STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
- PyStackRef_CLOSE(owner);
- stack_pointer[-1] = attr;
- break;
- }
-
- case _LOAD_ATTR_INSTANCE_VALUE_1: {
+ case _LOAD_ATTR_INSTANCE_VALUE: {
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
- (void)null;
owner = stack_pointer[-1];
uint16_t offset = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
@@ -2760,17 +2724,11 @@
attr = PyStackRef_FromPyObjectNew(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
stack_pointer[-1] = attr;
- stack_pointer[0] = null;
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
break;
}
- /* _LOAD_ATTR_INSTANCE_VALUE is split on (oparg & 1) */
-
case _CHECK_ATTR_MODULE_PUSH_KEYS: {
_PyStackRef owner;
PyDictKeysObject *mod_keys;
@@ -2799,8 +2757,6 @@
PyDictKeysObject *mod_keys;
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
- oparg = CURRENT_OPARG();
mod_keys = (PyDictKeysObject *)stack_pointer[-1].bits;
owner = stack_pointer[-2];
uint16_t index = (uint16_t)CURRENT_OPERAND0();
@@ -2828,12 +2784,8 @@
attr = PyStackRef_FromPyObjectSteal(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2860,7 +2812,6 @@
PyDictObject *dict;
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
dict = (PyDictObject *)stack_pointer[-1].bits;
owner = stack_pointer[-2];
@@ -2916,50 +2867,16 @@
STAT_INC(LOAD_ATTR, hit);
attr = PyStackRef_FromPyObjectNew(attr_o);
UNLOCK_OBJECT(dict);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
stack_pointer[-2] = attr;
- if (oparg & 1) stack_pointer[-1] = null;
- stack_pointer += -1 + (oparg & 1);
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
}
- case _LOAD_ATTR_SLOT_0: {
- _PyStackRef owner;
- _PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
- (void)null;
- owner = stack_pointer[-1];
- uint16_t index = (uint16_t)CURRENT_OPERAND0();
- PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
- PyObject **addr = (PyObject **)((char *)owner_o + index);
- PyObject *attr_o = FT_ATOMIC_LOAD_PTR(*addr);
- if (attr_o == NULL) {
- UOP_STAT_INC(uopcode, miss);
- JUMP_TO_JUMP_TARGET();
- }
- #ifdef Py_GIL_DISABLED
- int increfed = _Py_TryIncrefCompareStackRef(addr, attr_o, &attr);
- if (!increfed) {
- UOP_STAT_INC(uopcode, miss);
- JUMP_TO_JUMP_TARGET();
- }
- #else
- attr = PyStackRef_FromPyObjectNew(attr_o);
- #endif
- STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
- PyStackRef_CLOSE(owner);
- stack_pointer[-1] = attr;
- break;
- }
-
- case _LOAD_ATTR_SLOT_1: {
+ case _LOAD_ATTR_SLOT: {
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
- (void)null;
owner = stack_pointer[-1];
uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
@@ -2979,17 +2896,11 @@
attr = PyStackRef_FromPyObjectNew(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
stack_pointer[-1] = attr;
- stack_pointer[0] = null;
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
break;
}
- /* _LOAD_ATTR_SLOT is split on (oparg & 1) */
-
case _CHECK_ATTR_CLASS: {
_PyStackRef owner;
owner = stack_pointer[-1];
@@ -3007,43 +2918,19 @@
break;
}
- case _LOAD_ATTR_CLASS_0: {
+ case _LOAD_ATTR_CLASS: {
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
- (void)null;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)CURRENT_OPERAND0();
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
attr = PyStackRef_FromPyObjectNew(descr);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
stack_pointer[-1] = attr;
break;
}
- case _LOAD_ATTR_CLASS_1: {
- _PyStackRef owner;
- _PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
- (void)null;
- owner = stack_pointer[-1];
- PyObject *descr = (PyObject *)CURRENT_OPERAND0();
- STAT_INC(LOAD_ATTR, hit);
- assert(descr != NULL);
- attr = PyStackRef_FromPyObjectNew(descr);
- null = PyStackRef_NULL;
- PyStackRef_CLOSE(owner);
- stack_pointer[-1] = attr;
- stack_pointer[0] = null;
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
- /* _LOAD_ATTR_CLASS is split on (oparg & 1) */
-
case _LOAD_ATTR_PROPERTY_FRAME: {
_PyStackRef owner;
_PyInterpreterFrame *new_frame;
@@ -4059,7 +3946,7 @@
case _LOAD_ATTR_METHOD_WITH_VALUES: {
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef self = PyStackRef_NULL;
+ _PyStackRef self;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)CURRENT_OPERAND0();
@@ -4080,7 +3967,7 @@
case _LOAD_ATTR_METHOD_NO_DICT: {
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef self = PyStackRef_NULL;
+ _PyStackRef self;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)CURRENT_OPERAND0();
@@ -4146,7 +4033,7 @@
case _LOAD_ATTR_METHOD_LAZY_DICT: {
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef self = PyStackRef_NULL;
+ _PyStackRef self;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)CURRENT_OPERAND0();
@@ -5644,15 +5531,14 @@
/* _INSTRUMENTED_CALL_FUNCTION_EX is not a viable micro-op for tier 2 because it is instrumented */
case _MAKE_CALLARGS_A_TUPLE: {
- _PyStackRef kwargs_in = PyStackRef_NULL;
+ _PyStackRef kwargs_in;
_PyStackRef callargs;
_PyStackRef func;
_PyStackRef tuple;
- _PyStackRef kwargs_out = PyStackRef_NULL;
- oparg = CURRENT_OPARG();
- if (oparg & 1) { kwargs_in = stack_pointer[-(oparg & 1)]; }
- callargs = stack_pointer[-1 - (oparg & 1)];
- func = stack_pointer[-3 - (oparg & 1)];
+ _PyStackRef kwargs_out;
+ kwargs_in = stack_pointer[-1];
+ callargs = stack_pointer[-2];
+ func = stack_pointer[-4];
PyObject *callargs_o = PyStackRef_AsPyObjectBorrow(callargs);
if (PyTuple_CheckExact(callargs_o)) {
tuple = callargs;
@@ -5675,8 +5561,8 @@
PyStackRef_CLOSE(callargs);
tuple = PyStackRef_FromPyObjectSteal(tuple_o);
}
- stack_pointer[-1 - (oparg & 1)] = tuple;
- if (oparg & 1) stack_pointer[-(oparg & 1)] = kwargs_out;
+ stack_pointer[-2] = tuple;
+ stack_pointer[-1] = kwargs_out;
break;
}
@@ -5753,25 +5639,21 @@
}
case _BUILD_SLICE: {
- _PyStackRef step = PyStackRef_NULL;
- _PyStackRef stop;
- _PyStackRef start;
+ _PyStackRef *args;
_PyStackRef slice;
oparg = CURRENT_OPARG();
- if (oparg == 3) { step = stack_pointer[-((oparg == 3) ? 1 : 0)]; }
- stop = stack_pointer[-1 - ((oparg == 3) ? 1 : 0)];
- start = stack_pointer[-2 - ((oparg == 3) ? 1 : 0)];
- PyObject *start_o = PyStackRef_AsPyObjectBorrow(start);
- PyObject *stop_o = PyStackRef_AsPyObjectBorrow(stop);
- PyObject *step_o = PyStackRef_AsPyObjectBorrow(step);
+ args = &stack_pointer[-oparg];
+ PyObject *start_o = PyStackRef_AsPyObjectBorrow(args[0]);
+ PyObject *stop_o = PyStackRef_AsPyObjectBorrow(args[1]);
+ PyObject *step_o = oparg == 3 ? PyStackRef_AsPyObjectBorrow(args[2]) : NULL;
PyObject *slice_o = PySlice_New(start_o, stop_o, step_o);
- PyStackRef_CLOSE(start);
- PyStackRef_CLOSE(stop);
- PyStackRef_XCLOSE(step);
+ for (int _i = oparg; --_i >= 0;) {
+ PyStackRef_CLOSE(args[_i]);
+ }
if (slice_o == NULL) JUMP_TO_ERROR();
slice = PyStackRef_FromPyObjectSteal(slice_o);
- stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice;
- stack_pointer += -1 - ((oparg == 3) ? 1 : 0);
+ stack_pointer[-oparg] = slice;
+ stack_pointer += 1 - oparg;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -6099,32 +5981,6 @@
break;
}
- case _LOAD_CONST_INLINE_WITH_NULL: {
- _PyStackRef value;
- _PyStackRef null;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0();
- value = PyStackRef_FromPyObjectNew(ptr);
- null = PyStackRef_NULL;
- stack_pointer[0] = value;
- stack_pointer[1] = null;
- stack_pointer += 2;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
- case _LOAD_CONST_INLINE_BORROW_WITH_NULL: {
- _PyStackRef value;
- _PyStackRef null;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0();
- value = PyStackRef_FromPyObjectImmortal(ptr);
- null = PyStackRef_NULL;
- stack_pointer[0] = value;
- stack_pointer[1] = null;
- stack_pointer += 2;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
case _CHECK_FUNCTION: {
uint32_t func_version = (uint32_t)CURRENT_OPERAND0();
assert(PyStackRef_FunctionCheck(frame->f_funcobj));
@@ -6138,8 +5994,6 @@
case _LOAD_GLOBAL_MODULE: {
_PyStackRef res;
- _PyStackRef null = PyStackRef_NULL;
- oparg = CURRENT_OPARG();
uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyDictObject *dict = (PyDictObject *)GLOBALS();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
@@ -6150,18 +6004,14 @@
}
Py_INCREF(res_o);
res = PyStackRef_FromPyObjectSteal(res_o);
- null = PyStackRef_NULL;
stack_pointer[0] = res;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
case _LOAD_GLOBAL_BUILTINS: {
_PyStackRef res;
- _PyStackRef null = PyStackRef_NULL;
- oparg = CURRENT_OPARG();
uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyDictObject *dict = (PyDictObject *)BUILTINS();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
@@ -6172,10 +6022,8 @@
}
Py_INCREF(res_o);
res = PyStackRef_FromPyObjectSteal(res_o);
- null = PyStackRef_NULL;
stack_pointer[0] = res;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -6183,8 +6031,6 @@
case _LOAD_ATTR_MODULE: {
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef null = PyStackRef_NULL;
- oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
@@ -6200,12 +6046,8 @@
STAT_INC(LOAD_ATTR, hit);
Py_INCREF(attr_o);
attr = PyStackRef_FromPyObjectSteal(attr_o);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index cbb07a89d7db83..ad044e62a38b1c 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -840,28 +840,24 @@
frame->instr_ptr = next_instr;
next_instr += 1;
INSTRUCTION_STATS(BUILD_SLICE);
- _PyStackRef start;
- _PyStackRef stop;
- _PyStackRef step = PyStackRef_NULL;
+ _PyStackRef *args;
_PyStackRef slice;
- if (oparg == 3) { step = stack_pointer[-((oparg == 3) ? 1 : 0)]; }
- stop = stack_pointer[-1 - ((oparg == 3) ? 1 : 0)];
- start = stack_pointer[-2 - ((oparg == 3) ? 1 : 0)];
- PyObject *start_o = PyStackRef_AsPyObjectBorrow(start);
- PyObject *stop_o = PyStackRef_AsPyObjectBorrow(stop);
- PyObject *step_o = PyStackRef_AsPyObjectBorrow(step);
+ args = &stack_pointer[-oparg];
+ PyObject *start_o = PyStackRef_AsPyObjectBorrow(args[0]);
+ PyObject *stop_o = PyStackRef_AsPyObjectBorrow(args[1]);
+ PyObject *step_o = oparg == 3 ? PyStackRef_AsPyObjectBorrow(args[2]) : NULL;
PyObject *slice_o = PySlice_New(start_o, stop_o, step_o);
- PyStackRef_CLOSE(start);
- PyStackRef_CLOSE(stop);
- PyStackRef_XCLOSE(step);
+ for (int _i = oparg; --_i >= 0;) {
+ PyStackRef_CLOSE(args[_i]);
+ }
if (slice_o == NULL) {
- stack_pointer += -2 - ((oparg == 3) ? 1 : 0);
+ stack_pointer += -oparg;
assert(WITHIN_STACK_BOUNDS());
goto error;
}
slice = PyStackRef_FromPyObjectSteal(slice_o);
- stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice;
- stack_pointer += -1 - ((oparg == 3) ? 1 : 0);
+ stack_pointer[-oparg] = slice;
+ stack_pointer += 1 - oparg;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
@@ -1713,18 +1709,18 @@
(void)this_instr;
_PyStackRef func;
_PyStackRef callargs;
- _PyStackRef kwargs_in = PyStackRef_NULL;
+ _PyStackRef kwargs_in;
_PyStackRef tuple;
- _PyStackRef kwargs_out = PyStackRef_NULL;
+ _PyStackRef kwargs_out;
_PyStackRef func_st;
_PyStackRef callargs_st;
- _PyStackRef kwargs_st = PyStackRef_NULL;
+ _PyStackRef kwargs_st;
_PyStackRef result;
// _MAKE_CALLARGS_A_TUPLE
{
- if (oparg & 1) { kwargs_in = stack_pointer[-(oparg & 1)]; }
- callargs = stack_pointer[-1 - (oparg & 1)];
- func = stack_pointer[-3 - (oparg & 1)];
+ kwargs_in = stack_pointer[-1];
+ callargs = stack_pointer[-2];
+ func = stack_pointer[-4];
PyObject *callargs_o = PyStackRef_AsPyObjectBorrow(callargs);
if (PyTuple_CheckExact(callargs_o)) {
tuple = callargs;
@@ -1766,8 +1762,8 @@
assert(PyTuple_CheckExact(callargs));
PyObject *arg = PyTuple_GET_SIZE(callargs) > 0 ?
PyTuple_GET_ITEM(callargs, 0) : &_PyInstrumentation_MISSING;
- stack_pointer[-1 - (oparg & 1)] = callargs_st;
- if (oparg & 1) stack_pointer[-(oparg & 1)] = kwargs_st;
+ stack_pointer[-2] = callargs_st;
+ stack_pointer[-1] = kwargs_st;
_PyFrame_SetStackPointer(frame, stack_pointer);
int err = _Py_call_instrumentation_2args(
tstate, PY_MONITORING_EVENT_CALL,
@@ -1810,7 +1806,7 @@
Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
int code_flags = ((PyCodeObject *)PyFunction_GET_CODE(func))->co_flags;
PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(func));
- stack_pointer += -2 - (oparg & 1);
+ stack_pointer += -3;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyInterpreterFrame *new_frame = _PyEvalFramePushAndInit_Ex(
@@ -1831,8 +1827,8 @@
assert(PyTuple_CheckExact(callargs));
PyObject *kwargs = PyStackRef_AsPyObjectBorrow(kwargs_st);
assert(kwargs == NULL || PyDict_CheckExact(kwargs));
- stack_pointer[-1 - (oparg & 1)] = callargs_st;
- if (oparg & 1) stack_pointer[-(oparg & 1)] = kwargs_st;
+ stack_pointer[-2] = callargs_st;
+ stack_pointer[-1] = kwargs_st;
_PyFrame_SetStackPointer(frame, stack_pointer);
result_o = PyObject_Call(func, callargs, kwargs);
stack_pointer = _PyFrame_GetStackPointer(frame);
@@ -1842,11 +1838,7 @@
stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(callargs_st);
PyStackRef_CLOSE(func_st);
- if (result_o == NULL) {
- stack_pointer += -3 - (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
- goto error;
- }
+ if (result_o == NULL) goto pop_4_error;
result = PyStackRef_FromPyObjectSteal(result_o);
}
// _CHECK_PERIODIC
@@ -1854,19 +1846,19 @@
_Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY();
QSBR_QUIESCENT_STATE(tstate);
if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) {
- stack_pointer[-3 - (oparg & 1)] = result;
- stack_pointer += -2 - (oparg & 1);
+ stack_pointer[-4] = result;
+ stack_pointer += -3;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
int err = _Py_HandlePending(tstate);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (err != 0) goto error;
- stack_pointer += 2 + (oparg & 1);
+ stack_pointer += 3;
assert(WITHIN_STACK_BOUNDS());
}
}
- stack_pointer[-3 - (oparg & 1)] = result;
- stack_pointer += -2 - (oparg & 1);
+ stack_pointer[-4] = result;
+ stack_pointer += -3;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
@@ -5308,7 +5300,7 @@
(void)this_instr;
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef self_or_null = PyStackRef_NULL;
+ _PyStackRef *self_or_null;
// _SPECIALIZE_LOAD_ATTR
{
owner = stack_pointer[-1];
@@ -5330,6 +5322,7 @@
/* Skip 8 cache entries */
// _LOAD_ATTR
{
+ self_or_null = &stack_pointer[0];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 1);
PyObject *attr_o;
if (oparg & 1) {
@@ -5344,7 +5337,7 @@
meth | self | arg1 | ... | argN
*/
assert(attr_o != NULL); // No errors on this branch
- self_or_null = owner; // Transfer ownership
+ self_or_null[0] = owner; // Transfer ownership
}
else {
/* meth is not an unbound method (but a regular attr, or
@@ -5355,7 +5348,7 @@
*/
PyStackRef_CLOSE(owner);
if (attr_o == NULL) goto pop_1_error;
- self_or_null = PyStackRef_NULL;
+ self_or_null[0] = PyStackRef_NULL;
}
}
else {
@@ -5365,14 +5358,11 @@
stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(owner);
if (attr_o == NULL) goto pop_1_error;
- /* We need to define self_or_null on all paths */
- self_or_null = PyStackRef_NULL;
}
attr = PyStackRef_FromPyObjectSteal(attr_o);
}
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = self_or_null;
- stack_pointer += (oparg & 1);
+ stack_pointer += (oparg&1);
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
@@ -5402,9 +5392,12 @@
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
attr = PyStackRef_FromPyObjectNew(descr);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
}
+ // _PUSH_NULL_CONDITIONAL
+ {
+ null = PyStackRef_NULL;
+ }
stack_pointer[-1] = attr;
if (oparg & 1) stack_pointer[0] = null;
stack_pointer += (oparg & 1);
@@ -5443,9 +5436,12 @@
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
attr = PyStackRef_FromPyObjectNew(descr);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
}
+ // _PUSH_NULL_CONDITIONAL
+ {
+ null = PyStackRef_NULL;
+ }
stack_pointer[-1] = attr;
if (oparg & 1) stack_pointer[0] = null;
stack_pointer += (oparg & 1);
@@ -5528,10 +5524,13 @@
attr = PyStackRef_FromPyObjectNew(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
}
/* Skip 5 cache entries */
+ // _PUSH_NULL_CONDITIONAL
+ {
+ null = PyStackRef_NULL;
+ }
stack_pointer[-1] = attr;
if (oparg & 1) stack_pointer[0] = null;
stack_pointer += (oparg & 1);
@@ -5546,7 +5545,7 @@
static_assert(INLINE_CACHE_ENTRIES_LOAD_ATTR == 9, "incorrect cache size");
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef self = PyStackRef_NULL;
+ _PyStackRef self;
/* Skip 1 cache entry */
// _GUARD_TYPE_VERSION
{
@@ -5589,7 +5588,7 @@
static_assert(INLINE_CACHE_ENTRIES_LOAD_ATTR == 9, "incorrect cache size");
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef self = PyStackRef_NULL;
+ _PyStackRef self;
/* Skip 1 cache entry */
// _GUARD_TYPE_VERSION
{
@@ -5625,7 +5624,7 @@
static_assert(INLINE_CACHE_ENTRIES_LOAD_ATTR == 9, "incorrect cache size");
_PyStackRef owner;
_PyStackRef attr;
- _PyStackRef self = PyStackRef_NULL;
+ _PyStackRef self;
/* Skip 1 cache entry */
// _GUARD_TYPE_VERSION
{
@@ -5709,10 +5708,13 @@
attr = PyStackRef_FromPyObjectSteal(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
}
/* Skip 5 cache entries */
+ // _PUSH_NULL_CONDITIONAL
+ {
+ null = PyStackRef_NULL;
+ }
stack_pointer[-1] = attr;
if (oparg & 1) stack_pointer[0] = null;
stack_pointer += (oparg & 1);
@@ -5891,10 +5893,13 @@
attr = PyStackRef_FromPyObjectNew(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
}
/* Skip 5 cache entries */
+ // _PUSH_NULL_CONDITIONAL
+ {
+ null = PyStackRef_NULL;
+ }
stack_pointer[-1] = attr;
if (oparg & 1) stack_pointer[0] = null;
stack_pointer += (oparg & 1);
@@ -5958,10 +5963,13 @@
STAT_INC(LOAD_ATTR, hit);
attr = PyStackRef_FromPyObjectNew(attr_o);
UNLOCK_OBJECT(dict);
- null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
}
/* Skip 5 cache entries */
+ // _PUSH_NULL_CONDITIONAL
+ {
+ null = PyStackRef_NULL;
+ }
stack_pointer[-1] = attr;
if (oparg & 1) stack_pointer[0] = null;
stack_pointer += (oparg & 1);
@@ -6295,6 +6303,9 @@
_PyEval_LoadGlobalStackRef(GLOBALS(), BUILTINS(), name, res);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (PyStackRef_IsNull(*res)) goto error;
+ }
+ // _PUSH_NULL_CONDITIONAL
+ {
null = PyStackRef_NULL;
}
if (oparg & 1) stack_pointer[1] = null;
@@ -6345,6 +6356,9 @@
res = PyStackRef_FromPyObjectSteal(res_o);
#endif
STAT_INC(LOAD_GLOBAL, hit);
+ }
+ // _PUSH_NULL_CONDITIONAL
+ {
null = PyStackRef_NULL;
}
stack_pointer[0] = res;
@@ -6388,6 +6402,9 @@
res = PyStackRef_FromPyObjectSteal(res_o);
#endif
STAT_INC(LOAD_GLOBAL, hit);
+ }
+ // _PUSH_NULL_CONDITIONAL
+ {
null = PyStackRef_NULL;
}
stack_pointer[0] = res;
@@ -6575,6 +6592,9 @@
stack_pointer = _PyFrame_GetStackPointer(frame);
if (attr_o == NULL) goto error;
attr = PyStackRef_FromPyObjectSteal(attr_o);
+ }
+ // _PUSH_NULL_CONDITIONAL
+ {
null = PyStackRef_NULL;
}
stack_pointer[0] = attr;
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index cb6c33f01d3598..873378b43374c5 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -3,6 +3,7 @@ static void *opcode_targets[256] = {
&&TARGET_BINARY_SLICE,
&&TARGET_BINARY_SUBSCR,
&&TARGET_BINARY_OP_INPLACE_ADD_UNICODE,
+ &&TARGET_CALL_FUNCTION_EX,
&&TARGET_CHECK_EG_MATCH,
&&TARGET_CHECK_EXC_MATCH,
&&TARGET_CLEANUP_THROW,
@@ -15,8 +16,8 @@ static void *opcode_targets[256] = {
&&TARGET_FORMAT_WITH_SPEC,
&&TARGET_GET_AITER,
&&TARGET_GET_ANEXT,
- &&TARGET_GET_ITER,
&&TARGET_RESERVED,
+ &&TARGET_GET_ITER,
&&TARGET_GET_LEN,
&&TARGET_GET_YIELD_FROM_ITER,
&&TARGET_INTERPRETER_EXIT,
@@ -51,7 +52,6 @@ static void *opcode_targets[256] = {
&&TARGET_BUILD_STRING,
&&TARGET_BUILD_TUPLE,
&&TARGET_CALL,
- &&TARGET_CALL_FUNCTION_EX,
&&TARGET_CALL_INTRINSIC_1,
&&TARGET_CALL_INTRINSIC_2,
&&TARGET_CALL_KW,
diff --git a/Python/optimizer.c b/Python/optimizer.c
index 9beb47246eb3d6..e3950843964f11 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -1276,15 +1276,16 @@ uop_optimize(
int oparg = buffer[pc].oparg;
if (_PyUop_Flags[opcode] & HAS_OPARG_AND_1_FLAG) {
buffer[pc].opcode = opcode + 1 + (oparg & 1);
+ assert(strncmp(_PyOpcode_uop_name[buffer[pc].opcode], _PyOpcode_uop_name[opcode], strlen(_PyOpcode_uop_name[opcode])) == 0);
}
else if (oparg < _PyUop_Replication[opcode]) {
buffer[pc].opcode = opcode + oparg + 1;
+ assert(strncmp(_PyOpcode_uop_name[buffer[pc].opcode], _PyOpcode_uop_name[opcode], strlen(_PyOpcode_uop_name[opcode])) == 0);
}
else if (is_terminator(&buffer[pc])) {
break;
}
assert(_PyOpcode_uop_name[buffer[pc].opcode]);
- assert(strncmp(_PyOpcode_uop_name[buffer[pc].opcode], _PyOpcode_uop_name[opcode], strlen(_PyOpcode_uop_name[opcode])) == 0);
}
OPT_HIST(effective_trace_length(buffer, length), optimized_trace_length_hist);
length = prepare_for_execution(buffer, length);
diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c
index b9ac30ea04e4e8..5dd7725f398cd1 100644
--- a/Python/optimizer_analysis.c
+++ b/Python/optimizer_analysis.c
@@ -109,10 +109,14 @@ convert_global_to_const(_PyUOpInstruction *inst, PyObject *obj)
return NULL;
}
if (_Py_IsImmortal(res)) {
- inst->opcode = (inst->oparg & 1) ? _LOAD_CONST_INLINE_BORROW_WITH_NULL : _LOAD_CONST_INLINE_BORROW;
+ inst->opcode = _LOAD_CONST_INLINE_BORROW;
}
else {
- inst->opcode = (inst->oparg & 1) ? _LOAD_CONST_INLINE_WITH_NULL : _LOAD_CONST_INLINE;
+ inst->opcode = _LOAD_CONST_INLINE;
+ }
+ if (inst->oparg & 1) {
+ assert(inst[1].opcode == _PUSH_NULL_CONDITIONAL);
+ assert(inst[1].oparg & 1);
}
inst->operand0 = (uint64_t)res;
return res;
diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c
index 881a607ca2aa29..fb14c4b7c8645b 100644
--- a/Python/optimizer_bytecodes.c
+++ b/Python/optimizer_bytecodes.c
@@ -507,16 +507,6 @@ dummy_func(void) {
value = sym_new_const(ctx, ptr);
}
- op(_LOAD_CONST_INLINE_WITH_NULL, (ptr/4 -- value, null)) {
- value = sym_new_const(ctx, ptr);
- null = sym_new_null(ctx);
- }
-
- op(_LOAD_CONST_INLINE_BORROW_WITH_NULL, (ptr/4 -- value, null)) {
- value = sym_new_const(ctx, ptr);
- null = sym_new_null(ctx);
- }
-
op(_COPY, (bottom, unused[oparg-1] -- bottom, unused[oparg-1], top)) {
assert(oparg > 0);
top = bottom;
@@ -528,9 +518,8 @@ dummy_func(void) {
top_out = top_in;
}
- op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr)) {
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)offset;
(void)owner;
}
@@ -553,15 +542,22 @@ dummy_func(void) {
}
}
- op(_LOAD_ATTR, (owner -- attr, self_or_null if (oparg & 1))) {
+ op (_PUSH_NULL_CONDITIONAL, ( -- null if (oparg & 1))) {
+ int opcode = (oparg & 1) ? _PUSH_NULL : _NOP;
+ REPLACE_OP(this_instr, opcode, 0, 0);
+ null = sym_new_null(ctx);
+ }
+
+ op(_LOAD_ATTR, (owner -- attr, self_or_null[oparg&1])) {
(void)owner;
attr = sym_new_not_null(ctx);
- self_or_null = sym_new_unknown(ctx);
+ if (oparg &1) {
+ self_or_null[0] = sym_new_unknown(ctx);
+ }
}
- op(_LOAD_ATTR_MODULE_FROM_KEYS, (index/1, owner, mod_keys -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_MODULE_FROM_KEYS, (index/1, owner, mod_keys -- attr)) {
(void)index;
- null = sym_new_null(ctx);
attr = NULL;
if (this_instr[-1].opcode == _NOP) {
// Preceding _CHECK_ATTR_MODULE_PUSH_KEYS was removed: mod is const and dict is watched.
@@ -589,41 +585,38 @@ dummy_func(void) {
(void)owner;
}
- op(_LOAD_ATTR_WITH_HINT, (hint/1, owner, dict -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_WITH_HINT, (hint/1, owner, dict -- attr)) {
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)hint;
(void)owner;
(void)dict;
}
- op(_LOAD_ATTR_SLOT, (index/1, owner -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_SLOT, (index/1, owner -- attr)) {
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)index;
(void)owner;
}
- op(_LOAD_ATTR_CLASS, (descr/4, owner -- attr, null if (oparg & 1))) {
+ op(_LOAD_ATTR_CLASS, (descr/4, owner -- attr)) {
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)descr;
(void)owner;
}
- op(_LOAD_ATTR_METHOD_WITH_VALUES, (descr/4, owner -- attr, self if (1))) {
+ op(_LOAD_ATTR_METHOD_WITH_VALUES, (descr/4, owner -- attr, self)) {
(void)descr;
attr = sym_new_not_null(ctx);
self = owner;
}
- op(_LOAD_ATTR_METHOD_NO_DICT, (descr/4, owner -- attr, self if (1))) {
+ op(_LOAD_ATTR_METHOD_NO_DICT, (descr/4, owner -- attr, self)) {
(void)descr;
attr = sym_new_not_null(ctx);
self = owner;
}
- op(_LOAD_ATTR_METHOD_LAZY_DICT, (descr/4, owner -- attr, self if (1))) {
+ op(_LOAD_ATTR_METHOD_LAZY_DICT, (descr/4, owner -- attr, self)) {
(void)descr;
attr = sym_new_not_null(ctx);
self = owner;
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index fa0b4ed4345320..2497754745c28b 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -928,12 +928,20 @@
case _LOAD_GLOBAL: {
JitOptSymbol **res;
- JitOptSymbol *null = NULL;
res = &stack_pointer[0];
res[0] = sym_new_not_null(ctx);
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
+
+ case _PUSH_NULL_CONDITIONAL: {
+ JitOptSymbol *null = NULL;
+ int opcode = (oparg & 1) ? _PUSH_NULL : _NOP;
+ REPLACE_OP(this_instr, opcode, 0, 0);
null = sym_new_null(ctx);
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ if (oparg & 1) stack_pointer[0] = null;
+ stack_pointer += (oparg & 1);
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -966,25 +974,15 @@
case _LOAD_GLOBAL_MODULE_FROM_KEYS: {
JitOptSymbol *res;
- JitOptSymbol *null = NULL;
res = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[-1] = res;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
case _LOAD_GLOBAL_BUILTINS_FROM_KEYS: {
JitOptSymbol *res;
- JitOptSymbol *null = NULL;
res = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[-1] = res;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1133,14 +1131,16 @@
case _LOAD_ATTR: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *self_or_null = NULL;
+ JitOptSymbol **self_or_null;
owner = stack_pointer[-1];
+ self_or_null = &stack_pointer[0];
(void)owner;
attr = sym_new_not_null(ctx);
- self_or_null = sym_new_unknown(ctx);
+ if (oparg &1) {
+ self_or_null[0] = sym_new_unknown(ctx);
+ }
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = self_or_null;
- stack_pointer += (oparg & 1);
+ stack_pointer += (oparg&1);
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1182,17 +1182,12 @@
case _LOAD_ATTR_INSTANCE_VALUE: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
owner = stack_pointer[-1];
uint16_t offset = (uint16_t)this_instr->operand0;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)offset;
(void)owner;
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1230,11 +1225,9 @@
case _LOAD_ATTR_MODULE_FROM_KEYS: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
owner = stack_pointer[-2];
uint16_t index = (uint16_t)this_instr->operand0;
(void)index;
- null = sym_new_null(ctx);
attr = NULL;
if (this_instr[-1].opcode == _NOP) {
// Preceding _CHECK_ATTR_MODULE_PUSH_KEYS was removed: mod is const and dict is watched.
@@ -1243,8 +1236,7 @@
assert(PyModule_CheckExact(mod));
PyObject *dict = mod->md_dict;
stack_pointer[-2] = attr;
- if (oparg & 1) stack_pointer[-1] = null;
- stack_pointer += -1 + (oparg & 1);
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
PyObject *res = convert_global_to_const(this_instr, dict);
if (res != NULL) {
@@ -1254,7 +1246,7 @@
else {
this_instr->opcode = _LOAD_ATTR_MODULE;
}
- stack_pointer += 1 - (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
}
if (attr == NULL) {
@@ -1262,8 +1254,7 @@
attr = sym_new_not_null(ctx);
}
stack_pointer[-2] = attr;
- if (oparg & 1) stack_pointer[-1] = null;
- stack_pointer += -1 + (oparg & 1);
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1284,18 +1275,15 @@
JitOptSymbol *dict;
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
dict = stack_pointer[-1];
owner = stack_pointer[-2];
uint16_t hint = (uint16_t)this_instr->operand0;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)hint;
(void)owner;
(void)dict;
stack_pointer[-2] = attr;
- if (oparg & 1) stack_pointer[-1] = null;
- stack_pointer += -1 + (oparg & 1);
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1303,17 +1291,12 @@
case _LOAD_ATTR_SLOT: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
owner = stack_pointer[-1];
uint16_t index = (uint16_t)this_instr->operand0;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)index;
(void)owner;
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1324,17 +1307,12 @@
case _LOAD_ATTR_CLASS: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)this_instr->operand0;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)descr;
(void)owner;
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1723,7 +1701,7 @@
case _LOAD_ATTR_METHOD_WITH_VALUES: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *self = NULL;
+ JitOptSymbol *self;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)this_instr->operand0;
(void)descr;
@@ -1739,7 +1717,7 @@
case _LOAD_ATTR_METHOD_NO_DICT: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *self = NULL;
+ JitOptSymbol *self;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)this_instr->operand0;
(void)descr;
@@ -1773,7 +1751,7 @@
case _LOAD_ATTR_METHOD_LAZY_DICT: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *self = NULL;
+ JitOptSymbol *self;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)this_instr->operand0;
(void)descr;
@@ -2262,11 +2240,11 @@
case _MAKE_CALLARGS_A_TUPLE: {
JitOptSymbol *tuple;
- JitOptSymbol *kwargs_out = NULL;
+ JitOptSymbol *kwargs_out;
tuple = sym_new_not_null(ctx);
kwargs_out = sym_new_not_null(ctx);
- stack_pointer[-1 - (oparg & 1)] = tuple;
- if (oparg & 1) stack_pointer[-(oparg & 1)] = kwargs_out;
+ stack_pointer[-2] = tuple;
+ stack_pointer[-1] = kwargs_out;
break;
}
@@ -2315,8 +2293,8 @@
case _BUILD_SLICE: {
JitOptSymbol *slice;
slice = sym_new_not_null(ctx);
- stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice;
- stack_pointer += -1 - ((oparg == 3) ? 1 : 0);
+ stack_pointer[-oparg] = slice;
+ stack_pointer += 1 - oparg;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2607,69 +2585,32 @@
break;
}
- case _LOAD_CONST_INLINE_WITH_NULL: {
- JitOptSymbol *value;
- JitOptSymbol *null;
- PyObject *ptr = (PyObject *)this_instr->operand0;
- value = sym_new_const(ctx, ptr);
- null = sym_new_null(ctx);
- stack_pointer[0] = value;
- stack_pointer[1] = null;
- stack_pointer += 2;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
- case _LOAD_CONST_INLINE_BORROW_WITH_NULL: {
- JitOptSymbol *value;
- JitOptSymbol *null;
- PyObject *ptr = (PyObject *)this_instr->operand0;
- value = sym_new_const(ctx, ptr);
- null = sym_new_null(ctx);
- stack_pointer[0] = value;
- stack_pointer[1] = null;
- stack_pointer += 2;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
case _CHECK_FUNCTION: {
break;
}
case _LOAD_GLOBAL_MODULE: {
JitOptSymbol *res;
- JitOptSymbol *null = NULL;
res = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[0] = res;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
case _LOAD_GLOBAL_BUILTINS: {
JitOptSymbol *res;
- JitOptSymbol *null = NULL;
res = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[0] = res;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
case _LOAD_ATTR_MODULE: {
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
1
0
https://github.com/python/cpython/commit/8ec76d90340287eb3587f0ae388bbfe158…
commit: 8ec76d90340287eb3587f0ae388bbfe158fb28d8
branch: main
author: Nick Pope <nick(a)nickpope.me.uk>
committer: hugovk <1324225+hugovk(a)users.noreply.github.com>
date: 2025-01-27T18:17:17+02:00
summary:
gh-128427: Add `uuid.NIL` and `uuid.MAX` (#128429)
files:
A Misc/NEWS.d/next/Library/2025-01-02-20-34-04.gh-issue-128427.onPoQZ.rst
M Doc/library/uuid.rst
M Doc/whatsnew/3.14.rst
M Lib/test/test_uuid.py
M Lib/uuid.py
M Misc/ACKS
diff --git a/Doc/library/uuid.rst b/Doc/library/uuid.rst
index 39e82d0e19a9ac..09b4d4ac4ffd56 100644
--- a/Doc/library/uuid.rst
+++ b/Doc/library/uuid.rst
@@ -289,6 +289,25 @@ of the :attr:`~UUID.variant` attribute:
Reserved for future definition.
+The :mod:`uuid` module defines the special Nil and Max UUID values:
+
+
+.. data:: NIL
+
+ A special form of UUID that is specified to have all 128 bits set to zero
+ according to :rfc:`RFC 9562, §5.9 <9562#section-5.9>`.
+
+ .. versionadded:: next
+
+
+.. data:: MAX
+
+ A special form of UUID that is specified to have all 128 bits set to one
+ according to :rfc:`RFC 9562, §5.10 <9562#section-5.10>`.
+
+ .. versionadded:: next
+
+
.. seealso::
:rfc:`9562` - A Universally Unique IDentifier (UUID) URN Namespace
@@ -380,6 +399,14 @@ Here are some examples of typical usage of the :mod:`uuid` module::
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
+ >>> # get the Nil UUID
+ >>> uuid.NIL
+ UUID('00000000-0000-0000-0000-000000000000')
+
+ >>> # get the Max UUID
+ >>> uuid.MAX
+ UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')
+
.. _uuid-cli-example:
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index 53281441f691e5..2c10d7fefd44ab 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -731,6 +731,11 @@ uuid
in :rfc:`9562`.
(Contributed by Bénédikt Tran in :gh:`89083`.)
+* :const:`uuid.NIL` and :const:`uuid.MAX` are now available to represent the
+ Nil and Max UUID formats as defined by :rfc:`9562`.
+ (Contributed by Nick Pope in :gh:`128427`.)
+
+
zipinfo
-------
diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py
index 8f40dd97f42fdc..74c8e2838efc8f 100755
--- a/Lib/test/test_uuid.py
+++ b/Lib/test/test_uuid.py
@@ -34,6 +34,47 @@ def get_command_stdout(command, args):
class BaseTestUUID:
uuid = None
+ def test_nil_uuid(self):
+ nil_uuid = self.uuid.NIL
+
+ s = '00000000-0000-0000-0000-000000000000'
+ i = 0
+ self.assertEqual(nil_uuid, self.uuid.UUID(s))
+ self.assertEqual(nil_uuid, self.uuid.UUID(int=i))
+ self.assertEqual(nil_uuid.int, i)
+ self.assertEqual(str(nil_uuid), s)
+ # The Nil UUID falls within the range of the Apollo NCS variant as per
+ # RFC 9562.
+ # See https://www.rfc-editor.org/rfc/rfc9562.html#section-5.9-4
+ self.assertEqual(nil_uuid.variant, self.uuid.RESERVED_NCS)
+ # A version field of all zeros is "Unused" in RFC 9562, but the version
+ # field also only applies to the 10xx variant, i.e. the variant
+ # specified in RFC 9562. As such, because the Nil UUID falls under a
+ # different variant, its version is considered undefined.
+ # See https://www.rfc-editor.org/rfc/rfc9562.html#table2
+ self.assertIsNone(nil_uuid.version)
+
+ def test_max_uuid(self):
+ max_uuid = self.uuid.MAX
+
+ s = 'ffffffff-ffff-ffff-ffff-ffffffffffff'
+ i = (1 << 128) - 1
+ self.assertEqual(max_uuid, self.uuid.UUID(s))
+ self.assertEqual(max_uuid, self.uuid.UUID(int=i))
+ self.assertEqual(max_uuid.int, i)
+ self.assertEqual(str(max_uuid), s)
+ # The Max UUID falls within the range of the "yet-to-be defined" future
+ # UUID variant as per RFC 9562.
+ # See https://www.rfc-editor.org/rfc/rfc9562.html#section-5.10-4
+ self.assertEqual(max_uuid.variant, self.uuid.RESERVED_FUTURE)
+ # A version field of all ones is "Reserved for future definition" in
+ # RFC 9562, but the version field also only applies to the 10xx
+ # variant, i.e. the variant specified in RFC 9562. As such, because the
+ # Max UUID falls under a different variant, its version is considered
+ # undefined.
+ # See https://www.rfc-editor.org/rfc/rfc9562.html#table2
+ self.assertIsNone(max_uuid.version)
+
def test_safe_uuid_enum(self):
class CheckedSafeUUID(enum.Enum):
safe = 0
diff --git a/Lib/uuid.py b/Lib/uuid.py
index cd1f3530ab63e1..36809b85cb8ceb 100644
--- a/Lib/uuid.py
+++ b/Lib/uuid.py
@@ -42,6 +42,14 @@
# make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
+
+ # get the Nil UUID
+ >>> uuid.NIL
+ UUID('00000000-0000-0000-0000-000000000000')
+
+ # get the Max UUID
+ >>> uuid.MAX
+ UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')
"""
import os
@@ -830,5 +838,10 @@ def main():
NAMESPACE_OID = UUID('6ba7b812-9dad-11d1-80b4-00c04fd430c8')
NAMESPACE_X500 = UUID('6ba7b814-9dad-11d1-80b4-00c04fd430c8')
+# RFC 9562 Sections 5.9 and 5.10 define the special Nil and Max UUID formats.
+
+NIL = UUID('00000000-0000-0000-0000-000000000000')
+MAX = UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')
+
if __name__ == "__main__":
main()
diff --git a/Misc/ACKS b/Misc/ACKS
index 7759bd0b95ed8b..4901609a178bc3 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1475,6 +1475,7 @@ Michael Pomraning
Martin Pool
Iustin Pop
Claudiu Popa
+Nick Pope
John Popplewell
Matheus Vieira Portela
Davin Potts
diff --git a/Misc/NEWS.d/next/Library/2025-01-02-20-34-04.gh-issue-128427.onPoQZ.rst b/Misc/NEWS.d/next/Library/2025-01-02-20-34-04.gh-issue-128427.onPoQZ.rst
new file mode 100644
index 00000000000000..54cae43702ded7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-01-02-20-34-04.gh-issue-128427.onPoQZ.rst
@@ -0,0 +1,2 @@
+:const:`uuid.NIL` and :const:`uuid.MAX` are now available to represent the Nil
+and Max UUID formats as defined by :rfc:`9562`.
1
0
https://github.com/python/cpython/commit/d8e16ef7037ac254e4799d2991c7fc3fe5…
commit: d8e16ef7037ac254e4799d2991c7fc3fe576c545
branch: main
author: Victor Stinner <vstinner(a)python.org>
committer: vstinner <vstinner(a)python.org>
date: 2025-01-27T16:06:07+01:00
summary:
Cleanup What's New in Python 3.14 (C API changes) (#129341)
* Document PyDictObject.ma_version_tag removal.
* Add "Limited C API Changes" section.
* Move entries from New Features to Porting to Python 3.14.
* Include Pending removal documents at the right place.
files:
M Doc/deprecations/c-api-pending-removal-in-future.rst
M Doc/whatsnew/3.14.rst
diff --git a/Doc/deprecations/c-api-pending-removal-in-future.rst b/Doc/deprecations/c-api-pending-removal-in-future.rst
index 8fc1c80c35d092..1003047344a3cc 100644
--- a/Doc/deprecations/c-api-pending-removal-in-future.rst
+++ b/Doc/deprecations/c-api-pending-removal-in-future.rst
@@ -34,7 +34,6 @@ although there is currently no date scheduled for their removal.
Use :c:func:`!_PyErr_ChainExceptions1` instead.
* :c:member:`!PyBytesObject.ob_shash` member:
call :c:func:`PyObject_Hash` instead.
-* :c:member:`!PyDictObject.ma_version_tag` member.
* Thread Local Storage (TLS) API:
* :c:func:`PyThread_create_key`:
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index 8d209f597eaf4d..53281441f691e5 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -1218,16 +1218,6 @@ New features
which has an ambiguous return value.
(Contributed by Irit Katriel and Erlend Aasland in :gh:`105201`.)
-* :c:func:`Py_Finalize` now deletes all interned strings. This
- is backwards incompatible to any C-Extension that holds onto an interned
- string after a call to :c:func:`Py_Finalize` and is then reused after a
- call to :c:func:`Py_Initialize`. Any issues arising from this behavior will
- normally result in crashes during the execution of the subsequent call to
- :c:func:`Py_Initialize` from accessing uninitialized memory. To fix, use
- an address sanitizer to identify any use-after-free coming from
- an interned string and deallocate it during module shutdown.
- (Contributed by Eddie Elizondo in :gh:`113601`.)
-
* Add :c:func:`PyLong_IsPositive`, :c:func:`PyLong_IsNegative`
and :c:func:`PyLong_IsZero` for checking if :c:type:`PyLongObject`
is positive, negative, or zero, respectively.
@@ -1303,18 +1293,12 @@ New features
test if two strings are equal.
(Contributed by Victor Stinner in :gh:`124502`.)
-
* Add :c:func:`PyType_Freeze` function to make a type immutable.
(Contributed by Victor Stinner in :gh:`121654`.)
* Add :c:func:`PyUnstable_Object_EnableDeferredRefcount` for enabling
deferred reference counting, as outlined in :pep:`703`.
-* The :ref:`Unicode Exception Objects <unicodeexceptions>` C API
- now raises a :exc:`TypeError` if its exception argument is not
- a :exc:`UnicodeError` object.
- (Contributed by Bénédikt Tran in :gh:`127691`.)
-
* Add :c:func:`PyMonitoring_FireBranchLeftEvent` and
:c:func:`PyMonitoring_FireBranchRightEvent` for generating
:monitoring-event:`BRANCH_LEFT` and :monitoring-event:`BRANCH_RIGHT`
@@ -1334,14 +1318,33 @@ New features
for debugging purposes.
-Porting to Python 3.14
-----------------------
+Limited C API changes
+---------------------
* In the limited C API 3.14 and newer, :c:func:`Py_TYPE` and
:c:func:`Py_REFCNT` are now implemented as an opaque function call to hide
implementation details.
(Contributed by Victor Stinner in :gh:`120600` and :gh:`124127`.)
+
+Porting to Python 3.14
+----------------------
+
+* :c:func:`Py_Finalize` now deletes all interned strings. This
+ is backwards incompatible to any C-Extension that holds onto an interned
+ string after a call to :c:func:`Py_Finalize` and is then reused after a
+ call to :c:func:`Py_Initialize`. Any issues arising from this behavior will
+ normally result in crashes during the execution of the subsequent call to
+ :c:func:`Py_Initialize` from accessing uninitialized memory. To fix, use
+ an address sanitizer to identify any use-after-free coming from
+ an interned string and deallocate it during module shutdown.
+ (Contributed by Eddie Elizondo in :gh:`113601`.)
+
+* The :ref:`Unicode Exception Objects <unicodeexceptions>` C API
+ now raises a :exc:`TypeError` if its exception argument is not
+ a :exc:`UnicodeError` object.
+ (Contributed by Bénédikt Tran in :gh:`127691`.)
+
* Private functions promoted to public C APIs:
* ``_PyBytes_Join()``: :c:func:`PyBytes_Join`;
@@ -1386,12 +1389,6 @@ Deprecated
.. Add C API deprecations above alphabetically, not here at the end.
-.. include:: ../deprecations/c-api-pending-removal-in-3.15.rst
-
-.. include:: ../deprecations/c-api-pending-removal-in-3.18.rst
-
-.. include:: ../deprecations/c-api-pending-removal-in-future.rst
-
* The ``PyMonitoring_FireBranchEvent`` function is deprecated and should
be replaced with calls to :c:func:`PyMonitoring_FireBranchLeftEvent`
and :c:func:`PyMonitoring_FireBranchRightEvent`.
@@ -1416,12 +1413,23 @@ Deprecated
(Contributed by Victor Stinner in :gh:`128863`.)
+.. include:: ../deprecations/c-api-pending-removal-in-3.15.rst
+
+.. include:: ../deprecations/c-api-pending-removal-in-3.18.rst
+
+.. include:: ../deprecations/c-api-pending-removal-in-future.rst
+
+
Removed
-------
* Creating :c:data:`immutable types <Py_TPFLAGS_IMMUTABLETYPE>` with mutable
bases was deprecated since 3.12 and now raises a :exc:`TypeError`.
+* Remove ``PyDictObject.ma_version_tag`` member which was deprecated since
+ Python 3.12. Use the :c:func:`PyDict_AddWatcher` API instead.
+ (Contributed by Sam Gross in :gh:`124296`.)
+
* Remove the private ``_Py_InitializeMain()`` function. It was a
:term:`provisional API` added to Python 3.8 by :pep:`587`.
(Contributed by Victor Stinner in :gh:`129033`.)
1
0
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
[3.13] gh-129061: Fix `FORCE_COLOR` and `NO_COLOR` when empty strings (GH-129140) (#129360)
by hugovk Jan. 27, 2025
by hugovk Jan. 27, 2025
Jan. 27, 2025
https://github.com/python/cpython/commit/c7f9e7446ce790cc0b133c18802bf4b030…
commit: c7f9e7446ce790cc0b133c18802bf4b030d3814f
branch: 3.13
author: Miss Islington (bot) <31488909+miss-islington(a)users.noreply.github.com>
committer: hugovk <1324225+hugovk(a)users.noreply.github.com>
date: 2025-01-27T14:48:05Z
summary:
[3.13] gh-129061: Fix `FORCE_COLOR` and `NO_COLOR` when empty strings (GH-129140) (#129360)
gh-129061: Fix `FORCE_COLOR` and `NO_COLOR` when empty strings (GH-129140)
(cherry picked from commit 9546fe2ef2db921709f3cb355b33bba977658672)
Co-authored-by: Hugo van Kemenade <1324225+hugovk(a)users.noreply.github.com>
files:
A Misc/NEWS.d/next/Library/2025-01-21-18-52-32.gh-issue-129061.4idD_B.rst
M Lib/_colorize.py
M Lib/test/test__colorize.py
diff --git a/Lib/_colorize.py b/Lib/_colorize.py
index deb2e854ce1ff8..70acfd4ad0ba8f 100644
--- a/Lib/_colorize.py
+++ b/Lib/_colorize.py
@@ -40,11 +40,11 @@ def can_colorize(*, file=None) -> bool:
return False
if os.environ.get("PYTHON_COLORS") == "1":
return True
- if "NO_COLOR" in os.environ:
+ if os.environ.get("NO_COLOR"):
return False
if not COLORIZE:
return False
- if "FORCE_COLOR" in os.environ:
+ if os.environ.get("FORCE_COLOR"):
return True
if os.environ.get("TERM") == "dumb":
return False
diff --git a/Lib/test/test__colorize.py b/Lib/test/test__colorize.py
index ff15d83cb078fe..056a5306ced183 100644
--- a/Lib/test/test__colorize.py
+++ b/Lib/test/test__colorize.py
@@ -44,8 +44,10 @@ def check(env, fallback, expected):
check({'TERM': ''}, fallback, fallback)
check({'FORCE_COLOR': '1'}, fallback, True)
check({'FORCE_COLOR': '0'}, fallback, True)
+ check({'FORCE_COLOR': ''}, fallback, fallback)
check({'NO_COLOR': '1'}, fallback, False)
check({'NO_COLOR': '0'}, fallback, False)
+ check({'NO_COLOR': ''}, fallback, fallback)
check({'TERM': 'dumb', 'FORCE_COLOR': '1'}, False, True)
check({'FORCE_COLOR': '1', 'NO_COLOR': '1'}, True, False)
diff --git a/Misc/NEWS.d/next/Library/2025-01-21-18-52-32.gh-issue-129061.4idD_B.rst b/Misc/NEWS.d/next/Library/2025-01-21-18-52-32.gh-issue-129061.4idD_B.rst
new file mode 100644
index 00000000000000..5c5c05e1161e86
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-01-21-18-52-32.gh-issue-129061.4idD_B.rst
@@ -0,0 +1 @@
+Fix FORCE_COLOR and NO_COLOR when empty strings. Patch by Hugo van Kemenade.
1
0
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
gh-119786: Fix small typo in AST to CFG to bytecode section in compiler.md (#129322)
by Eclips4 Jan. 27, 2025
by Eclips4 Jan. 27, 2025
Jan. 27, 2025
https://github.com/python/cpython/commit/a5075cd5bd0307d9c19a0e0d6fcf4b7ad3…
commit: a5075cd5bd0307d9c19a0e0d6fcf4b7ad3d5a915
branch: main
author: Sergey Miryanov <sergey.miryanov(a)gmail.com>
committer: Eclips4 <kirill.bast9(a)mail.ru>
date: 2025-01-27T16:36:09+02:00
summary:
gh-119786: Fix small typo in AST to CFG to bytecode section in compiler.md (#129322)
files:
M InternalDocs/compiler.md
diff --git a/InternalDocs/compiler.md b/InternalDocs/compiler.md
index c257bfd9faf78f..8ca19a42b91b83 100644
--- a/InternalDocs/compiler.md
+++ b/InternalDocs/compiler.md
@@ -401,7 +401,7 @@ Emission of bytecode is handled by the following macros:
add the `LOAD_CONST` opcode with the proper argument based on the
position of the specified PyObject in the consts table.
* `ADDOP_LOAD_CONST_NEW(struct compiler *, location, PyObject *)`:
- just like `ADDOP_LOAD_CONST_NEW`, but steals a reference to PyObject
+ just like `ADDOP_LOAD_CONST`, but steals a reference to PyObject
* `ADDOP_JUMP(struct compiler *, location, int, basicblock *)`:
create a jump to a basic block
1
0
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
Jan. 27, 2025
https://github.com/python/cpython/commit/9546fe2ef2db921709f3cb355b33bba977…
commit: 9546fe2ef2db921709f3cb355b33bba977658672
branch: main
author: Hugo van Kemenade <1324225+hugovk(a)users.noreply.github.com>
committer: hugovk <1324225+hugovk(a)users.noreply.github.com>
date: 2025-01-27T16:24:10+02:00
summary:
gh-129061: Fix `FORCE_COLOR` and `NO_COLOR` when empty strings (#129140)
files:
A Misc/NEWS.d/next/Library/2025-01-21-18-52-32.gh-issue-129061.4idD_B.rst
M Lib/_colorize.py
M Lib/test/test__colorize.py
diff --git a/Lib/_colorize.py b/Lib/_colorize.py
index 5e36e45734a5fb..41e818f2a747ff 100644
--- a/Lib/_colorize.py
+++ b/Lib/_colorize.py
@@ -42,11 +42,11 @@ def can_colorize(*, file=None) -> bool:
return False
if os.environ.get("PYTHON_COLORS") == "1":
return True
- if "NO_COLOR" in os.environ:
+ if os.environ.get("NO_COLOR"):
return False
if not COLORIZE:
return False
- if "FORCE_COLOR" in os.environ:
+ if os.environ.get("FORCE_COLOR"):
return True
if os.environ.get("TERM") == "dumb":
return False
diff --git a/Lib/test/test__colorize.py b/Lib/test/test__colorize.py
index ff15d83cb078fe..056a5306ced183 100644
--- a/Lib/test/test__colorize.py
+++ b/Lib/test/test__colorize.py
@@ -44,8 +44,10 @@ def check(env, fallback, expected):
check({'TERM': ''}, fallback, fallback)
check({'FORCE_COLOR': '1'}, fallback, True)
check({'FORCE_COLOR': '0'}, fallback, True)
+ check({'FORCE_COLOR': ''}, fallback, fallback)
check({'NO_COLOR': '1'}, fallback, False)
check({'NO_COLOR': '0'}, fallback, False)
+ check({'NO_COLOR': ''}, fallback, fallback)
check({'TERM': 'dumb', 'FORCE_COLOR': '1'}, False, True)
check({'FORCE_COLOR': '1', 'NO_COLOR': '1'}, True, False)
diff --git a/Misc/NEWS.d/next/Library/2025-01-21-18-52-32.gh-issue-129061.4idD_B.rst b/Misc/NEWS.d/next/Library/2025-01-21-18-52-32.gh-issue-129061.4idD_B.rst
new file mode 100644
index 00000000000000..5c5c05e1161e86
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-01-21-18-52-32.gh-issue-129061.4idD_B.rst
@@ -0,0 +1 @@
+Fix FORCE_COLOR and NO_COLOR when empty strings. Patch by Hugo van Kemenade.
1
0
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
Jan. 27, 2025
https://github.com/python/cpython/commit/d6f010dead1a0d4b8a9e51f0187617b039…
commit: d6f010dead1a0d4b8a9e51f0187617b0394c9c2a
branch: main
author: Bénédikt Tran <10796600+picnixz(a)users.noreply.github.com>
committer: encukou <encukou(a)gmail.com>
date: 2025-01-27T15:15:42+01:00
summary:
gh-111178: fix UBSan failures in `Modules/_decimal` (GH-129074)
* Introduce & use cast macros
* fix UBSan failures for `PyDecContextObject`
* fix UBSan failures for `PyDecContextManagerObject`
* remove redundant casts for `PyDecObject`
files:
M Modules/_decimal/_decimal.c
diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
index b9abd8bd2e7a53..78cf6b1426493b 100644
--- a/Modules/_decimal/_decimal.c
+++ b/Modules/_decimal/_decimal.c
@@ -178,11 +178,15 @@ typedef struct {
mpd_uint_t data[_Py_DEC_MINALLOC];
} PyDecObject;
+#define _PyDecObject_CAST(op) ((PyDecObject *)(op))
+
typedef struct {
PyObject_HEAD
uint32_t *flags;
} PyDecSignalDictObject;
+#define _PyDecSignalDictObject_CAST(op) ((PyDecSignalDictObject *)(op))
+
typedef struct PyDecContextObject {
PyObject_HEAD
mpd_context_t ctx;
@@ -193,23 +197,27 @@ typedef struct PyDecContextObject {
decimal_state *modstate;
} PyDecContextObject;
+#define _PyDecContextObject_CAST(op) ((PyDecContextObject *)(op))
+
typedef struct {
PyObject_HEAD
PyObject *local;
PyObject *global;
} PyDecContextManagerObject;
+#define _PyDecContextManagerObject_CAST(op) ((PyDecContextManagerObject *)(op))
+
#undef MPD
#undef CTX
#define PyDec_CheckExact(st, v) Py_IS_TYPE(v, (st)->PyDec_Type)
#define PyDec_Check(st, v) PyObject_TypeCheck(v, (st)->PyDec_Type)
#define PyDecSignalDict_Check(st, v) Py_IS_TYPE(v, (st)->PyDecSignalDict_Type)
#define PyDecContext_Check(st, v) PyObject_TypeCheck(v, (st)->PyDecContext_Type)
-#define MPD(v) (&((PyDecObject *)v)->dec)
-#define SdFlagAddr(v) (((PyDecSignalDictObject *)v)->flags)
-#define SdFlags(v) (*((PyDecSignalDictObject *)v)->flags)
-#define CTX(v) (&((PyDecContextObject *)v)->ctx)
-#define CtxCaps(v) (((PyDecContextObject *)v)->capitals)
+#define MPD(v) (&_PyDecObject_CAST(v)->dec)
+#define SdFlagAddr(v) (_PyDecSignalDictObject_CAST(v)->flags)
+#define SdFlags(v) (*_PyDecSignalDictObject_CAST(v)->flags)
+#define CTX(v) (&_PyDecContextObject_CAST(v)->ctx)
+#define CtxCaps(v) (_PyDecContextObject_CAST(v)->capitals)
static inline decimal_state *
get_module_state_from_ctx(PyObject *v)
@@ -1413,8 +1421,9 @@ context_new(PyTypeObject *type,
}
static int
-context_traverse(PyDecContextObject *self, visitproc visit, void *arg)
+context_traverse(PyObject *op, visitproc visit, void *arg)
{
+ PyDecContextObject *self = _PyDecContextObject_CAST(op);
Py_VISIT(Py_TYPE(self));
Py_VISIT(self->traps);
Py_VISIT(self->flags);
@@ -1422,15 +1431,16 @@ context_traverse(PyDecContextObject *self, visitproc visit, void *arg)
}
static int
-context_clear(PyDecContextObject *self)
+context_clear(PyObject *op)
{
+ PyDecContextObject *self = _PyDecContextObject_CAST(op);
Py_CLEAR(self->traps);
Py_CLEAR(self->flags);
return 0;
}
static void
-context_dealloc(PyDecContextObject *self)
+context_dealloc(PyObject *self)
{
PyTypeObject *tp = Py_TYPE(self);
PyObject_GC_UnTrack(self);
@@ -1473,7 +1483,7 @@ context_init(PyObject *self, PyObject *args, PyObject *kwds)
}
static PyObject *
-context_repr(PyDecContextObject *self)
+context_repr(PyObject *self)
{
mpd_context_t *ctx;
char flags[MPD_MAX_SIGNAL_LIST];
@@ -1481,7 +1491,7 @@ context_repr(PyDecContextObject *self)
int n, mem;
#ifdef Py_DEBUG
- decimal_state *state = get_module_state_from_ctx((PyObject *)self);
+ decimal_state *state = get_module_state_from_ctx(self);
assert(PyDecContext_Check(state, self));
#endif
ctx = CTX(self);
@@ -1501,7 +1511,7 @@ context_repr(PyDecContextObject *self)
"Context(prec=%zd, rounding=%s, Emin=%zd, Emax=%zd, "
"capitals=%d, clamp=%d, flags=%s, traps=%s)",
ctx->prec, mpd_round_string[ctx->round], ctx->emin, ctx->emax,
- self->capitals, ctx->clamp, flags, traps);
+ CtxCaps(self), ctx->clamp, flags, traps);
}
static void
@@ -1621,16 +1631,16 @@ context_reduce(PyObject *self, PyObject *Py_UNUSED(dummy))
static PyGetSetDef context_getsets [] =
{
- { "prec", (getter)context_getprec, (setter)context_setprec, NULL, NULL},
- { "Emax", (getter)context_getemax, (setter)context_setemax, NULL, NULL},
- { "Emin", (getter)context_getemin, (setter)context_setemin, NULL, NULL},
- { "rounding", (getter)context_getround, (setter)context_setround, NULL, NULL},
- { "capitals", (getter)context_getcapitals, (setter)context_setcapitals, NULL, NULL},
- { "clamp", (getter)context_getclamp, (setter)context_setclamp, NULL, NULL},
+ { "prec", context_getprec, context_setprec, NULL, NULL},
+ { "Emax", context_getemax, context_setemax, NULL, NULL},
+ { "Emin", context_getemin, context_setemin, NULL, NULL},
+ { "rounding", context_getround, context_setround, NULL, NULL},
+ { "capitals", context_getcapitals, context_setcapitals, NULL, NULL},
+ { "clamp", context_getclamp, context_setclamp, NULL, NULL},
#ifdef EXTRA_FUNCTIONALITY
- { "_allcr", (getter)context_getallcr, (setter)context_setallcr, NULL, NULL},
- { "_traps", (getter)context_gettraps, (setter)context_settraps, NULL, NULL},
- { "_flags", (getter)context_getstatus, (setter)context_setstatus, NULL, NULL},
+ { "_allcr", context_getallcr, context_setallcr, NULL, NULL},
+ { "_traps", context_gettraps, context_settraps, NULL, NULL},
+ { "_flags", context_getstatus, context_setstatus, NULL, NULL},
#endif
{NULL}
};
@@ -1946,9 +1956,9 @@ ctxmanager_new(PyObject *m, PyObject *args, PyObject *kwds)
}
static int
-ctxmanager_traverse(PyDecContextManagerObject *self, visitproc visit,
- void *arg)
+ctxmanager_traverse(PyObject *op, visitproc visit, void *arg)
{
+ PyDecContextManagerObject *self = _PyDecContextManagerObject_CAST(op);
Py_VISIT(Py_TYPE(self));
Py_VISIT(self->local);
Py_VISIT(self->global);
@@ -1956,29 +1966,29 @@ ctxmanager_traverse(PyDecContextManagerObject *self, visitproc visit,
}
static int
-ctxmanager_clear(PyDecContextManagerObject *self)
+ctxmanager_clear(PyObject *op)
{
+ PyDecContextManagerObject *self = _PyDecContextManagerObject_CAST(op);
Py_CLEAR(self->local);
Py_CLEAR(self->global);
return 0;
}
static void
-ctxmanager_dealloc(PyDecContextManagerObject *self)
+ctxmanager_dealloc(PyObject *self)
{
PyTypeObject *tp = Py_TYPE(self);
PyObject_GC_UnTrack(self);
(void)ctxmanager_clear(self);
- tp->tp_free((PyObject *)self);
+ tp->tp_free(self);
Py_DECREF(tp);
}
static PyObject *
-ctxmanager_set_local(PyDecContextManagerObject *self,
- PyObject *Py_UNUSED(dummy))
+ctxmanager_set_local(PyObject *op, PyObject *Py_UNUSED(dummy))
{
PyObject *ret;
-
+ PyDecContextManagerObject *self = _PyDecContextManagerObject_CAST(op);
ret = PyDec_SetCurrentContext(PyType_GetModule(Py_TYPE(self)), self->local);
if (ret == NULL) {
return NULL;
@@ -1989,11 +1999,10 @@ ctxmanager_set_local(PyDecContextManagerObject *self,
}
static PyObject *
-ctxmanager_restore_global(PyDecContextManagerObject *self,
- PyObject *Py_UNUSED(args))
+ctxmanager_restore_global(PyObject *op, PyObject *Py_UNUSED(args))
{
PyObject *ret;
-
+ PyDecContextManagerObject *self = _PyDecContextManagerObject_CAST(op);
ret = PyDec_SetCurrentContext(PyType_GetModule(Py_TYPE(self)), self->global);
if (ret == NULL) {
return NULL;
@@ -2005,8 +2014,8 @@ ctxmanager_restore_global(PyDecContextManagerObject *self,
static PyMethodDef ctxmanager_methods[] = {
- {"__enter__", (PyCFunction)ctxmanager_set_local, METH_NOARGS, NULL},
- {"__exit__", (PyCFunction)ctxmanager_restore_global, METH_VARARGS, NULL},
+ {"__enter__", ctxmanager_set_local, METH_NOARGS, NULL},
+ {"__exit__", ctxmanager_restore_global, METH_VARARGS, NULL},
{NULL, NULL}
};
@@ -5041,8 +5050,8 @@ dec_imag(PyObject *self, void *Py_UNUSED(closure))
static PyGetSetDef dec_getsets [] =
{
- { "real", (getter)dec_real, NULL, NULL, NULL},
- { "imag", (getter)dec_imag, NULL, NULL, NULL},
+ { "real", dec_real, NULL, NULL, NULL},
+ { "imag", dec_imag, NULL, NULL, NULL},
{NULL}
};
1
0
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
Jan. 27, 2025
https://github.com/python/cpython/commit/ced296d2c0483ad74988b263921917f107…
commit: ced296d2c0483ad74988b263921917f107a1da04
branch: main
author: Bénédikt Tran <10796600+picnixz(a)users.noreply.github.com>
committer: encukou <encukou(a)gmail.com>
date: 2025-01-27T15:07:39+01:00
summary:
gh-111178: fix UBSan failures in `Python/traceback.c` (GH-128259)
files:
M Python/traceback.c
diff --git a/Python/traceback.c b/Python/traceback.c
index 62387f12392265..870ae5bcefe9eb 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -38,6 +38,8 @@ class traceback "PyTracebackObject *" "&PyTraceback_Type"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=cf96294b2bebc811]*/
+#define _PyTracebackObject_CAST(op) ((PyTracebackObject *)(op))
+
#include "clinic/traceback.c.h"
static PyObject *
@@ -91,15 +93,16 @@ tb_new_impl(PyTypeObject *type, PyObject *tb_next, PyFrameObject *tb_frame,
}
static PyObject *
-tb_dir(PyTracebackObject *self, PyObject *Py_UNUSED(ignored))
+tb_dir(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
{
return Py_BuildValue("[ssss]", "tb_frame", "tb_next",
"tb_lasti", "tb_lineno");
}
static PyObject *
-tb_next_get(PyTracebackObject *self, void *Py_UNUSED(_))
+tb_next_get(PyObject *op, void *Py_UNUSED(_))
{
+ PyTracebackObject *self = _PyTracebackObject_CAST(op);
PyObject* ret = (PyObject*)self->tb_next;
if (!ret) {
ret = Py_None;
@@ -108,18 +111,21 @@ tb_next_get(PyTracebackObject *self, void *Py_UNUSED(_))
}
static int
-tb_get_lineno(PyTracebackObject* tb) {
+tb_get_lineno(PyObject *op)
+{
+ PyTracebackObject *tb = _PyTracebackObject_CAST(op);
_PyInterpreterFrame* frame = tb->tb_frame->f_frame;
assert(frame != NULL);
return PyCode_Addr2Line(_PyFrame_GetCode(frame), tb->tb_lasti);
}
static PyObject *
-tb_lineno_get(PyTracebackObject *self, void *Py_UNUSED(_))
+tb_lineno_get(PyObject *op, void *Py_UNUSED(_))
{
+ PyTracebackObject *self = _PyTracebackObject_CAST(op);
int lineno = self->tb_lineno;
if (lineno == -1) {
- lineno = tb_get_lineno(self);
+ lineno = tb_get_lineno(op);
if (lineno < 0) {
Py_RETURN_NONE;
}
@@ -128,7 +134,7 @@ tb_lineno_get(PyTracebackObject *self, void *Py_UNUSED(_))
}
static int
-tb_next_set(PyTracebackObject *self, PyObject *new_next, void *Py_UNUSED(_))
+tb_next_set(PyObject *op, PyObject *new_next, void *Py_UNUSED(_))
{
if (!new_next) {
PyErr_Format(PyExc_TypeError, "can't delete tb_next attribute");
@@ -147,6 +153,7 @@ tb_next_set(PyTracebackObject *self, PyObject *new_next, void *Py_UNUSED(_))
}
/* Check for loops */
+ PyTracebackObject *self = _PyTracebackObject_CAST(op);
PyTracebackObject *cursor = (PyTracebackObject *)new_next;
while (cursor) {
if (cursor == self) {
@@ -163,7 +170,7 @@ tb_next_set(PyTracebackObject *self, PyObject *new_next, void *Py_UNUSED(_))
static PyMethodDef tb_methods[] = {
- {"__dir__", _PyCFunction_CAST(tb_dir), METH_NOARGS},
+ {"__dir__", tb_dir, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL},
};
@@ -174,14 +181,15 @@ static PyMemberDef tb_memberlist[] = {
};
static PyGetSetDef tb_getsetters[] = {
- {"tb_next", (getter)tb_next_get, (setter)tb_next_set, NULL, NULL},
- {"tb_lineno", (getter)tb_lineno_get, NULL, NULL, NULL},
+ {"tb_next", tb_next_get, tb_next_set, NULL, NULL},
+ {"tb_lineno", tb_lineno_get, NULL, NULL, NULL},
{NULL} /* Sentinel */
};
static void
-tb_dealloc(PyTracebackObject *tb)
+tb_dealloc(PyObject *op)
{
+ PyTracebackObject *tb = _PyTracebackObject_CAST(op);
PyObject_GC_UnTrack(tb);
Py_TRASHCAN_BEGIN(tb, tb_dealloc)
Py_XDECREF(tb->tb_next);
@@ -191,16 +199,18 @@ tb_dealloc(PyTracebackObject *tb)
}
static int
-tb_traverse(PyTracebackObject *tb, visitproc visit, void *arg)
+tb_traverse(PyObject *op, visitproc visit, void *arg)
{
+ PyTracebackObject *tb = _PyTracebackObject_CAST(op);
Py_VISIT(tb->tb_next);
Py_VISIT(tb->tb_frame);
return 0;
}
static int
-tb_clear(PyTracebackObject *tb)
+tb_clear(PyObject *op)
{
+ PyTracebackObject *tb = _PyTracebackObject_CAST(op);
Py_CLEAR(tb->tb_next);
Py_CLEAR(tb->tb_frame);
return 0;
@@ -211,7 +221,7 @@ PyTypeObject PyTraceBack_Type = {
"traceback",
sizeof(PyTracebackObject),
0,
- (destructor)tb_dealloc, /*tp_dealloc*/
+ tb_dealloc, /*tp_dealloc*/
0, /*tp_vectorcall_offset*/
0, /*tp_getattr*/
0, /*tp_setattr*/
@@ -228,8 +238,8 @@ PyTypeObject PyTraceBack_Type = {
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
tb_new__doc__, /* tp_doc */
- (traverseproc)tb_traverse, /* tp_traverse */
- (inquiry)tb_clear, /* tp_clear */
+ tb_traverse, /* tp_traverse */
+ tb_clear, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
@@ -663,7 +673,7 @@ tb_printinternal(PyTracebackObject *tb, PyObject *f, long limit)
code = PyFrame_GetCode(tb->tb_frame);
int tb_lineno = tb->tb_lineno;
if (tb_lineno == -1) {
- tb_lineno = tb_get_lineno(tb);
+ tb_lineno = tb_get_lineno((PyObject *)tb);
}
if (last_file == NULL ||
code->co_filename != last_file ||
1
0
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
Jan. 27, 2025
https://github.com/python/cpython/commit/6bb03c74907492f2315f39a342e1e47bbd…
commit: 6bb03c74907492f2315f39a342e1e47bbd5e1a56
branch: main
author: Bénédikt Tran <10796600+picnixz(a)users.noreply.github.com>
committer: encukou <encukou(a)gmail.com>
date: 2025-01-27T15:06:10+01:00
summary:
gh-111178: fix UBSan failures in `Modules/socketmodule.c` (GH-128249)
files:
M Modules/socketmodule.c
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 5e81253ca4a591..01811afa578119 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -602,6 +602,8 @@ get_sock_fd(PySocketSockObject *s)
#endif
}
+#define _PySocketSockObject_CAST(op) ((PySocketSockObject *)(op))
+
static inline socket_state *
get_module_state(PyObject *mod)
{
@@ -2929,8 +2931,10 @@ sock_accept_impl(PySocketSockObject *s, void *data)
/* s._accept() -> (fd, address) */
static PyObject *
-sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
+sock_accept(PyObject *self, PyObject *Py_UNUSED(ignored))
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
sock_addr_t addrbuf;
SOCKET_T newfd;
socklen_t addrlen;
@@ -3010,7 +3014,7 @@ For IP sockets, the address info is a pair (hostaddr, port).");
*/
static PyObject *
-sock_setblocking(PySocketSockObject *s, PyObject *arg)
+sock_setblocking(PyObject *self, PyObject *arg)
{
long block;
@@ -3018,6 +3022,7 @@ sock_setblocking(PySocketSockObject *s, PyObject *arg)
if (block < 0)
return NULL;
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
if (internal_setblocking(s, block) == -1) {
return NULL;
@@ -3037,8 +3042,9 @@ setblocking(False) is equivalent to settimeout(0.0).");
False if it is in non-blocking mode.
*/
static PyObject *
-sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
+sock_getblocking(PyObject *self, PyObject *Py_UNUSED(ignored))
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
if (s->sock_timeout) {
Py_RETURN_TRUE;
}
@@ -3101,13 +3107,14 @@ socket_parse_timeout(PyTime_t *timeout, PyObject *timeout_obj)
< 0 -- illegal; raises an exception
*/
static PyObject *
-sock_settimeout(PySocketSockObject *s, PyObject *arg)
+sock_settimeout(PyObject *self, PyObject *arg)
{
PyTime_t timeout;
if (socket_parse_timeout(&timeout, arg) < 0)
return NULL;
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
s->sock_timeout = timeout;
int block = timeout < 0;
@@ -3149,8 +3156,9 @@ Setting a timeout of zero is the same as setblocking(0).");
/* s.gettimeout() method.
Returns the timeout associated with a socket. */
static PyObject *
-sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
+sock_gettimeout_impl(PyObject *self, void *Py_UNUSED(ignored))
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
if (s->sock_timeout < 0) {
Py_RETURN_NONE;
}
@@ -3160,6 +3168,18 @@ sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
}
}
+static inline PyObject *
+sock_gettimeout_method(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ return sock_gettimeout_impl(self, NULL);
+}
+
+static inline PyObject *
+sock_gettimeout_getter(PyObject *self, void *Py_UNUSED(closure))
+{
+ return sock_gettimeout_impl(self, NULL);
+}
+
PyDoc_STRVAR(gettimeout_doc,
"gettimeout() -> timeout\n\
\n\
@@ -3177,8 +3197,10 @@ operations are disabled.");
*/
static PyObject *
-sock_setsockopt(PySocketSockObject *s, PyObject *args)
+sock_setsockopt(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
int level;
int optname;
int res;
@@ -3276,8 +3298,10 @@ None, optlen.");
use optional built-in module 'struct' to decode the string. */
static PyObject *
-sock_getsockopt(PySocketSockObject *s, PyObject *args)
+sock_getsockopt(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
int level;
int optname;
int res;
@@ -3351,8 +3375,10 @@ string of that length; otherwise it is an integer.");
/* s.bind(sockaddr) method */
static PyObject *
-sock_bind(PySocketSockObject *s, PyObject *addro)
+sock_bind(PyObject *self, PyObject *addro)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
sock_addr_t addrbuf;
int addrlen;
int res;
@@ -3423,8 +3449,9 @@ _socket_socket_close_impl(PySocketSockObject *s)
}
static PyObject *
-sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
+sock_detach(PyObject *self, PyObject *Py_UNUSED(ignored))
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
SOCKET_T fd = get_sock_fd(s);
set_sock_fd(s, INVALID_SOCKET);
return PyLong_FromSocket_t(fd);
@@ -3540,8 +3567,10 @@ internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
/* s.connect(sockaddr) method */
static PyObject *
-sock_connect(PySocketSockObject *s, PyObject *addro)
+sock_connect(PyObject *self, PyObject *addro)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
sock_addr_t addrbuf;
int addrlen;
int res;
@@ -3573,8 +3602,10 @@ is a pair (host, port).");
/* s.connect_ex(sockaddr) method */
static PyObject *
-sock_connect_ex(PySocketSockObject *s, PyObject *addro)
+sock_connect_ex(PyObject *self, PyObject *addro)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
sock_addr_t addrbuf;
int addrlen;
int res;
@@ -3606,8 +3637,9 @@ instead of raising an exception when an error occurs.");
/* s.fileno() method */
static PyObject *
-sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
+sock_fileno(PyObject *self, PyObject *Py_UNUSED(ignored))
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
return PyLong_FromSocket_t(get_sock_fd(s));
}
@@ -3621,8 +3653,10 @@ Return the integer file descriptor of the socket.");
/* s.getsockname() method */
static PyObject *
-sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
+sock_getsockname(PyObject *self, PyObject *Py_UNUSED(ignored))
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
sock_addr_t addrbuf;
int res;
socklen_t addrlen;
@@ -3653,8 +3687,10 @@ address family. For IPv4 sockets, the address info is a pair\n\
/* s.getpeername() method */
static PyObject *
-sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
+sock_getpeername(PyObject *self, PyObject *Py_UNUSED(ignored))
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
sock_addr_t addrbuf;
int res;
socklen_t addrlen;
@@ -3684,8 +3720,9 @@ info is a pair (hostaddr, port).");
/* s.listen(n) method */
static PyObject *
-sock_listen(PySocketSockObject *s, PyObject *args)
+sock_listen(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
/* We try to choose a default backlog high enough to avoid connection drops
* for common workloads, yet not too high to limit resource usage. */
int backlog = Py_MIN(SOMAXCONN, 128);
@@ -3774,8 +3811,10 @@ sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
/* s.recv(nbytes [,flags]) method */
static PyObject *
-sock_recv(PySocketSockObject *s, PyObject *args)
+sock_recv(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
Py_ssize_t recvlen, outlen;
int flags = 0;
PyObject *buf;
@@ -3823,9 +3862,10 @@ the remote end is closed and all data is read, return the empty string.");
/* s.recv_into(buffer, [nbytes [,flags]]) method */
static PyObject*
-sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
+sock_recv_into(PyObject *self, PyObject *args, PyObject *kwds)
{
static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
int flags = 0;
Py_buffer pbuf;
@@ -3959,8 +3999,10 @@ sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
/* s.recvfrom(nbytes [,flags]) method */
static PyObject *
-sock_recvfrom(PySocketSockObject *s, PyObject *args)
+sock_recvfrom(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
PyObject *buf = NULL;
PyObject *addr = NULL;
PyObject *ret = NULL;
@@ -4011,9 +4053,10 @@ Like recv(buffersize, flags) but also return the sender's address info.");
/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
static PyObject *
-sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
+sock_recvfrom_into(PyObject *self, PyObject *args, PyObject* kwds)
{
static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
int flags = 0;
Py_buffer pbuf;
@@ -4239,8 +4282,10 @@ makeval_recvmsg(ssize_t received, void *data)
/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
static PyObject *
-sock_recvmsg(PySocketSockObject *s, PyObject *args)
+sock_recvmsg(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
Py_ssize_t bufsize, ancbufsize = 0;
int flags = 0;
struct iovec iov;
@@ -4306,8 +4351,10 @@ makeval_recvmsg_into(ssize_t received, void *data)
/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
static PyObject *
-sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
+sock_recvmsg_into(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
Py_ssize_t ancbufsize = 0;
int flags = 0;
struct iovec *iovs = NULL;
@@ -4417,8 +4464,10 @@ sock_send_impl(PySocketSockObject *s, void *data)
/* s.send(data [,flags]) method */
static PyObject *
-sock_send(PySocketSockObject *s, PyObject *args)
+sock_send(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
int flags = 0;
Py_buffer pbuf;
struct sock_send ctx;
@@ -4453,8 +4502,10 @@ sent; this may be less than len(data) if the network is busy.");
/* s.sendall(data [,flags]) method */
static PyObject *
-sock_sendall(PySocketSockObject *s, PyObject *args)
+sock_sendall(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
char *buf;
Py_ssize_t len, n;
int flags = 0;
@@ -4558,8 +4609,10 @@ sock_sendto_impl(PySocketSockObject *s, void *data)
/* s.sendto(data, [flags,] sockaddr) method */
static PyObject *
-sock_sendto(PySocketSockObject *s, PyObject *args)
+sock_sendto(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
Py_buffer pbuf;
PyObject *addro;
Py_ssize_t arglen;
@@ -4702,8 +4755,10 @@ sock_sendmsg_impl(PySocketSockObject *s, void *data)
/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
static PyObject *
-sock_sendmsg(PySocketSockObject *s, PyObject *args)
+sock_sendmsg(PyObject *self, PyObject *args)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Py_buffer *databufs = NULL;
sock_addr_t addrbuf;
@@ -4906,8 +4961,10 @@ data sent.");
#ifdef HAVE_SOCKADDR_ALG
static PyObject*
-sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
+sock_sendmsg_afalg(PyObject *s, PyObject *args, PyObject *kwds)
{
+ PySocketSockObject *self = _PySocketSockObject_CAST(s);
+
PyObject *retval = NULL;
Py_ssize_t i, ndatabufs = 0;
@@ -5074,8 +5131,10 @@ operation socket.");
/* s.shutdown(how) method */
static PyObject *
-sock_shutdown(PySocketSockObject *s, PyObject *arg)
+sock_shutdown(PyObject *self, PyObject *arg)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
int how;
int res;
@@ -5099,8 +5158,10 @@ of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
static PyObject*
-sock_ioctl(PySocketSockObject *s, PyObject *arg)
+sock_ioctl(PyObject *self, PyObject *arg)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
unsigned long cmd = SIO_RCVALL;
PyObject *argO;
DWORD recv;
@@ -5155,8 +5216,10 @@ SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default"
#if defined(MS_WINDOWS)
static PyObject*
-sock_share(PySocketSockObject *s, PyObject *arg)
+sock_share(PyObject *self, PyObject *arg)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
WSAPROTOCOL_INFOW info;
DWORD processId;
int result;
@@ -5186,93 +5249,82 @@ socket.fromshare().");
static PyMethodDef sock_methods[] = {
#if defined(HAVE_ACCEPT) || defined(HAVE_ACCEPT4)
- {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
- accept_doc},
+ {"_accept", sock_accept, METH_NOARGS, accept_doc},
#endif
#ifdef HAVE_BIND
- {"bind", (PyCFunction)sock_bind, METH_O,
- bind_doc},
+ {"bind", sock_bind, METH_O, bind_doc},
#endif
_SOCKET_SOCKET_CLOSE_METHODDEF
#ifdef HAVE_CONNECT
- {"connect", (PyCFunction)sock_connect, METH_O,
- connect_doc},
- {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
- connect_ex_doc},
-#endif
- {"detach", (PyCFunction)sock_detach, METH_NOARGS,
- detach_doc},
- {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
- fileno_doc},
+ {"connect", sock_connect, METH_O, connect_doc},
+ {"connect_ex", sock_connect_ex, METH_O, connect_ex_doc},
+#endif
+ {"detach", sock_detach, METH_NOARGS, detach_doc},
+ {"fileno", sock_fileno, METH_NOARGS, fileno_doc},
#ifdef HAVE_GETPEERNAME
- {"getpeername", (PyCFunction)sock_getpeername,
- METH_NOARGS, getpeername_doc},
+ {"getpeername", sock_getpeername, METH_NOARGS, getpeername_doc},
#endif
#ifdef HAVE_GETSOCKNAME
- {"getsockname", (PyCFunction)sock_getsockname,
- METH_NOARGS, getsockname_doc},
+ {"getsockname", sock_getsockname, METH_NOARGS, getsockname_doc},
#endif
- {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
- getsockopt_doc},
+ {"getsockopt", sock_getsockopt, METH_VARARGS, getsockopt_doc},
#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
- {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
- sock_ioctl_doc},
+ {"ioctl", sock_ioctl, METH_VARARGS, sock_ioctl_doc},
#endif
#if defined(MS_WINDOWS)
- {"share", (PyCFunction)sock_share, METH_VARARGS,
- sock_share_doc},
+ {"share", sock_share, METH_VARARGS, sock_share_doc},
#endif
#ifdef HAVE_LISTEN
- {"listen", (PyCFunction)sock_listen, METH_VARARGS,
- listen_doc},
+ {"listen", sock_listen, METH_VARARGS, listen_doc},
#endif
- {"recv", (PyCFunction)sock_recv, METH_VARARGS,
- recv_doc},
- {"recv_into", _PyCFunction_CAST(sock_recv_into), METH_VARARGS | METH_KEYWORDS,
- recv_into_doc},
+ {"recv", sock_recv, METH_VARARGS, recv_doc},
+ {
+ "recv_into",
+ _PyCFunction_CAST(sock_recv_into),
+ METH_VARARGS | METH_KEYWORDS,
+ recv_into_doc
+ },
#ifdef HAVE_RECVFROM
- {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
- recvfrom_doc},
- {"recvfrom_into", _PyCFunction_CAST(sock_recvfrom_into), METH_VARARGS | METH_KEYWORDS,
- recvfrom_into_doc},
-#endif
- {"send", (PyCFunction)sock_send, METH_VARARGS,
- send_doc},
- {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
- sendall_doc},
+ {"recvfrom", sock_recvfrom, METH_VARARGS, recvfrom_doc},
+ {
+ "recvfrom_into",
+ _PyCFunction_CAST(sock_recvfrom_into),
+ METH_VARARGS | METH_KEYWORDS,
+ recvfrom_into_doc
+ },
+#endif
+ {"send", sock_send, METH_VARARGS, send_doc},
+ {"sendall", sock_sendall, METH_VARARGS, sendall_doc},
#ifdef HAVE_SENDTO
- {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
- sendto_doc},
-#endif
- {"setblocking", (PyCFunction)sock_setblocking, METH_O,
- setblocking_doc},
- {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
- getblocking_doc},
- {"settimeout", (PyCFunction)sock_settimeout, METH_O,
- settimeout_doc},
- {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
- gettimeout_doc},
+ {"sendto", sock_sendto, METH_VARARGS, sendto_doc},
+#endif
+ {"setblocking", sock_setblocking, METH_O, setblocking_doc},
+ {"getblocking", sock_getblocking, METH_NOARGS, getblocking_doc},
+ {"settimeout", sock_settimeout, METH_O, settimeout_doc},
+ {
+ "gettimeout", sock_gettimeout_method, METH_NOARGS,
+ gettimeout_doc
+ },
#ifdef HAVE_SETSOCKOPT
- {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
- setsockopt_doc},
+ {"setsockopt", sock_setsockopt, METH_VARARGS, setsockopt_doc},
#endif
#ifdef HAVE_SHUTDOWN
- {"shutdown", (PyCFunction)sock_shutdown, METH_O,
- shutdown_doc},
+ {"shutdown", sock_shutdown, METH_O, shutdown_doc},
#endif
#ifdef CMSG_LEN
- {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
- recvmsg_doc},
- {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
- recvmsg_into_doc,},
- {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
- sendmsg_doc},
+ {"recvmsg", sock_recvmsg, METH_VARARGS, recvmsg_doc},
+ {"recvmsg_into", sock_recvmsg_into, METH_VARARGS, recvmsg_into_doc},
+ {"sendmsg", sock_sendmsg, METH_VARARGS, sendmsg_doc},
#endif
#ifdef HAVE_SOCKADDR_ALG
- {"sendmsg_afalg", _PyCFunction_CAST(sock_sendmsg_afalg), METH_VARARGS | METH_KEYWORDS,
- sendmsg_afalg_doc},
+ {
+ "sendmsg_afalg",
+ _PyCFunction_CAST(sock_sendmsg_afalg),
+ METH_VARARGS | METH_KEYWORDS,
+ sendmsg_afalg_doc
+ },
#endif
- {NULL, NULL} /* sentinel */
+ {NULL, NULL, 0, NULL} /* sentinel */
};
/* SockObject members */
@@ -5284,7 +5336,7 @@ static PyMemberDef sock_memberlist[] = {
};
static PyGetSetDef sock_getsetlist[] = {
- {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
+ {"timeout", sock_gettimeout_getter, NULL, PyDoc_STR("the socket timeout")},
{NULL} /* sentinel */
};
@@ -5292,8 +5344,10 @@ static PyGetSetDef sock_getsetlist[] = {
First close the file description. */
static void
-sock_finalize(PySocketSockObject *s)
+sock_finalize(PyObject *self)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
SOCKET_T fd;
/* Save the current exception, if any. */
@@ -5325,28 +5379,30 @@ sock_finalize(PySocketSockObject *s)
}
static int
-sock_traverse(PySocketSockObject *s, visitproc visit, void *arg)
+sock_traverse(PyObject *s, visitproc visit, void *arg)
{
Py_VISIT(Py_TYPE(s));
return 0;
}
static void
-sock_dealloc(PySocketSockObject *s)
+sock_dealloc(PyObject *s)
{
- if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0) {
+ if (PyObject_CallFinalizerFromDealloc(s) < 0) {
return;
}
PyTypeObject *tp = Py_TYPE(s);
PyObject_GC_UnTrack(s);
- tp->tp_free((PyObject *)s);
+ tp->tp_free(s);
Py_DECREF(tp);
}
static PyObject *
-sock_repr(PySocketSockObject *s)
+sock_repr(PyObject *self)
{
+ PySocketSockObject *s = _PySocketSockObject_CAST(self);
+
long sock_fd;
/* On Windows, this test is needed because SOCKET_T is unsigned */
if (get_sock_fd(s) == INVALID_SOCKET) {
1
0
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
gh-111178: fix UBSan failures in `Modules/{blake2,md5,sha1,sha2,sha3}module.c` (GH-128248)
by encukou Jan. 27, 2025
by encukou Jan. 27, 2025
Jan. 27, 2025
https://github.com/python/cpython/commit/922cfecbcefe7c3ab26ca9db4e656f4503…
commit: 922cfecbcefe7c3ab26ca9db4e656f450378cc24
branch: main
author: Bénédikt Tran <10796600+picnixz(a)users.noreply.github.com>
committer: encukou <encukou(a)gmail.com>
date: 2025-01-27T14:50:58+01:00
summary:
gh-111178: fix UBSan failures in `Modules/{blake2,md5,sha1,sha2,sha3}module.c` (GH-128248)
- fix UBSan failures in `blake2module.c`
- fix UBSan failures in `md5module.c`
- fix UBSan failures in `sha1module.c`
- fix UBSan failures in `sha2module.c`
- fix UBSan failures in `sha3module.c`
Cosmetics:
- suppress unused return values
- remove redundant casts in constructors
- suppress unused parameters in `{md5,sha*,blake2}module.c`
files:
M Modules/blake2module.c
M Modules/md5module.c
M Modules/sha1module.c
M Modules/sha2module.c
M Modules/sha3module.c
diff --git a/Modules/blake2module.c b/Modules/blake2module.c
index 6723e7de4675a5..016c834c01bbe2 100644
--- a/Modules/blake2module.c
+++ b/Modules/blake2module.c
@@ -366,6 +366,8 @@ typedef struct {
PyMutex mutex;
} Blake2Object;
+#define _Blake2Object_CAST(op) ((Blake2Object *)(op))
+
#include "clinic/blake2module.c.h"
/*[clinic input]
@@ -849,24 +851,27 @@ static PyMethodDef py_blake2b_methods[] = {
static PyObject *
-py_blake2b_get_name(Blake2Object *self, void *closure)
+py_blake2b_get_name(PyObject *op, void *Py_UNUSED(closure))
{
+ Blake2Object *self = _Blake2Object_CAST(op);
return PyUnicode_FromString(is_blake2b(self->impl) ? "blake2b" : "blake2s");
}
static PyObject *
-py_blake2b_get_block_size(Blake2Object *self, void *closure)
+py_blake2b_get_block_size(PyObject *op, void *Py_UNUSED(closure))
{
+ Blake2Object *self = _Blake2Object_CAST(op);
return PyLong_FromLong(is_blake2b(self->impl) ? HACL_HASH_BLAKE2B_BLOCK_BYTES : HACL_HASH_BLAKE2S_BLOCK_BYTES);
}
static PyObject *
-py_blake2b_get_digest_size(Blake2Object *self, void *closure)
+py_blake2b_get_digest_size(PyObject *op, void *Py_UNUSED(closure))
{
+ Blake2Object *self = _Blake2Object_CAST(op);
switch (self->impl) {
#if HACL_CAN_COMPILE_SIMD256
case Blake2b_256:
@@ -887,15 +892,13 @@ py_blake2b_get_digest_size(Blake2Object *self, void *closure)
static PyGetSetDef py_blake2b_getsetters[] = {
- {"name", (getter)py_blake2b_get_name,
- NULL, NULL, NULL},
- {"block_size", (getter)py_blake2b_get_block_size,
- NULL, NULL, NULL},
- {"digest_size", (getter)py_blake2b_get_digest_size,
- NULL, NULL, NULL},
- {NULL}
+ {"name", py_blake2b_get_name, NULL, NULL, NULL},
+ {"block_size", py_blake2b_get_block_size, NULL, NULL, NULL},
+ {"digest_size", py_blake2b_get_digest_size, NULL, NULL, NULL},
+ {NULL} /* Sentinel */
};
+
static int
py_blake2_clear(PyObject *op)
{
diff --git a/Modules/md5module.c b/Modules/md5module.c
index ef9163e8be5b6c..d86c8e555012d7 100644
--- a/Modules/md5module.c
+++ b/Modules/md5module.c
@@ -54,6 +54,8 @@ typedef struct {
Hacl_Hash_MD5_state_t *hash_state;
} MD5object;
+#define _MD5object_CAST(op) ((MD5object *)(op))
+
#include "clinic/md5module.c.h"
@@ -72,7 +74,7 @@ md5_get_state(PyObject *module)
static MD5object *
newMD5object(MD5State * st)
{
- MD5object *md5 = (MD5object *)PyObject_GC_New(MD5object, st->md5_type);
+ MD5object *md5 = PyObject_GC_New(MD5object, st->md5_type);
if (!md5) {
return NULL;
}
@@ -91,10 +93,11 @@ MD5_traverse(PyObject *ptr, visitproc visit, void *arg)
}
static void
-MD5_dealloc(MD5object *ptr)
+MD5_dealloc(PyObject *op)
{
+ MD5object *ptr = _MD5object_CAST(op);
Hacl_Hash_MD5_free(ptr->hash_state);
- PyTypeObject *tp = Py_TYPE((PyObject*)ptr);
+ PyTypeObject *tp = Py_TYPE(op);
PyObject_GC_UnTrack(ptr);
PyObject_GC_Del(ptr);
Py_DECREF(tp);
@@ -224,36 +227,27 @@ static PyMethodDef MD5_methods[] = {
};
static PyObject *
-MD5_get_block_size(PyObject *self, void *closure)
+MD5_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyLong_FromLong(MD5_BLOCKSIZE);
}
static PyObject *
-MD5_get_name(PyObject *self, void *closure)
+MD5_get_name(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyUnicode_FromStringAndSize("md5", 3);
}
static PyObject *
-md5_get_digest_size(PyObject *self, void *closure)
+md5_get_digest_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyLong_FromLong(MD5_DIGESTSIZE);
}
static PyGetSetDef MD5_getseters[] = {
- {"block_size",
- (getter)MD5_get_block_size, NULL,
- NULL,
- NULL},
- {"name",
- (getter)MD5_get_name, NULL,
- NULL,
- NULL},
- {"digest_size",
- (getter)md5_get_digest_size, NULL,
- NULL,
- NULL},
+ {"block_size", MD5_get_block_size, NULL, NULL, NULL},
+ {"name", MD5_get_name, NULL, NULL, NULL},
+ {"digest_size", md5_get_digest_size, NULL, NULL, NULL},
{NULL} /* Sentinel */
};
diff --git a/Modules/sha1module.c b/Modules/sha1module.c
index 34a427a39b5cf8..d0b1e8250770d0 100644
--- a/Modules/sha1module.c
+++ b/Modules/sha1module.c
@@ -55,6 +55,8 @@ typedef struct {
Hacl_Hash_SHA1_state_t *hash_state;
} SHA1object;
+#define _SHA1object_CAST(op) ((SHA1object *)(op))
+
#include "clinic/sha1module.c.h"
@@ -73,7 +75,7 @@ sha1_get_state(PyObject *module)
static SHA1object *
newSHA1object(SHA1State *st)
{
- SHA1object *sha = (SHA1object *)PyObject_GC_New(SHA1object, st->sha1_type);
+ SHA1object *sha = PyObject_GC_New(SHA1object, st->sha1_type);
if (sha == NULL) {
return NULL;
}
@@ -93,8 +95,9 @@ SHA1_traverse(PyObject *ptr, visitproc visit, void *arg)
}
static void
-SHA1_dealloc(SHA1object *ptr)
+SHA1_dealloc(PyObject *op)
{
+ SHA1object *ptr = _SHA1object_CAST(op);
Hacl_Hash_SHA1_free(ptr->hash_state);
PyTypeObject *tp = Py_TYPE(ptr);
PyObject_GC_UnTrack(ptr);
@@ -217,36 +220,27 @@ static PyMethodDef SHA1_methods[] = {
};
static PyObject *
-SHA1_get_block_size(PyObject *self, void *closure)
+SHA1_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyLong_FromLong(SHA1_BLOCKSIZE);
}
static PyObject *
-SHA1_get_name(PyObject *self, void *closure)
+SHA1_get_name(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyUnicode_FromStringAndSize("sha1", 4);
}
static PyObject *
-sha1_get_digest_size(PyObject *self, void *closure)
+sha1_get_digest_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyLong_FromLong(SHA1_DIGESTSIZE);
}
static PyGetSetDef SHA1_getseters[] = {
- {"block_size",
- (getter)SHA1_get_block_size, NULL,
- NULL,
- NULL},
- {"name",
- (getter)SHA1_get_name, NULL,
- NULL,
- NULL},
- {"digest_size",
- (getter)sha1_get_digest_size, NULL,
- NULL,
- NULL},
+ {"block_size", SHA1_get_block_size, NULL, NULL, NULL},
+ {"name", SHA1_get_name, NULL, NULL, NULL},
+ {"digest_size", sha1_get_digest_size, NULL, NULL, NULL},
{NULL} /* Sentinel */
};
@@ -346,7 +340,7 @@ _sha1_clear(PyObject *module)
static void
_sha1_free(void *module)
{
- _sha1_clear((PyObject *)module);
+ (void)_sha1_clear((PyObject *)module);
}
static int
diff --git a/Modules/sha2module.c b/Modules/sha2module.c
index 7d6a1e40243f9d..45fa120cf76758 100644
--- a/Modules/sha2module.c
+++ b/Modules/sha2module.c
@@ -67,6 +67,9 @@ typedef struct {
Hacl_Hash_SHA2_state_t_512 *state;
} SHA512object;
+#define _SHA256object_CAST(op) ((SHA256object *)(op))
+#define _SHA512object_CAST(op) ((SHA512object *)(op))
+
#include "clinic/sha2module.c.h"
/* We shall use run-time type information in the remainder of this module to
@@ -101,8 +104,7 @@ static void SHA512copy(SHA512object *src, SHA512object *dest)
static SHA256object *
newSHA224object(sha2_state *state)
{
- SHA256object *sha = (SHA256object *)PyObject_GC_New(
- SHA256object, state->sha224_type);
+ SHA256object *sha = PyObject_GC_New(SHA256object, state->sha224_type);
if (!sha) {
return NULL;
}
@@ -115,8 +117,7 @@ newSHA224object(sha2_state *state)
static SHA256object *
newSHA256object(sha2_state *state)
{
- SHA256object *sha = (SHA256object *)PyObject_GC_New(
- SHA256object, state->sha256_type);
+ SHA256object *sha = PyObject_GC_New(SHA256object, state->sha256_type);
if (!sha) {
return NULL;
}
@@ -129,8 +130,7 @@ newSHA256object(sha2_state *state)
static SHA512object *
newSHA384object(sha2_state *state)
{
- SHA512object *sha = (SHA512object *)PyObject_GC_New(
- SHA512object, state->sha384_type);
+ SHA512object *sha = PyObject_GC_New(SHA512object, state->sha384_type);
if (!sha) {
return NULL;
}
@@ -143,8 +143,7 @@ newSHA384object(sha2_state *state)
static SHA512object *
newSHA512object(sha2_state *state)
{
- SHA512object *sha = (SHA512object *)PyObject_GC_New(
- SHA512object, state->sha512_type);
+ SHA512object *sha = PyObject_GC_New(SHA512object, state->sha512_type);
if (!sha) {
return NULL;
}
@@ -164,8 +163,9 @@ SHA2_traverse(PyObject *ptr, visitproc visit, void *arg)
}
static void
-SHA256_dealloc(SHA256object *ptr)
+SHA256_dealloc(PyObject *op)
{
+ SHA256object *ptr = _SHA256object_CAST(op);
Hacl_Hash_SHA2_free_256(ptr->state);
PyTypeObject *tp = Py_TYPE(ptr);
PyObject_GC_UnTrack(ptr);
@@ -174,8 +174,9 @@ SHA256_dealloc(SHA256object *ptr)
}
static void
-SHA512_dealloc(SHA512object *ptr)
+SHA512_dealloc(PyObject *op)
{
+ SHA512object *ptr = _SHA512object_CAST(op);
Hacl_Hash_SHA2_free_512(ptr->state);
PyTypeObject *tp = Py_TYPE(ptr);
PyObject_GC_UnTrack(ptr);
@@ -442,32 +443,35 @@ static PyMethodDef SHA512_methods[] = {
};
static PyObject *
-SHA256_get_block_size(PyObject *self, void *closure)
+SHA256_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyLong_FromLong(SHA256_BLOCKSIZE);
}
static PyObject *
-SHA512_get_block_size(PyObject *self, void *closure)
+SHA512_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyLong_FromLong(SHA512_BLOCKSIZE);
}
static PyObject *
-SHA256_get_digest_size(SHA256object *self, void *closure)
+SHA256_get_digest_size(PyObject *op, void *Py_UNUSED(closure))
{
+ SHA256object *self = _SHA256object_CAST(op);
return PyLong_FromLong(self->digestsize);
}
static PyObject *
-SHA512_get_digest_size(SHA512object *self, void *closure)
+SHA512_get_digest_size(PyObject *op, void *Py_UNUSED(closure))
{
+ SHA512object *self = _SHA512object_CAST(op);
return PyLong_FromLong(self->digestsize);
}
static PyObject *
-SHA256_get_name(SHA256object *self, void *closure)
+SHA256_get_name(PyObject *op, void *Py_UNUSED(closure))
{
+ SHA256object *self = _SHA256object_CAST(op);
if (self->digestsize == 28) {
return PyUnicode_FromStringAndSize("sha224", 6);
}
@@ -475,8 +479,9 @@ SHA256_get_name(SHA256object *self, void *closure)
}
static PyObject *
-SHA512_get_name(SHA512object *self, void *closure)
+SHA512_get_name(PyObject *op, void *Py_UNUSED(closure))
{
+ SHA512object *self = _SHA512object_CAST(op);
if (self->digestsize == 64) {
return PyUnicode_FromStringAndSize("sha512", 6);
}
@@ -484,34 +489,16 @@ SHA512_get_name(SHA512object *self, void *closure)
}
static PyGetSetDef SHA256_getseters[] = {
- {"block_size",
- (getter)SHA256_get_block_size, NULL,
- NULL,
- NULL},
- {"name",
- (getter)SHA256_get_name, NULL,
- NULL,
- NULL},
- {"digest_size",
- (getter)SHA256_get_digest_size, NULL,
- NULL,
- NULL},
+ {"block_size", SHA256_get_block_size, NULL, NULL, NULL},
+ {"name", SHA256_get_name, NULL, NULL, NULL},
+ {"digest_size", SHA256_get_digest_size, NULL, NULL, NULL},
{NULL} /* Sentinel */
};
static PyGetSetDef SHA512_getseters[] = {
- {"block_size",
- (getter)SHA512_get_block_size, NULL,
- NULL,
- NULL},
- {"name",
- (getter)SHA512_get_name, NULL,
- NULL,
- NULL},
- {"digest_size",
- (getter)SHA512_get_digest_size, NULL,
- NULL,
- NULL},
+ {"block_size", SHA512_get_block_size, NULL, NULL, NULL},
+ {"name", SHA512_get_name, NULL, NULL, NULL},
+ {"digest_size", SHA512_get_digest_size, NULL, NULL, NULL},
{NULL} /* Sentinel */
};
@@ -818,7 +805,7 @@ _sha2_clear(PyObject *module)
static void
_sha2_free(void *module)
{
- _sha2_clear((PyObject *)module);
+ (void)_sha2_clear((PyObject *)module);
}
/* Initialize this module. */
diff --git a/Modules/sha3module.c b/Modules/sha3module.c
index b13e6a9de10114..72a11602b0e1fd 100644
--- a/Modules/sha3module.c
+++ b/Modules/sha3module.c
@@ -66,6 +66,8 @@ typedef struct {
Hacl_Hash_SHA3_state_t *hash_state;
} SHA3object;
+#define _SHA3object_CAST(op) ((SHA3object *)(op))
+
#include "clinic/sha3module.c.h"
static SHA3object *
@@ -167,8 +169,9 @@ py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity)
/* Internal methods for a hash object */
static int
-SHA3_clear(SHA3object *self)
+SHA3_clear(PyObject *op)
{
+ SHA3object *self = _SHA3object_CAST(op);
if (self->hash_state != NULL) {
Hacl_Hash_SHA3_free(self->hash_state);
self->hash_state = NULL;
@@ -177,7 +180,7 @@ SHA3_clear(SHA3object *self)
}
static void
-SHA3_dealloc(SHA3object *self)
+SHA3_dealloc(PyObject *self)
{
PyTypeObject *tp = Py_TYPE(self);
PyObject_GC_UnTrack(self);
@@ -303,15 +306,16 @@ static PyMethodDef SHA3_methods[] = {
static PyObject *
-SHA3_get_block_size(SHA3object *self, void *closure)
+SHA3_get_block_size(PyObject *op, void *Py_UNUSED(closure))
{
+ SHA3object *self = _SHA3object_CAST(op);
uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state);
return PyLong_FromLong(rate);
}
static PyObject *
-SHA3_get_name(SHA3object *self, void *closure)
+SHA3_get_name(PyObject *self, void *Py_UNUSED(closure))
{
PyTypeObject *type = Py_TYPE(self);
@@ -338,9 +342,10 @@ SHA3_get_name(SHA3object *self, void *closure)
static PyObject *
-SHA3_get_digest_size(SHA3object *self, void *closure)
+SHA3_get_digest_size(PyObject *op, void *Py_UNUSED(closure))
{
// Preserving previous behavior: variable-length algorithms return 0
+ SHA3object *self = _SHA3object_CAST(op);
if (Hacl_Hash_SHA3_is_shake(self->hash_state))
return PyLong_FromLong(0);
else
@@ -349,8 +354,9 @@ SHA3_get_digest_size(SHA3object *self, void *closure)
static PyObject *
-SHA3_get_capacity_bits(SHA3object *self, void *closure)
+SHA3_get_capacity_bits(PyObject *op, void *Py_UNUSED(closure))
{
+ SHA3object *self = _SHA3object_CAST(op);
uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state) * 8;
assert(rate <= 1600);
int capacity = 1600 - rate;
@@ -359,26 +365,27 @@ SHA3_get_capacity_bits(SHA3object *self, void *closure)
static PyObject *
-SHA3_get_rate_bits(SHA3object *self, void *closure)
+SHA3_get_rate_bits(PyObject *op, void *Py_UNUSED(closure))
{
+ SHA3object *self = _SHA3object_CAST(op);
uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state) * 8;
return PyLong_FromLong(rate);
}
static PyObject *
-SHA3_get_suffix(SHA3object *self, void *closure)
+SHA3_get_suffix(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
unsigned char suffix[2] = {0x06, 0};
return PyBytes_FromStringAndSize((const char *)suffix, 1);
}
static PyGetSetDef SHA3_getseters[] = {
- {"block_size", (getter)SHA3_get_block_size, NULL, NULL, NULL},
- {"name", (getter)SHA3_get_name, NULL, NULL, NULL},
- {"digest_size", (getter)SHA3_get_digest_size, NULL, NULL, NULL},
- {"_capacity_bits", (getter)SHA3_get_capacity_bits, NULL, NULL, NULL},
- {"_rate_bits", (getter)SHA3_get_rate_bits, NULL, NULL, NULL},
- {"_suffix", (getter)SHA3_get_suffix, NULL, NULL, NULL},
+ {"block_size", SHA3_get_block_size, NULL, NULL, NULL},
+ {"name", SHA3_get_name, NULL, NULL, NULL},
+ {"digest_size", SHA3_get_digest_size, NULL, NULL, NULL},
+ {"_capacity_bits", SHA3_get_capacity_bits, NULL, NULL, NULL},
+ {"_rate_bits", SHA3_get_rate_bits, NULL, NULL, NULL},
+ {"_suffix", SHA3_get_suffix, NULL, NULL, NULL},
{NULL} /* Sentinel */
};
@@ -438,10 +445,11 @@ SHA3_TYPE_SLOTS(sha3_512_slots, sha3_512__doc__, SHA3_methods, SHA3_getseters);
SHA3_TYPE_SPEC(sha3_512_spec, "sha3_512", sha3_512_slots);
static PyObject *
-_SHAKE_digest(SHA3object *self, unsigned long digestlen, int hex)
+_SHAKE_digest(PyObject *op, unsigned long digestlen, int hex)
{
unsigned char *digest = NULL;
PyObject *result = NULL;
+ SHA3object *self = _SHA3object_CAST(op);
if (digestlen >= (1 << 29)) {
PyErr_SetString(PyExc_ValueError, "length is too large");
@@ -483,7 +491,7 @@ static PyObject *
_sha3_shake_128_digest_impl(SHA3object *self, unsigned long length)
/*[clinic end generated code: output=2313605e2f87bb8f input=418ef6a36d2e6082]*/
{
- return _SHAKE_digest(self, length, 0);
+ return _SHAKE_digest((PyObject *)self, length, 0);
}
@@ -500,17 +508,17 @@ static PyObject *
_sha3_shake_128_hexdigest_impl(SHA3object *self, unsigned long length)
/*[clinic end generated code: output=bf8e2f1e490944a8 input=69fb29b0926ae321]*/
{
- return _SHAKE_digest(self, length, 1);
+ return _SHAKE_digest((PyObject *)self, length, 1);
}
static PyObject *
-SHAKE_get_digest_size(SHA3object *self, void *closure)
+SHAKE_get_digest_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
return PyLong_FromLong(0);
}
static PyObject *
-SHAKE_get_suffix(SHA3object *self, void *closure)
+SHAKE_get_suffix(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
{
unsigned char suffix[2] = {0x1f, 0};
return PyBytes_FromStringAndSize((const char *)suffix, 1);
@@ -518,12 +526,12 @@ SHAKE_get_suffix(SHA3object *self, void *closure)
static PyGetSetDef SHAKE_getseters[] = {
- {"block_size", (getter)SHA3_get_block_size, NULL, NULL, NULL},
- {"name", (getter)SHA3_get_name, NULL, NULL, NULL},
- {"digest_size", (getter)SHAKE_get_digest_size, NULL, NULL, NULL},
- {"_capacity_bits", (getter)SHA3_get_capacity_bits, NULL, NULL, NULL},
- {"_rate_bits", (getter)SHA3_get_rate_bits, NULL, NULL, NULL},
- {"_suffix", (getter)SHAKE_get_suffix, NULL, NULL, NULL},
+ {"block_size", SHA3_get_block_size, NULL, NULL, NULL},
+ {"name", SHA3_get_name, NULL, NULL, NULL},
+ {"digest_size", SHAKE_get_digest_size, NULL, NULL, NULL},
+ {"_capacity_bits", SHA3_get_capacity_bits, NULL, NULL, NULL},
+ {"_rate_bits", SHA3_get_rate_bits, NULL, NULL, NULL},
+ {"_suffix", SHAKE_get_suffix, NULL, NULL, NULL},
{NULL} /* Sentinel */
};
1
0