mirror of
https://github.com/python/cpython.git
synced 2025-08-29 13:15:11 +00:00
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
pointer) for any operator, not only Py_EQ and Py_NE. Code of bytes_richcompare() and PyUnicode_RichCompare() is now closer.
This commit is contained in:
parent
c8bc5377ac
commit
fd9e44db37
2 changed files with 35 additions and 12 deletions
|
@ -10534,10 +10534,6 @@ unicode_compare_eq(PyObject *str1, PyObject *str2)
|
|||
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;
|
||||
|
@ -10628,7 +10624,25 @@ PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
|
|||
PyUnicode_READY(right) == -1)
|
||||
return NULL;
|
||||
|
||||
if (op == Py_EQ || op == Py_NE) {
|
||||
if (left == right) {
|
||||
switch (op) {
|
||||
case Py_EQ:
|
||||
case Py_LE:
|
||||
case Py_GE:
|
||||
/* a string is equal to itself */
|
||||
v = Py_True;
|
||||
break;
|
||||
case Py_NE:
|
||||
case Py_LT:
|
||||
case Py_GT:
|
||||
v = Py_False;
|
||||
break;
|
||||
default:
|
||||
PyErr_BadArgument();
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else if (op == Py_EQ || op == Py_NE) {
|
||||
result = unicode_compare_eq(left, right);
|
||||
result ^= (op == Py_NE);
|
||||
v = TEST_COND(result);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue