Fix _PyUnicode_XStrip()

Inline the BLOOM_MEMBER() to only call PyUnicode_READ() only once (per loop
iteration). Store also the length of the seperator in a variable to avoid calls
to PyUnicode_GET_LENGTH().
This commit is contained in:
Victor Stinner 2013-04-09 22:19:21 +02:00
parent 63d5c1a14a
commit b3a6014504
1 changed files with 18 additions and 10 deletions

View File

@ -587,10 +587,6 @@ make_bloom_mask(int kind, void* ptr, Py_ssize_t len)
#undef BLOOM_UPDATE #undef BLOOM_UPDATE
} }
#define BLOOM_MEMBER(mask, chr, str) \
(BLOOM(mask, chr) \
&& (PyUnicode_FindChar(str, chr, 0, PyUnicode_GET_LENGTH(str), 1) >= 0))
/* Compilation of templated routines */ /* Compilation of templated routines */
#include "stringlib/asciilib.h" #include "stringlib/asciilib.h"
@ -11635,6 +11631,7 @@ _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj)
int kind; int kind;
Py_ssize_t i, j, len; Py_ssize_t i, j, len;
BLOOM_MASK sepmask; BLOOM_MASK sepmask;
Py_ssize_t seplen;
if (PyUnicode_READY(self) == -1 || PyUnicode_READY(sepobj) == -1) if (PyUnicode_READY(self) == -1 || PyUnicode_READY(sepobj) == -1)
return NULL; return NULL;
@ -11642,24 +11639,35 @@ _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj)
kind = PyUnicode_KIND(self); kind = PyUnicode_KIND(self);
data = PyUnicode_DATA(self); data = PyUnicode_DATA(self);
len = PyUnicode_GET_LENGTH(self); len = PyUnicode_GET_LENGTH(self);
seplen = PyUnicode_GET_LENGTH(sepobj);
sepmask = make_bloom_mask(PyUnicode_KIND(sepobj), sepmask = make_bloom_mask(PyUnicode_KIND(sepobj),
PyUnicode_DATA(sepobj), PyUnicode_DATA(sepobj),
PyUnicode_GET_LENGTH(sepobj)); seplen);
i = 0; i = 0;
if (striptype != RIGHTSTRIP) { if (striptype != RIGHTSTRIP) {
while (i < len && while (i < len) {
BLOOM_MEMBER(sepmask, PyUnicode_READ(kind, data, i), sepobj)) { Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (!BLOOM(sepmask, ch))
break;
if (PyUnicode_FindChar(sepobj, ch, 0, seplen, 1) < 0)
break;
i++; i++;
} }
} }
j = len; j = len;
if (striptype != LEFTSTRIP) { if (striptype != LEFTSTRIP) {
do {
j--; j--;
} while (j >= i && while (j >= i) {
BLOOM_MEMBER(sepmask, PyUnicode_READ(kind, data, j), sepobj)); Py_UCS4 ch = PyUnicode_READ(kind, data, j);
if (!BLOOM(sepmask, ch))
break;
if (PyUnicode_FindChar(sepobj, ch, 0, seplen, 1) < 0)
break;
j--;
}
j++; j++;
} }