Make the unicode equality test an external function rather than in-lining it.
The real benefit of the unicode specialized function comes from bypassing the overhead of PyObject_RichCompareBool() and not from being in-lined (especially since there was almost no shared data between the caller and callee). Also, the in-lining was having a negative effect on code generation for the callee.
This commit is contained in:
parent
7fe0507d07
commit
ac2ef65c32
|
@ -2261,6 +2261,10 @@ PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*);
|
||||||
/* Clear all static strings. */
|
/* Clear all static strings. */
|
||||||
PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void);
|
PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void);
|
||||||
|
|
||||||
|
/* Fast equality check when the inputs are known to be exact unicode types
|
||||||
|
and where the hash values are equal (i.e. a very probable match) */
|
||||||
|
PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "structmember.h"
|
#include "structmember.h"
|
||||||
#include "stringlib/eq.h"
|
|
||||||
|
|
||||||
/* Object used as dummy key to fill deleted entries */
|
/* Object used as dummy key to fill deleted entries */
|
||||||
static PyObject _dummy_struct;
|
static PyObject _dummy_struct;
|
||||||
|
@ -74,7 +73,7 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
return entry;
|
return entry;
|
||||||
if (PyUnicode_CheckExact(startkey)
|
if (PyUnicode_CheckExact(startkey)
|
||||||
&& PyUnicode_CheckExact(key)
|
&& PyUnicode_CheckExact(key)
|
||||||
&& unicode_eq(startkey, key))
|
&& _PyUnicode_EQ(startkey, key))
|
||||||
return entry;
|
return entry;
|
||||||
Py_INCREF(startkey);
|
Py_INCREF(startkey);
|
||||||
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
|
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
|
||||||
|
@ -100,7 +99,7 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
return entry;
|
return entry;
|
||||||
if (PyUnicode_CheckExact(startkey)
|
if (PyUnicode_CheckExact(startkey)
|
||||||
&& PyUnicode_CheckExact(key)
|
&& PyUnicode_CheckExact(key)
|
||||||
&& unicode_eq(startkey, key))
|
&& _PyUnicode_EQ(startkey, key))
|
||||||
return entry;
|
return entry;
|
||||||
Py_INCREF(startkey);
|
Py_INCREF(startkey);
|
||||||
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
|
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
|
||||||
|
@ -155,7 +154,7 @@ set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
goto found_active;
|
goto found_active;
|
||||||
if (PyUnicode_CheckExact(startkey)
|
if (PyUnicode_CheckExact(startkey)
|
||||||
&& PyUnicode_CheckExact(key)
|
&& PyUnicode_CheckExact(key)
|
||||||
&& unicode_eq(startkey, key))
|
&& _PyUnicode_EQ(startkey, key))
|
||||||
goto found_active;
|
goto found_active;
|
||||||
Py_INCREF(startkey);
|
Py_INCREF(startkey);
|
||||||
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
|
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
|
||||||
|
@ -183,7 +182,7 @@ set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
goto found_active;
|
goto found_active;
|
||||||
if (PyUnicode_CheckExact(startkey)
|
if (PyUnicode_CheckExact(startkey)
|
||||||
&& PyUnicode_CheckExact(key)
|
&& PyUnicode_CheckExact(key)
|
||||||
&& unicode_eq(startkey, key))
|
&& _PyUnicode_EQ(startkey, key))
|
||||||
goto found_active;
|
goto found_active;
|
||||||
Py_INCREF(startkey);
|
Py_INCREF(startkey);
|
||||||
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
|
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
|
||||||
|
|
|
@ -42,6 +42,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "ucnhash.h"
|
#include "ucnhash.h"
|
||||||
#include "bytes_methods.h"
|
#include "bytes_methods.h"
|
||||||
|
#include "stringlib/eq.h"
|
||||||
|
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
@ -10886,6 +10887,12 @@ PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_PyUnicode_EQ(PyObject *aa, PyObject *bb)
|
||||||
|
{
|
||||||
|
return unicode_eq(aa, bb);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
PyUnicode_Contains(PyObject *container, PyObject *element)
|
PyUnicode_Contains(PyObject *container, PyObject *element)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue