Optimize PyUnicode_RichCompare() for Py_EQ and Py_NE: always use memcmp()
This commit is contained in:
parent
3a81580719
commit
e5567ad236
|
@ -10296,6 +10296,32 @@ unicode_compare(PyObject *str1, PyObject *str2)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
unicode_compare_eq(PyObject *str1, PyObject *str2)
|
||||||
|
{
|
||||||
|
int kind;
|
||||||
|
void *data1, *data2;
|
||||||
|
Py_ssize_t len;
|
||||||
|
int cmp;
|
||||||
|
|
||||||
|
/* a string is equal to itself */
|
||||||
|
if (str1 == str2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
len = PyUnicode_GET_LENGTH(str1);
|
||||||
|
if (PyUnicode_GET_LENGTH(str2) != len)
|
||||||
|
return 0;
|
||||||
|
kind = PyUnicode_KIND(str1);
|
||||||
|
if (PyUnicode_KIND(str2) != kind)
|
||||||
|
return 0;
|
||||||
|
data1 = PyUnicode_DATA(str1);
|
||||||
|
data2 = PyUnicode_DATA(str2);
|
||||||
|
|
||||||
|
cmp = memcmp(data1, data2, len * kind);
|
||||||
|
return (cmp == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
PyUnicode_Compare(PyObject *left, PyObject *right)
|
PyUnicode_Compare(PyObject *left, PyObject *right)
|
||||||
{
|
{
|
||||||
|
@ -10346,33 +10372,27 @@ PyObject *
|
||||||
PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
|
PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
PyObject *v;
|
||||||
|
|
||||||
if (PyUnicode_Check(left) && PyUnicode_Check(right)) {
|
if (!PyUnicode_Check(left) || !PyUnicode_Check(right))
|
||||||
PyObject *v;
|
Py_RETURN_NOTIMPLEMENTED;
|
||||||
if (PyUnicode_READY(left) == -1 ||
|
|
||||||
PyUnicode_READY(right) == -1)
|
if (PyUnicode_READY(left) == -1 ||
|
||||||
return NULL;
|
PyUnicode_READY(right) == -1)
|
||||||
if (PyUnicode_GET_LENGTH(left) != PyUnicode_GET_LENGTH(right) ||
|
return NULL;
|
||||||
PyUnicode_KIND(left) != PyUnicode_KIND(right)) {
|
|
||||||
if (op == Py_EQ) {
|
if (op == Py_EQ || op == Py_NE) {
|
||||||
Py_INCREF(Py_False);
|
result = unicode_compare_eq(left, right);
|
||||||
return Py_False;
|
if (op == Py_EQ)
|
||||||
}
|
v = TEST_COND(result);
|
||||||
if (op == Py_NE) {
|
else
|
||||||
Py_INCREF(Py_True);
|
v = TEST_COND(!result);
|
||||||
return Py_True;
|
}
|
||||||
}
|
else {
|
||||||
}
|
|
||||||
result = unicode_compare(left, right);
|
result = unicode_compare(left, right);
|
||||||
|
|
||||||
/* Convert the return value to a Boolean */
|
/* Convert the return value to a Boolean */
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case Py_EQ:
|
|
||||||
v = TEST_COND(result == 0);
|
|
||||||
break;
|
|
||||||
case Py_NE:
|
|
||||||
v = TEST_COND(result != 0);
|
|
||||||
break;
|
|
||||||
case Py_LE:
|
case Py_LE:
|
||||||
v = TEST_COND(result <= 0);
|
v = TEST_COND(result <= 0);
|
||||||
break;
|
break;
|
||||||
|
@ -10389,11 +10409,9 @@ PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
|
||||||
PyErr_BadArgument();
|
PyErr_BadArgument();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
Py_INCREF(v);
|
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
|
Py_INCREF(v);
|
||||||
Py_RETURN_NOTIMPLEMENTED;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in New Issue