diff options
Diffstat (limited to 'Objects/stringlib/eq.h')
| -rw-r--r-- | Objects/stringlib/eq.h | 23 | 
1 files changed, 18 insertions, 5 deletions
| diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h index 3e7f5e8..8e79a43 100644 --- a/Objects/stringlib/eq.h +++ b/Objects/stringlib/eq.h @@ -9,13 +9,26 @@ unicode_eq(PyObject *aa, PyObject *bb)      register PyUnicodeObject *a = (PyUnicodeObject *)aa;      register PyUnicodeObject *b = (PyUnicodeObject *)bb; -    if (a->length != b->length) +    if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) { +        assert(0 && "unicode_eq ready fail");          return 0; -    if (a->length == 0) +    } + +    if (PyUnicode_GET_LENGTH(a) != PyUnicode_GET_LENGTH(b)) +        return 0; +    if (PyUnicode_GET_LENGTH(a) == 0)          return 1; -    if (a->str[0] != b->str[0]) +    if (PyUnicode_KIND(a) != PyUnicode_KIND(b)) +        return 0; +    /* Just comparing the first byte is enough to see if a and b differ. +     * If they are 2 byte or 4 byte character most differences will happen in +     * the lower bytes anyways. +     */ +    if (PyUnicode_1BYTE_DATA(a)[0] != PyUnicode_1BYTE_DATA(b)[0])          return 0; -    if (a->length == 1) +    if (PyUnicode_KIND(a) == PyUnicode_1BYTE_KIND && +        PyUnicode_GET_LENGTH(a) == 1)          return 1; -    return memcmp(a->str, b->str, a->length * sizeof(Py_UNICODE)) == 0; +    return memcmp(PyUnicode_1BYTE_DATA(a), PyUnicode_1BYTE_DATA(b), +                  PyUnicode_GET_LENGTH(a) * PyUnicode_KIND(a)) == 0;  } | 
