diff options
author | Brandt Bucher <brandtbucher@microsoft.com> | 2023-08-08 20:42:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-08 20:42:43 (GMT) |
commit | ea72c6fe3b6db5f4e8ce3d3405c0ea65dc002faf (patch) | |
tree | 97e185191d3f852d6533f5db5af5f32d7cc3d5f6 /Python/executor_cases.c.h | |
parent | aab6f7173a3b825599629dd6fa5cb7e477421595 (diff) | |
download | cpython-ea72c6fe3b6db5f4e8ce3d3405c0ea65dc002faf.zip cpython-ea72c6fe3b6db5f4e8ce3d3405c0ea65dc002faf.tar.gz cpython-ea72c6fe3b6db5f4e8ce3d3405c0ea65dc002faf.tar.bz2 |
GH-107596: Specialize str[int] (GH-107597)
Diffstat (limited to 'Python/executor_cases.c.h')
-rw-r--r-- | Python/executor_cases.c.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 9363b49..27be8a3 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -462,6 +462,29 @@ break; } + case BINARY_SUBSCR_STR_INT: { + PyObject *sub; + PyObject *str; + PyObject *res; + sub = stack_pointer[-1]; + str = stack_pointer[-2]; + DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); + DEOPT_IF(!PyUnicode_CheckExact(str), BINARY_SUBSCR); + DEOPT_IF(!_PyLong_IsNonNegativeCompact((PyLongObject *)sub), BINARY_SUBSCR); + Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0]; + DEOPT_IF(PyUnicode_GET_LENGTH(str) <= index, BINARY_SUBSCR); + // Specialize for reading an ASCII character from any string: + Py_UCS4 c = PyUnicode_READ_CHAR(str, index); + DEOPT_IF(Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c, BINARY_SUBSCR); + STAT_INC(BINARY_SUBSCR, hit); + res = (PyObject*)&_Py_SINGLETON(strings).ascii[c]; + _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); + Py_DECREF(str); + STACK_SHRINK(1); + stack_pointer[-1] = res; + break; + } + case BINARY_SUBSCR_TUPLE_INT: { PyObject *sub; PyObject *tuple; |