Skip to content

Commit 12c0806

Browse files
committed
Preliminaries
- Move CALL_BOUND_METHOD_EXACT_ARGS into place - Add a commented-out family definition
1 parent ae9b38f commit 12c0806

File tree

3 files changed

+55
-40
lines changed

3 files changed

+55
-40
lines changed

Python/bytecodes.c

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2358,26 +2358,35 @@ dummy_func(
23582358
assert(oparg & 1);
23592359
}
23602360

2361-
// stack effect: (__0, __array[oparg] -- )
2362-
inst(CALL_BOUND_METHOD_EXACT_ARGS) {
2363-
DEOPT_IF(is_method(stack_pointer, oparg), CALL);
2364-
PyObject *function = PEEK(oparg + 1);
2365-
DEOPT_IF(Py_TYPE(function) != &PyMethod_Type, CALL);
2366-
STAT_INC(CALL, hit);
2367-
PyObject *self = ((PyMethodObject *)function)->im_self;
2368-
PEEK(oparg + 1) = Py_NewRef(self);
2369-
PyObject *meth = ((PyMethodObject *)function)->im_func;
2370-
PEEK(oparg + 2) = Py_NewRef(meth);
2371-
Py_DECREF(function);
2372-
GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS);
2373-
}
2374-
23752361
inst(KW_NAMES, (--)) {
23762362
assert(kwnames == NULL);
23772363
assert(oparg < PyTuple_GET_SIZE(consts));
23782364
kwnames = GETITEM(consts, oparg);
23792365
}
23802366

2367+
// Cache layout: counter/1, func_version/2, min_args/1
2368+
// Neither CALL_INTRINSIC_1 nor CALL_FUNCTION_EX are members!
2369+
// family(call, INLINE_CACHE_ENTRIES_CALL) = {
2370+
// CALL,
2371+
// CALL_BOUND_METHOD_EXACT_ARGS,
2372+
// CALL_PY_EXACT_ARGS,
2373+
// CALL_PY_WITH_DEFAULTS,
2374+
// CALL_NO_KW_TYPE_1,
2375+
// CALL_NO_KW_STR_1,
2376+
// CALL_NO_KW_TUPLE_1,
2377+
// CALL_BUILTIN_CLASS,
2378+
// CALL_NO_KW_BUILTIN_O,
2379+
// CALL_NO_KW_BUILTIN_FAST,
2380+
// CALL_BUILTIN_FAST_WITH_KEYWORDS,
2381+
// CALL_NO_KW_LEN,
2382+
// CALL_NO_KW_ISINSTANCE,
2383+
// CALL_NO_KW_LIST_APPEND,
2384+
// CALL_NO_KW_METHOD_DESCRIPTOR_O,
2385+
// CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS,
2386+
// CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS,
2387+
// CALL_NO_KW_METHOD_DESCRIPTOR_FAST,
2388+
// };
2389+
23812390
// stack effect: (__0, __array[oparg] -- )
23822391
inst(CALL) {
23832392
#if ENABLE_SPECIALIZATION
@@ -2460,6 +2469,20 @@ dummy_func(
24602469
CHECK_EVAL_BREAKER();
24612470
}
24622471

2472+
// stack effect: (__0, __array[oparg] -- )
2473+
inst(CALL_BOUND_METHOD_EXACT_ARGS) {
2474+
DEOPT_IF(is_method(stack_pointer, oparg), CALL);
2475+
PyObject *function = PEEK(oparg + 1);
2476+
DEOPT_IF(Py_TYPE(function) != &PyMethod_Type, CALL);
2477+
STAT_INC(CALL, hit);
2478+
PyObject *self = ((PyMethodObject *)function)->im_self;
2479+
PEEK(oparg + 1) = Py_NewRef(self);
2480+
PyObject *meth = ((PyMethodObject *)function)->im_func;
2481+
PEEK(oparg + 2) = Py_NewRef(meth);
2482+
Py_DECREF(function);
2483+
GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS);
2484+
}
2485+
24632486
// stack effect: (__0, __array[oparg] -- )
24642487
inst(CALL_PY_EXACT_ARGS) {
24652488
assert(kwnames == NULL);
@@ -3185,14 +3208,6 @@ dummy_func(
31853208

31863209
// Future families go below this point //
31873210

3188-
family(call, INLINE_CACHE_ENTRIES_CALL) = {
3189-
CALL, CALL_PY_EXACT_ARGS,
3190-
CALL_PY_WITH_DEFAULTS, CALL_BOUND_METHOD_EXACT_ARGS, CALL_BUILTIN_CLASS,
3191-
CALL_BUILTIN_FAST_WITH_KEYWORDS, CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, CALL_NO_KW_BUILTIN_FAST,
3192-
CALL_NO_KW_BUILTIN_O, CALL_NO_KW_ISINSTANCE, CALL_NO_KW_LEN,
3193-
CALL_NO_KW_LIST_APPEND, CALL_NO_KW_METHOD_DESCRIPTOR_FAST, CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS,
3194-
CALL_NO_KW_METHOD_DESCRIPTOR_O, CALL_NO_KW_STR_1, CALL_NO_KW_TUPLE_1,
3195-
CALL_NO_KW_TYPE_1 };
31963211
family(for_iter, INLINE_CACHE_ENTRIES_FOR_ITER) = {
31973212
FOR_ITER, FOR_ITER_LIST,
31983213
FOR_ITER_RANGE };

Python/generated_cases.c.h

Lines changed: 13 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/opcode_metadata.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -284,12 +284,12 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) {
284284
return 1;
285285
case LOAD_ATTR_METHOD_LAZY_DICT:
286286
return 1;
287-
case CALL_BOUND_METHOD_EXACT_ARGS:
288-
return -1;
289287
case KW_NAMES:
290288
return 0;
291289
case CALL:
292290
return -1;
291+
case CALL_BOUND_METHOD_EXACT_ARGS:
292+
return -1;
293293
case CALL_PY_EXACT_ARGS:
294294
return -1;
295295
case CALL_PY_WITH_DEFAULTS:
@@ -630,12 +630,12 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) {
630630
return ((oparg & 1) ? 1 : 0) + 1;
631631
case LOAD_ATTR_METHOD_LAZY_DICT:
632632
return ((oparg & 1) ? 1 : 0) + 1;
633-
case CALL_BOUND_METHOD_EXACT_ARGS:
634-
return -1;
635633
case KW_NAMES:
636634
return 0;
637635
case CALL:
638636
return -1;
637+
case CALL_BOUND_METHOD_EXACT_ARGS:
638+
return -1;
639639
case CALL_PY_EXACT_ARGS:
640640
return -1;
641641
case CALL_PY_WITH_DEFAULTS:
@@ -841,9 +841,9 @@ struct opcode_metadata {
841841
[LOAD_ATTR_METHOD_WITH_VALUES] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
842842
[LOAD_ATTR_METHOD_NO_DICT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
843843
[LOAD_ATTR_METHOD_LAZY_DICT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
844-
[CALL_BOUND_METHOD_EXACT_ARGS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
845844
[KW_NAMES] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
846845
[CALL] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
846+
[CALL_BOUND_METHOD_EXACT_ARGS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
847847
[CALL_PY_EXACT_ARGS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
848848
[CALL_PY_WITH_DEFAULTS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
849849
[CALL_NO_KW_TYPE_1] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },

0 commit comments

Comments
 (0)