diff options
author | Brandt Bucher <brandtbucher@microsoft.com> | 2022-02-28 11:54:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-28 11:54:14 (GMT) |
commit | 424ecab494d538650ba34937cdd710094ccb2275 (patch) | |
tree | fe50c89dca09df2c3f2ff49cc937af75a9450c75 /Python/ceval.c | |
parent | c32aef48533769161e1247927a5b418322e0860c (diff) | |
download | cpython-424ecab494d538650ba34937cdd710094ccb2275.zip cpython-424ecab494d538650ba34937cdd710094ccb2275.tar.gz cpython-424ecab494d538650ba34937cdd710094ccb2275.tar.bz2 |
bpo-46841: Use inline caching for `UNPACK_SEQUENCE` (GH-31591)
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 4c0a71b..fe75782 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2758,22 +2758,22 @@ handle_eval_breaker: } STACK_GROW(oparg); Py_DECREF(seq); + JUMPBY(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE); DISPATCH(); } TARGET(UNPACK_SEQUENCE_ADAPTIVE) { assert(cframe.use_tracing == 0); - SpecializedCacheEntry *cache = GET_CACHE(); - if (cache->adaptive.counter == 0) { + _PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr; + if (cache->counter == 0) { PyObject *seq = TOP(); next_instr--; - _Py_Specialize_UnpackSequence(seq, next_instr, cache); + _Py_Specialize_UnpackSequence(seq, next_instr, oparg); DISPATCH(); } else { STAT_INC(UNPACK_SEQUENCE, deferred); - cache->adaptive.counter--; - oparg = cache->adaptive.original_oparg; + cache->counter--; JUMP_TO_INSTRUCTION(UNPACK_SEQUENCE); } } @@ -2786,36 +2786,37 @@ handle_eval_breaker: SET_TOP(Py_NewRef(PyTuple_GET_ITEM(seq, 1))); PUSH(Py_NewRef(PyTuple_GET_ITEM(seq, 0))); Py_DECREF(seq); + JUMPBY(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE); NOTRACE_DISPATCH(); } TARGET(UNPACK_SEQUENCE_TUPLE) { PyObject *seq = TOP(); - int len = GET_CACHE()->adaptive.original_oparg; DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); - DEOPT_IF(PyTuple_GET_SIZE(seq) != len, UNPACK_SEQUENCE); + DEOPT_IF(PyTuple_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); STACK_SHRINK(1); PyObject **items = _PyTuple_ITEMS(seq); - while (len--) { - PUSH(Py_NewRef(items[len])); + while (oparg--) { + PUSH(Py_NewRef(items[oparg])); } Py_DECREF(seq); + JUMPBY(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE); NOTRACE_DISPATCH(); } TARGET(UNPACK_SEQUENCE_LIST) { PyObject *seq = TOP(); - int len = GET_CACHE()->adaptive.original_oparg; DEOPT_IF(!PyList_CheckExact(seq), UNPACK_SEQUENCE); - DEOPT_IF(PyList_GET_SIZE(seq) != len, UNPACK_SEQUENCE); + DEOPT_IF(PyList_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); STACK_SHRINK(1); PyObject **items = _PyList_ITEMS(seq); - while (len--) { - PUSH(Py_NewRef(items[len])); + while (oparg--) { + PUSH(Py_NewRef(items[oparg])); } Py_DECREF(seq); + JUMPBY(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE); NOTRACE_DISPATCH(); } @@ -5600,7 +5601,7 @@ MISS_WITH_CACHE(CALL) MISS_WITH_INLINE_CACHE(BINARY_OP) MISS_WITH_CACHE(COMPARE_OP) MISS_WITH_CACHE(BINARY_SUBSCR) -MISS_WITH_CACHE(UNPACK_SEQUENCE) +MISS_WITH_INLINE_CACHE(UNPACK_SEQUENCE) MISS_WITH_OPARG_COUNTER(STORE_SUBSCR) LOAD_ATTR_INSTANCE_VALUE_miss: |