mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
bpo-40222: "Zero cost" exception handling (GH-25729)
"Zero cost" exception handling. * Uses a lookup table to determine how to handle exceptions. * Removes SETUP_FINALLY and POP_TOP block instructions, eliminating (most of) the runtime overhead of try statements. * Reduces the size of the frame object by about 60%.
This commit is contained in:
parent
b32c8e9795
commit
adcd220556
30 changed files with 6614 additions and 5687 deletions
25
Include/opcode.h
generated
25
Include/opcode.h
generated
|
@ -35,10 +35,13 @@ extern "C" {
|
|||
#define MATCH_SEQUENCE 32
|
||||
#define MATCH_KEYS 33
|
||||
#define COPY_DICT_WITHOUT_KEYS 34
|
||||
#define PUSH_EXC_INFO 35
|
||||
#define POP_EXCEPT_AND_RERAISE 37
|
||||
#define WITH_EXCEPT_START 49
|
||||
#define GET_AITER 50
|
||||
#define GET_ANEXT 51
|
||||
#define BEFORE_ASYNC_WITH 52
|
||||
#define BEFORE_WITH 53
|
||||
#define END_ASYNC_FOR 54
|
||||
#define INPLACE_ADD 55
|
||||
#define INPLACE_SUBTRACT 56
|
||||
|
@ -69,7 +72,6 @@ extern "C" {
|
|||
#define IMPORT_STAR 84
|
||||
#define SETUP_ANNOTATIONS 85
|
||||
#define YIELD_VALUE 86
|
||||
#define POP_BLOCK 87
|
||||
#define POP_EXCEPT 89
|
||||
#define HAVE_ARGUMENT 90
|
||||
#define STORE_NAME 90
|
||||
|
@ -103,7 +105,6 @@ extern "C" {
|
|||
#define CONTAINS_OP 118
|
||||
#define RERAISE 119
|
||||
#define JUMP_IF_NOT_EXC_MATCH 121
|
||||
#define SETUP_FINALLY 122
|
||||
#define LOAD_FAST 124
|
||||
#define STORE_FAST 125
|
||||
#define DELETE_FAST 126
|
||||
|
@ -118,14 +119,12 @@ extern "C" {
|
|||
#define DELETE_DEREF 138
|
||||
#define CALL_FUNCTION_KW 141
|
||||
#define CALL_FUNCTION_EX 142
|
||||
#define SETUP_WITH 143
|
||||
#define EXTENDED_ARG 144
|
||||
#define LIST_APPEND 145
|
||||
#define SET_ADD 146
|
||||
#define MAP_ADD 147
|
||||
#define LOAD_CLASSDEREF 148
|
||||
#define MATCH_CLASS 152
|
||||
#define SETUP_ASYNC_WITH 154
|
||||
#define FORMAT_VALUE 155
|
||||
#define BUILD_CONST_KEY_MAP 156
|
||||
#define BUILD_STRING 157
|
||||
|
@ -140,8 +139,8 @@ static uint32_t _PyOpcode_RelativeJump[8] = {
|
|||
0U,
|
||||
0U,
|
||||
536870912U,
|
||||
67125248U,
|
||||
67141632U,
|
||||
16384U,
|
||||
0U,
|
||||
0U,
|
||||
0U,
|
||||
0U,
|
||||
|
@ -150,22 +149,20 @@ static uint32_t _PyOpcode_Jump[8] = {
|
|||
0U,
|
||||
0U,
|
||||
536870912U,
|
||||
101695488U,
|
||||
67141632U,
|
||||
34586624U,
|
||||
0U,
|
||||
0U,
|
||||
0U,
|
||||
0U,
|
||||
};
|
||||
#endif /* OPCODE_TABLES */
|
||||
|
||||
/* EXCEPT_HANDLER is a special, implicit block type which is created when
|
||||
entering an except handler. It is not an opcode but we define it here
|
||||
as we want it to be available to both frameobject.c and ceval.c, while
|
||||
remaining private.*/
|
||||
#define EXCEPT_HANDLER 257
|
||||
|
||||
#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
|
||||
|
||||
/* Reserve some bytecodes for internal use in the compiler.
|
||||
* The value of 240 is arbitrary. */
|
||||
#define IS_ARTIFICIAL(op) ((op) > 240)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue