diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-11-16 13:40:39 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-11-16 13:40:39 (GMT) |
commit | f5894dd646f5e39918377b37b8c8694cebdca103 (patch) | |
tree | 7332d366d9a5888ac6c5b8b15f0c1d6ea7bf2481 /Objects/unicodeobject.c | |
parent | f4934ea77da38516731a75fbf9458b248d26dd81 (diff) | |
download | cpython-f5894dd646f5e39918377b37b8c8694cebdca103.zip cpython-f5894dd646f5e39918377b37b8c8694cebdca103.tar.gz cpython-f5894dd646f5e39918377b37b8c8694cebdca103.tar.bz2 |
Issue #28701: Replace _PyUnicode_CompareWithId with _PyUnicode_EqualToASCIIId.
The latter function is more readable, faster and doesn't raise exceptions.
Based on patch by Xiang Zhang.
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 86485bd..15705e1 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10869,6 +10869,44 @@ _PyUnicode_EqualToASCIIString(PyObject *unicode, const char *str) memcmp(PyUnicode_1BYTE_DATA(unicode), str, len) == 0; } +int +_PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) +{ + PyObject *right_uni; + Py_hash_t hash; + + assert(_PyUnicode_CHECK(left)); + assert(right->string); + + if (PyUnicode_READY(left) == -1) { + /* memory error or bad data */ + PyErr_Clear(); + return non_ready_unicode_equal_to_ascii_string(left, right->string); + } + + if (!PyUnicode_IS_ASCII(left)) + return 0; + + right_uni = _PyUnicode_FromId(right); /* borrowed */ + if (right_uni == NULL) { + /* memory error or bad data */ + PyErr_Clear(); + return _PyUnicode_EqualToASCIIString(left, right->string); + } + + if (left == right_uni) + return 1; + + if (PyUnicode_CHECK_INTERNED(left)) + return 0; + + assert(_PyUnicode_HASH(right_uni) != 1); + hash = _PyUnicode_HASH(left); + if (hash != -1 && hash != _PyUnicode_HASH(right_uni)) + return 0; + + return unicode_compare_eq(left, right_uni); +} #define TEST_COND(cond) \ ((cond) ? Py_True : Py_False) |