summaryrefslogtreecommitdiffstats
path: root/Python/executor_cases.c.h
diff options
context:
space:
mode:
authorBrandt Bucher <brandtbucher@microsoft.com>2023-08-08 20:42:43 (GMT)
committerGitHub <noreply@github.com>2023-08-08 20:42:43 (GMT)
commitea72c6fe3b6db5f4e8ce3d3405c0ea65dc002faf (patch)
tree97e185191d3f852d6533f5db5af5f32d7cc3d5f6 /Python/executor_cases.c.h
parentaab6f7173a3b825599629dd6fa5cb7e477421595 (diff)
downloadcpython-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.h23
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;