summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2024-05-22 00:46:39 (GMT)
committerGitHub <noreply@github.com>2024-05-22 00:46:39 (GMT)
commit98e855fcc1f1d490c803565e84cb611b3f057e45 (patch)
tree53f19fb0244fa8c43e53534c31842adf5b65ebc2 /Include
parent506b1a3ff66a41c72d205c8e4cba574e439d8e76 (diff)
downloadcpython-98e855fcc1f1d490c803565e84cb611b3f057e45.zip
cpython-98e855fcc1f1d490c803565e84cb611b3f057e45.tar.gz
cpython-98e855fcc1f1d490c803565e84cb611b3f057e45.tar.bz2
gh-119180: Add LOAD_COMMON_CONSTANT opcode (#119321)
The PEP 649 implementation will require a way to load NotImplementedError from the bytecode. @markshannon suggested implementing this by converting LOAD_ASSERTION_ERROR into a more general mechanism for loading constants. This PR adds this new opcode. I will work on the rest of the implementation of the PEP separately. Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
Diffstat (limited to 'Include')
-rw-r--r--Include/internal/pycore_opcode_metadata.h16
-rw-r--r--Include/internal/pycore_opcode_utils.h5
-rw-r--r--Include/internal/pycore_uop_ids.h2
-rw-r--r--Include/internal/pycore_uop_metadata.h6
-rw-r--r--Include/opcode_ids.h122
5 files changed, 78 insertions, 73 deletions
diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h
index 665b862..6da4702 100644
--- a/Include/internal/pycore_opcode_metadata.h
+++ b/Include/internal/pycore_opcode_metadata.h
@@ -273,8 +273,6 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
return 2 + (oparg-1);
case LIST_EXTEND:
return 2 + (oparg-1);
- case LOAD_ASSERTION_ERROR:
- return 0;
case LOAD_ATTR:
return 1;
case LOAD_ATTR_CLASS:
@@ -303,6 +301,8 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
return 1;
case LOAD_BUILD_CLASS:
return 0;
+ case LOAD_COMMON_CONSTANT:
+ return 0;
case LOAD_CONST:
return 0;
case LOAD_DEREF:
@@ -706,8 +706,6 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
return 1 + (oparg-1);
case LIST_EXTEND:
return 1 + (oparg-1);
- case LOAD_ASSERTION_ERROR:
- return 1;
case LOAD_ATTR:
return 1 + (oparg & 1);
case LOAD_ATTR_CLASS:
@@ -736,6 +734,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
return 1 + (oparg & 1);
case LOAD_BUILD_CLASS:
return 1;
+ case LOAD_COMMON_CONSTANT:
+ return 1;
case LOAD_CONST:
return 1;
case LOAD_DEREF:
@@ -1082,7 +1082,6 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[268] = {
[JUMP_FORWARD] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG },
[LIST_APPEND] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG },
[LIST_EXTEND] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [LOAD_ASSERTION_ERROR] = { true, INSTR_FMT_IX, 0 },
[LOAD_ATTR] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[LOAD_ATTR_CLASS] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG },
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
@@ -1097,6 +1096,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[268] = {
[LOAD_ATTR_SLOT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
[LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
[LOAD_BUILD_CLASS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
+ [LOAD_COMMON_CONSTANT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG },
[LOAD_CONST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_PURE_FLAG },
[LOAD_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[LOAD_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG },
@@ -1279,7 +1279,6 @@ _PyOpcode_macro_expansion[256] = {
[IS_OP] = { .nuops = 1, .uops = { { _IS_OP, 0, 0 } } },
[LIST_APPEND] = { .nuops = 1, .uops = { { _LIST_APPEND, 0, 0 } } },
[LIST_EXTEND] = { .nuops = 1, .uops = { { _LIST_EXTEND, 0, 0 } } },
- [LOAD_ASSERTION_ERROR] = { .nuops = 1, .uops = { { _LOAD_ASSERTION_ERROR, 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_INSTANCE_VALUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, 0, 0 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 } } },
@@ -1292,6 +1291,7 @@ _PyOpcode_macro_expansion[256] = {
[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_BUILD_CLASS] = { .nuops = 1, .uops = { { _LOAD_BUILD_CLASS, 0, 0 } } },
+ [LOAD_COMMON_CONSTANT] = { .nuops = 1, .uops = { { _LOAD_COMMON_CONSTANT, 0, 0 } } },
[LOAD_CONST] = { .nuops = 1, .uops = { { _LOAD_CONST, 0, 0 } } },
[LOAD_DEREF] = { .nuops = 1, .uops = { { _LOAD_DEREF, 0, 0 } } },
[LOAD_FAST] = { .nuops = 1, .uops = { { _LOAD_FAST, 0, 0 } } },
@@ -1488,7 +1488,6 @@ const char *_PyOpcode_OpName[268] = {
[JUMP_NO_INTERRUPT] = "JUMP_NO_INTERRUPT",
[LIST_APPEND] = "LIST_APPEND",
[LIST_EXTEND] = "LIST_EXTEND",
- [LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR",
[LOAD_ATTR] = "LOAD_ATTR",
[LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS",
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
@@ -1504,6 +1503,7 @@ const char *_PyOpcode_OpName[268] = {
[LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
[LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS",
[LOAD_CLOSURE] = "LOAD_CLOSURE",
+ [LOAD_COMMON_CONSTANT] = "LOAD_COMMON_CONSTANT",
[LOAD_CONST] = "LOAD_CONST",
[LOAD_DEREF] = "LOAD_DEREF",
[LOAD_FAST] = "LOAD_FAST",
@@ -1741,7 +1741,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
[JUMP_FORWARD] = JUMP_FORWARD,
[LIST_APPEND] = LIST_APPEND,
[LIST_EXTEND] = LIST_EXTEND,
- [LOAD_ASSERTION_ERROR] = LOAD_ASSERTION_ERROR,
[LOAD_ATTR] = LOAD_ATTR,
[LOAD_ATTR_CLASS] = LOAD_ATTR,
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = LOAD_ATTR,
@@ -1756,6 +1755,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
[LOAD_ATTR_SLOT] = LOAD_ATTR,
[LOAD_ATTR_WITH_HINT] = LOAD_ATTR,
[LOAD_BUILD_CLASS] = LOAD_BUILD_CLASS,
+ [LOAD_COMMON_CONSTANT] = LOAD_COMMON_CONSTANT,
[LOAD_CONST] = LOAD_CONST,
[LOAD_DEREF] = LOAD_DEREF,
[LOAD_FAST] = LOAD_FAST,
diff --git a/Include/internal/pycore_opcode_utils.h b/Include/internal/pycore_opcode_utils.h
index 208bfb2..b06e469 100644
--- a/Include/internal/pycore_opcode_utils.h
+++ b/Include/internal/pycore_opcode_utils.h
@@ -58,6 +58,11 @@ extern "C" {
#define MAKE_FUNCTION_ANNOTATIONS 0x04
#define MAKE_FUNCTION_CLOSURE 0x08
+/* Values used as the oparg for LOAD_COMMON_CONSTANT */
+#define CONSTANT_ASSERTIONERROR 0
+#define CONSTANT_NOTIMPLEMENTEDERROR 1
+#define NUM_COMMON_CONSTANTS 2
+
/* Values used in the oparg for RESUME */
#define RESUME_AT_FUNC_START 0
#define RESUME_AFTER_YIELD 1
diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h
index 1e6ef8e..d36b172 100644
--- a/Include/internal/pycore_uop_ids.h
+++ b/Include/internal/pycore_uop_ids.h
@@ -169,7 +169,6 @@ extern "C" {
#define _JUMP_TO_TOP 392
#define _LIST_APPEND LIST_APPEND
#define _LIST_EXTEND LIST_EXTEND
-#define _LOAD_ASSERTION_ERROR LOAD_ASSERTION_ERROR
#define _LOAD_ATTR 393
#define _LOAD_ATTR_CLASS 394
#define _LOAD_ATTR_CLASS_0 395
@@ -190,6 +189,7 @@ extern "C" {
#define _LOAD_ATTR_SLOT_1 408
#define _LOAD_ATTR_WITH_HINT 409
#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS
+#define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT
#define _LOAD_CONST LOAD_CONST
#define _LOAD_CONST_INLINE 410
#define _LOAD_CONST_INLINE_BORROW 411
diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h
index 470e95e..f555824 100644
--- a/Include/internal/pycore_uop_metadata.h
+++ b/Include/internal/pycore_uop_metadata.h
@@ -93,7 +93,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_GET_AWAITABLE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_YIELD_VALUE] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG,
[_POP_EXCEPT] = HAS_ESCAPES_FLAG,
- [_LOAD_ASSERTION_ERROR] = 0,
+ [_LOAD_COMMON_CONSTANT] = HAS_ARG_FLAG,
[_LOAD_BUILD_CLASS] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_STORE_NAME] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_DELETE_NAME] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
@@ -400,7 +400,6 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_JUMP_TO_TOP] = "_JUMP_TO_TOP",
[_LIST_APPEND] = "_LIST_APPEND",
[_LIST_EXTEND] = "_LIST_EXTEND",
- [_LOAD_ASSERTION_ERROR] = "_LOAD_ASSERTION_ERROR",
[_LOAD_ATTR] = "_LOAD_ATTR",
[_LOAD_ATTR_CLASS] = "_LOAD_ATTR_CLASS",
[_LOAD_ATTR_CLASS_0] = "_LOAD_ATTR_CLASS_0",
@@ -419,6 +418,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_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] = "_LOAD_CONST",
[_LOAD_CONST_INLINE] = "_LOAD_CONST_INLINE",
[_LOAD_CONST_INLINE_BORROW] = "_LOAD_CONST_INLINE_BORROW",
@@ -662,7 +662,7 @@ int _PyUop_num_popped(int opcode, int oparg)
return 1;
case _POP_EXCEPT:
return 1;
- case _LOAD_ASSERTION_ERROR:
+ case _LOAD_COMMON_CONSTANT:
return 0;
case _LOAD_BUILD_CLASS:
return 0;
diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h
index 647f7c0..6a60865 100644
--- a/Include/opcode_ids.h
+++ b/Include/opcode_ids.h
@@ -33,66 +33,66 @@ extern "C" {
#define GET_LEN 20
#define GET_YIELD_FROM_ITER 21
#define INTERPRETER_EXIT 22
-#define LOAD_ASSERTION_ERROR 23
-#define LOAD_BUILD_CLASS 24
-#define LOAD_LOCALS 25
-#define MAKE_FUNCTION 26
-#define MATCH_KEYS 27
-#define MATCH_MAPPING 28
-#define MATCH_SEQUENCE 29
-#define NOP 30
-#define POP_EXCEPT 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_CONST_KEY_MAP 46
-#define BUILD_LIST 47
-#define BUILD_MAP 48
-#define BUILD_SET 49
-#define BUILD_SLICE 50
-#define BUILD_STRING 51
-#define BUILD_TUPLE 52
-#define CALL 53
-#define CALL_FUNCTION_EX 54
-#define CALL_INTRINSIC_1 55
-#define CALL_INTRINSIC_2 56
-#define CALL_KW 57
-#define COMPARE_OP 58
-#define CONTAINS_OP 59
-#define CONVERT_VALUE 60
-#define COPY 61
-#define COPY_FREE_VARS 62
-#define DELETE_ATTR 63
-#define DELETE_DEREF 64
-#define DELETE_FAST 65
-#define DELETE_GLOBAL 66
-#define DELETE_NAME 67
-#define DICT_MERGE 68
-#define DICT_UPDATE 69
-#define ENTER_EXECUTOR 70
-#define EXTENDED_ARG 71
-#define FOR_ITER 72
-#define GET_AWAITABLE 73
-#define IMPORT_FROM 74
-#define IMPORT_NAME 75
-#define IS_OP 76
-#define JUMP_BACKWARD 77
-#define JUMP_BACKWARD_NO_INTERRUPT 78
-#define JUMP_FORWARD 79
-#define LIST_APPEND 80
-#define LIST_EXTEND 81
-#define LOAD_ATTR 82
+#define LOAD_BUILD_CLASS 23
+#define LOAD_LOCALS 24
+#define MAKE_FUNCTION 25
+#define MATCH_KEYS 26
+#define MATCH_MAPPING 27
+#define MATCH_SEQUENCE 28
+#define NOP 29
+#define POP_EXCEPT 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_CONST_KEY_MAP 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_FUNCTION_EX 53
+#define CALL_INTRINSIC_1 54
+#define CALL_INTRINSIC_2 55
+#define CALL_KW 56
+#define COMPARE_OP 57
+#define CONTAINS_OP 58
+#define CONVERT_VALUE 59
+#define COPY 60
+#define COPY_FREE_VARS 61
+#define DELETE_ATTR 62
+#define DELETE_DEREF 63
+#define DELETE_FAST 64
+#define DELETE_GLOBAL 65
+#define DELETE_NAME 66
+#define DICT_MERGE 67
+#define DICT_UPDATE 68
+#define ENTER_EXECUTOR 69
+#define EXTENDED_ARG 70
+#define FOR_ITER 71
+#define GET_AWAITABLE 72
+#define IMPORT_FROM 73
+#define IMPORT_NAME 74
+#define IS_OP 75
+#define JUMP_BACKWARD 76
+#define JUMP_BACKWARD_NO_INTERRUPT 77
+#define JUMP_FORWARD 78
+#define LIST_APPEND 79
+#define LIST_EXTEND 80
+#define LOAD_ATTR 81
+#define LOAD_COMMON_CONSTANT 82
#define LOAD_CONST 83
#define LOAD_DEREF 84
#define LOAD_FAST 85
@@ -235,7 +235,7 @@ extern "C" {
#define SETUP_WITH 266
#define STORE_FAST_MAYBE_NULL 267
-#define HAVE_ARGUMENT 44
+#define HAVE_ARGUMENT 43
#define MIN_INSTRUMENTED_OPCODE 236
#ifdef __cplusplus