mirror of
https://github.com/python/cpython.git
synced 2025-09-02 06:57:58 +00:00
GH-107596: Specialize str[int] (GH-107597)
This commit is contained in:
parent
aab6f7173a
commit
ea72c6fe3b
10 changed files with 172 additions and 97 deletions
|
@ -509,6 +509,7 @@ dummy_func(
|
|||
BINARY_SUBSCR_DICT,
|
||||
BINARY_SUBSCR_GETITEM,
|
||||
BINARY_SUBSCR_LIST_INT,
|
||||
BINARY_SUBSCR_STR_INT,
|
||||
BINARY_SUBSCR_TUPLE_INT,
|
||||
};
|
||||
|
||||
|
@ -574,6 +575,21 @@ dummy_func(
|
|||
Py_DECREF(list);
|
||||
}
|
||||
|
||||
inst(BINARY_SUBSCR_STR_INT, (unused/1, str, sub -- res)) {
|
||||
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);
|
||||
}
|
||||
|
||||
inst(BINARY_SUBSCR_TUPLE_INT, (unused/1, tuple, sub -- res)) {
|
||||
DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR);
|
||||
DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue