Skip to content

Commit dfb0509

Browse files
author
fredrik.lundh
committed
needforspeed: stringlib refactoring: changed find_obj to find_slice,
to enable use from stringobject git-svn-id: http://svn.python.org/projects/python/trunk@46469 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 24d6736 commit dfb0509

2 files changed

Lines changed: 69 additions & 36 deletions

File tree

Objects/stringlib/find.h

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,49 @@ stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
4848
return pos;
4949
}
5050

51-
#ifdef STRINGLIB_STR
52-
5351
Py_LOCAL_INLINE(Py_ssize_t)
54-
stringlib_find_obj(PyObject* str, PyObject* sub,
55-
Py_ssize_t start, Py_ssize_t end)
52+
stringlib_find_slice(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
53+
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
54+
Py_ssize_t start, Py_ssize_t end)
5655
{
56+
if (start < 0)
57+
start += str_len;
58+
if (start < 0)
59+
start = 0;
60+
if (end > str_len)
61+
end = str_len;
62+
if (end < 0)
63+
end += str_len;
64+
if (end < 0)
65+
end = 0;
66+
5767
return stringlib_find(
58-
STRINGLIB_STR(str) + start, end - start,
59-
STRINGLIB_STR(sub), STRINGLIB_LEN(sub), start
68+
str + start, end - start,
69+
sub, sub_len, start
6070
);
6171
}
6272

73+
Py_LOCAL_INLINE(Py_ssize_t)
74+
stringlib_rfind_slice(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
75+
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
76+
Py_ssize_t start, Py_ssize_t end)
77+
{
78+
if (start < 0)
79+
start += str_len;
80+
if (start < 0)
81+
start = 0;
82+
if (end > str_len)
83+
end = str_len;
84+
if (end < 0)
85+
end += str_len;
86+
if (end < 0)
87+
end = 0;
88+
89+
return stringlib_rfind(str + start, end - start, sub, sub_len, start);
90+
}
91+
92+
#ifdef STRINGLIB_STR
93+
6394
Py_LOCAL_INLINE(int)
6495
stringlib_contains_obj(PyObject* str, PyObject* sub)
6596
{
@@ -69,19 +100,9 @@ stringlib_contains_obj(PyObject* str, PyObject* sub)
69100
) != -1;
70101
}
71102

72-
Py_LOCAL_INLINE(Py_ssize_t)
73-
stringlib_rfind_obj(PyObject* str, PyObject* sub,
74-
Py_ssize_t start, Py_ssize_t end)
75-
{
76-
return stringlib_rfind(
77-
STRINGLIB_STR(str) + start, end - start,
78-
STRINGLIB_STR(sub), STRINGLIB_LEN(sub), start
79-
);
80-
}
81-
82-
#endif
103+
#endif /* STRINGLIB_STR */
83104

84-
#endif
105+
#endif /* STRINGLIB_FIND_H */
85106

86107
/*
87108
Local variables:

Objects/unicodeobject.c

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3936,12 +3936,18 @@ Py_ssize_t PyUnicode_Find(PyObject *str,
39363936
return -2;
39373937
}
39383938

3939-
FIX_START_END((PyUnicodeObject*) str);
3940-
39413939
if (direction > 0)
3942-
result = stringlib_find_obj(str, sub, start, end);
3940+
result = stringlib_find_slice(
3941+
PyUnicode_AS_UNICODE(str), PyUnicode_GET_SIZE(str),
3942+
PyUnicode_AS_UNICODE(sub), PyUnicode_GET_SIZE(sub),
3943+
start, end
3944+
);
39433945
else
3944-
result = stringlib_rfind_obj(str, sub, start, end);
3946+
result = stringlib_rfind_slice(
3947+
PyUnicode_AS_UNICODE(str), PyUnicode_GET_SIZE(str),
3948+
PyUnicode_AS_UNICODE(sub), PyUnicode_GET_SIZE(sub),
3949+
start, end
3950+
);
39453951

39463952
Py_DECREF(str);
39473953
Py_DECREF(sub);
@@ -5284,14 +5290,15 @@ unicode_find(PyUnicodeObject *self, PyObject *args)
52845290
if (!PyArg_ParseTuple(args, "O|O&O&:find", &substring,
52855291
_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
52865292
return NULL;
5287-
52885293
substring = PyUnicode_FromObject(substring);
52895294
if (!substring)
52905295
return NULL;
52915296

5292-
FIX_START_END(self);
5293-
5294-
result = stringlib_find_obj((PyObject*) self, substring, start, end);
5297+
result = stringlib_find_slice(
5298+
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
5299+
PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
5300+
start, end
5301+
);
52955302

52965303
Py_DECREF(substring);
52975304

@@ -5352,14 +5359,15 @@ unicode_index(PyUnicodeObject *self, PyObject *args)
53525359
if (!PyArg_ParseTuple(args, "O|O&O&:index", &substring,
53535360
_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
53545361
return NULL;
5355-
53565362
substring = PyUnicode_FromObject(substring);
53575363
if (!substring)
53585364
return NULL;
53595365

5360-
FIX_START_END(self);
5361-
5362-
result = stringlib_find_obj((PyObject*) self, substring, start, end);
5366+
result = stringlib_find_slice(
5367+
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
5368+
PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
5369+
start, end
5370+
);
53635371

53645372
Py_DECREF(substring);
53655373

@@ -6027,9 +6035,11 @@ unicode_rfind(PyUnicodeObject *self, PyObject *args)
60276035
if (!substring)
60286036
return NULL;
60296037

6030-
FIX_START_END(self);
6031-
6032-
result = stringlib_rfind_obj((PyObject*)self, substring, start, end);
6038+
result = stringlib_rfind_slice(
6039+
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
6040+
PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
6041+
start, end
6042+
);
60336043

60346044
Py_DECREF(substring);
60356045

@@ -6056,9 +6066,11 @@ unicode_rindex(PyUnicodeObject *self, PyObject *args)
60566066
if (!substring)
60576067
return NULL;
60586068

6059-
FIX_START_END(self);
6060-
6061-
result = stringlib_rfind_obj((PyObject*)self, substring, start, end);
6069+
result = stringlib_rfind_slice(
6070+
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
6071+
PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
6072+
start, end
6073+
);
60626074

60636075
Py_DECREF(substring);
60646076

0 commit comments

Comments
 (0)