mirror of https://github.com/python/cpython
needforspeed: stringlib refactoring: changed find_obj to find_slice,
to enable use from stringobject
This commit is contained in:
parent
c2d29c5a6d
commit
60d8b18831
|
@ -48,18 +48,49 @@ stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
|
|||
return pos;
|
||||
}
|
||||
|
||||
#ifdef STRINGLIB_STR
|
||||
|
||||
Py_LOCAL_INLINE(Py_ssize_t)
|
||||
stringlib_find_obj(PyObject* str, PyObject* sub,
|
||||
Py_ssize_t start, Py_ssize_t end)
|
||||
stringlib_find_slice(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
|
||||
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
|
||||
Py_ssize_t start, Py_ssize_t end)
|
||||
{
|
||||
if (start < 0)
|
||||
start += str_len;
|
||||
if (start < 0)
|
||||
start = 0;
|
||||
if (end > str_len)
|
||||
end = str_len;
|
||||
if (end < 0)
|
||||
end += str_len;
|
||||
if (end < 0)
|
||||
end = 0;
|
||||
|
||||
return stringlib_find(
|
||||
STRINGLIB_STR(str) + start, end - start,
|
||||
STRINGLIB_STR(sub), STRINGLIB_LEN(sub), start
|
||||
str + start, end - start,
|
||||
sub, sub_len, start
|
||||
);
|
||||
}
|
||||
|
||||
Py_LOCAL_INLINE(Py_ssize_t)
|
||||
stringlib_rfind_slice(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
|
||||
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
|
||||
Py_ssize_t start, Py_ssize_t end)
|
||||
{
|
||||
if (start < 0)
|
||||
start += str_len;
|
||||
if (start < 0)
|
||||
start = 0;
|
||||
if (end > str_len)
|
||||
end = str_len;
|
||||
if (end < 0)
|
||||
end += str_len;
|
||||
if (end < 0)
|
||||
end = 0;
|
||||
|
||||
return stringlib_rfind(str + start, end - start, sub, sub_len, start);
|
||||
}
|
||||
|
||||
#ifdef STRINGLIB_STR
|
||||
|
||||
Py_LOCAL_INLINE(int)
|
||||
stringlib_contains_obj(PyObject* str, PyObject* sub)
|
||||
{
|
||||
|
@ -69,19 +100,9 @@ stringlib_contains_obj(PyObject* str, PyObject* sub)
|
|||
) != -1;
|
||||
}
|
||||
|
||||
Py_LOCAL_INLINE(Py_ssize_t)
|
||||
stringlib_rfind_obj(PyObject* str, PyObject* sub,
|
||||
Py_ssize_t start, Py_ssize_t end)
|
||||
{
|
||||
return stringlib_rfind(
|
||||
STRINGLIB_STR(str) + start, end - start,
|
||||
STRINGLIB_STR(sub), STRINGLIB_LEN(sub), start
|
||||
);
|
||||
}
|
||||
#endif /* STRINGLIB_STR */
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* STRINGLIB_FIND_H */
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
|
|
|
@ -3936,12 +3936,18 @@ Py_ssize_t PyUnicode_Find(PyObject *str,
|
|||
return -2;
|
||||
}
|
||||
|
||||
FIX_START_END((PyUnicodeObject*) str);
|
||||
|
||||
if (direction > 0)
|
||||
result = stringlib_find_obj(str, sub, start, end);
|
||||
result = stringlib_find_slice(
|
||||
PyUnicode_AS_UNICODE(str), PyUnicode_GET_SIZE(str),
|
||||
PyUnicode_AS_UNICODE(sub), PyUnicode_GET_SIZE(sub),
|
||||
start, end
|
||||
);
|
||||
else
|
||||
result = stringlib_rfind_obj(str, sub, start, end);
|
||||
result = stringlib_rfind_slice(
|
||||
PyUnicode_AS_UNICODE(str), PyUnicode_GET_SIZE(str),
|
||||
PyUnicode_AS_UNICODE(sub), PyUnicode_GET_SIZE(sub),
|
||||
start, end
|
||||
);
|
||||
|
||||
Py_DECREF(str);
|
||||
Py_DECREF(sub);
|
||||
|
@ -5284,14 +5290,15 @@ unicode_find(PyUnicodeObject *self, PyObject *args)
|
|||
if (!PyArg_ParseTuple(args, "O|O&O&:find", &substring,
|
||||
_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
|
||||
return NULL;
|
||||
|
||||
substring = PyUnicode_FromObject(substring);
|
||||
if (!substring)
|
||||
return NULL;
|
||||
|
||||
FIX_START_END(self);
|
||||
|
||||
result = stringlib_find_obj((PyObject*) self, substring, start, end);
|
||||
result = stringlib_find_slice(
|
||||
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
|
||||
PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
|
||||
start, end
|
||||
);
|
||||
|
||||
Py_DECREF(substring);
|
||||
|
||||
|
@ -5352,14 +5359,15 @@ unicode_index(PyUnicodeObject *self, PyObject *args)
|
|||
if (!PyArg_ParseTuple(args, "O|O&O&:index", &substring,
|
||||
_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
|
||||
return NULL;
|
||||
|
||||
substring = PyUnicode_FromObject(substring);
|
||||
if (!substring)
|
||||
return NULL;
|
||||
|
||||
FIX_START_END(self);
|
||||
|
||||
result = stringlib_find_obj((PyObject*) self, substring, start, end);
|
||||
result = stringlib_find_slice(
|
||||
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
|
||||
PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
|
||||
start, end
|
||||
);
|
||||
|
||||
Py_DECREF(substring);
|
||||
|
||||
|
@ -6027,9 +6035,11 @@ unicode_rfind(PyUnicodeObject *self, PyObject *args)
|
|||
if (!substring)
|
||||
return NULL;
|
||||
|
||||
FIX_START_END(self);
|
||||
|
||||
result = stringlib_rfind_obj((PyObject*)self, substring, start, end);
|
||||
result = stringlib_rfind_slice(
|
||||
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
|
||||
PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
|
||||
start, end
|
||||
);
|
||||
|
||||
Py_DECREF(substring);
|
||||
|
||||
|
@ -6056,9 +6066,11 @@ unicode_rindex(PyUnicodeObject *self, PyObject *args)
|
|||
if (!substring)
|
||||
return NULL;
|
||||
|
||||
FIX_START_END(self);
|
||||
|
||||
result = stringlib_rfind_obj((PyObject*)self, substring, start, end);
|
||||
result = stringlib_rfind_slice(
|
||||
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
|
||||
PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
|
||||
start, end
|
||||
);
|
||||
|
||||
Py_DECREF(substring);
|
||||
|
||||
|
|
Loading…
Reference in New Issue