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:
Raymond Hettinger 2015-07-04 16:04:44 -07:00
parent 7fe0507d07
commit ac2ef65c32
3 changed files with 15 additions and 5 deletions

View File

@ -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

View File

@ -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);

View File

@ -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)
{ {