bpo-46329: Split calls into precall and call instructions. (GH-30855)

* Add PRECALL_FUNCTION opcode.

* Move 'call shape' varaibles into struct.

* Replace CALL_NO_KW and CALL_KW with KW_NAMES and CALL instructions.

* Specialize for builtin methods taking using the METH_FASTCALL | METH_KEYWORDS protocol.

* Allow kwnames for specialized calls to builtin types.

* Specialize calls to tuple(arg) and str(arg).
This commit is contained in:
Mark Shannon 2022-01-28 12:42:30 +00:00 committed by GitHub
parent 5a9e423473
commit 89fd7c3452
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 957 additions and 674 deletions

79
Include/opcode.h generated
View file

@ -109,9 +109,10 @@ extern "C" {
#define SET_UPDATE 163
#define DICT_MERGE 164
#define DICT_UPDATE 165
#define PRECALL_FUNCTION 167
#define PRECALL_METHOD 168
#define CALL_NO_KW 169
#define CALL_KW 170
#define CALL 171
#define KW_NAMES 172
#define BINARY_OP_ADAPTIVE 2
#define BINARY_OP_ADD_INT 3
#define BINARY_OP_ADD_FLOAT 4
@ -133,40 +134,45 @@ extern "C" {
#define STORE_SUBSCR_ADAPTIVE 26
#define STORE_SUBSCR_LIST_INT 27
#define STORE_SUBSCR_DICT 28
#define CALL_NO_KW_ADAPTIVE 29
#define CALL_NO_KW_BUILTIN_O 34
#define CALL_NO_KW_BUILTIN_FAST 36
#define CALL_NO_KW_LEN 37
#define CALL_NO_KW_ISINSTANCE 38
#define CALL_NO_KW_PY_SIMPLE 39
#define CALL_NO_KW_LIST_APPEND 40
#define CALL_NO_KW_METHOD_DESCRIPTOR_O 41
#define CALL_NO_KW_TYPE_1 42
#define CALL_NO_KW_BUILTIN_CLASS_1 43
#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 44
#define JUMP_ABSOLUTE_QUICK 45
#define LOAD_ATTR_ADAPTIVE 46
#define LOAD_ATTR_INSTANCE_VALUE 47
#define LOAD_ATTR_WITH_HINT 48
#define LOAD_ATTR_SLOT 55
#define LOAD_ATTR_MODULE 56
#define LOAD_GLOBAL_ADAPTIVE 57
#define LOAD_GLOBAL_MODULE 58
#define LOAD_GLOBAL_BUILTIN 59
#define LOAD_METHOD_ADAPTIVE 62
#define LOAD_METHOD_CACHED 63
#define LOAD_METHOD_CLASS 64
#define LOAD_METHOD_MODULE 65
#define LOAD_METHOD_NO_DICT 66
#define STORE_ATTR_ADAPTIVE 67
#define STORE_ATTR_INSTANCE_VALUE 72
#define STORE_ATTR_SLOT 76
#define STORE_ATTR_WITH_HINT 77
#define LOAD_FAST__LOAD_FAST 78
#define STORE_FAST__LOAD_FAST 79
#define LOAD_FAST__LOAD_CONST 80
#define LOAD_CONST__LOAD_FAST 81
#define STORE_FAST__STORE_FAST 131
#define CALL_ADAPTIVE 29
#define CALL_BUILTIN_CLASS 34
#define CALL_NO_KW_BUILTIN_O 36
#define CALL_NO_KW_BUILTIN_FAST 37
#define CALL_BUILTIN_FAST_WITH_KEYWORDS 38
#define CALL_NO_KW_LEN 39
#define CALL_NO_KW_ISINSTANCE 40
#define CALL_PY_EXACT_ARGS 41
#define CALL_PY_WITH_DEFAULTS 42
#define CALL_NO_KW_LIST_APPEND 43
#define CALL_NO_KW_METHOD_DESCRIPTOR_O 44
#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 45
#define CALL_NO_KW_STR_1 46
#define CALL_NO_KW_TUPLE_1 47
#define CALL_NO_KW_TYPE_1 48
#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 55
#define JUMP_ABSOLUTE_QUICK 56
#define LOAD_ATTR_ADAPTIVE 57
#define LOAD_ATTR_INSTANCE_VALUE 58
#define LOAD_ATTR_WITH_HINT 59
#define LOAD_ATTR_SLOT 62
#define LOAD_ATTR_MODULE 63
#define LOAD_GLOBAL_ADAPTIVE 64
#define LOAD_GLOBAL_MODULE 65
#define LOAD_GLOBAL_BUILTIN 66
#define LOAD_METHOD_ADAPTIVE 67
#define LOAD_METHOD_CACHED 72
#define LOAD_METHOD_CLASS 76
#define LOAD_METHOD_MODULE 77
#define LOAD_METHOD_NO_DICT 78
#define STORE_ATTR_ADAPTIVE 79
#define STORE_ATTR_INSTANCE_VALUE 80
#define STORE_ATTR_SLOT 81
#define STORE_ATTR_WITH_HINT 131
#define LOAD_FAST__LOAD_FAST 140
#define STORE_FAST__LOAD_FAST 141
#define LOAD_FAST__LOAD_CONST 143
#define LOAD_CONST__LOAD_FAST 150
#define STORE_FAST__STORE_FAST 153
#define DO_TRACING 255
#ifdef NEED_OPCODE_JUMP_TABLES
static uint32_t _PyOpcode_RelativeJump[8] = {
@ -193,6 +199,7 @@ static uint32_t _PyOpcode_Jump[8] = {
#define HAS_CONST(op) (false\
|| ((op) == 100) \
|| ((op) == 172) \
)
#define NB_ADD 0