diff -r 6234f4caba57 Include/unicodeobject.h --- a/Include/unicodeobject.h Tue May 06 11:42:37 2014 -0500 +++ b/Include/unicodeobject.h Tue May 06 17:32:23 2014 -0400 @@ -2008,7 +2008,10 @@ ); #ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyUnicode_CompareWithId( +/* Compare two strings and return 1 for equal, 0 for not equal + * Raise an exception and return -1 on error. */ + +PyAPI_FUNC(int) _PyUnicode_CompareWithIdEqual( PyObject *left, /* Left string */ _Py_Identifier *right /* Right identifier */ ); diff -r 6234f4caba57 Objects/typeobject.c --- a/Objects/typeobject.c Tue May 06 11:42:37 2014 -0500 +++ b/Objects/typeobject.c Tue May 06 17:32:23 2014 -0400 @@ -822,7 +822,7 @@ return NULL; } - if (mod != NULL && _PyUnicode_CompareWithId(mod, &PyId_builtins)) + if (mod != NULL && !_PyUnicode_CompareWithIdEqual(mod, &PyId_builtins)) rtn = PyUnicode_FromFormat("", mod, name); else rtn = PyUnicode_FromFormat("", type->tp_name); @@ -2253,7 +2253,7 @@ if (!valid_identifier(tmp)) goto error; assert(PyUnicode_Check(tmp)); - if (_PyUnicode_CompareWithId(tmp, &PyId___dict__) == 0) { + if (_PyUnicode_CompareWithIdEqual(tmp, &PyId___dict__) > 0) { if (!may_add_dict || add_dict) { PyErr_SetString(PyExc_TypeError, "__dict__ slot disallowed: " @@ -2284,7 +2284,7 @@ for (i = j = 0; i < nslots; i++) { tmp = PyTuple_GET_ITEM(slots, i); if ((add_dict && - _PyUnicode_CompareWithId(tmp, &PyId___dict__) == 0) || + _PyUnicode_CompareWithIdEqual(tmp, &PyId___dict__) > 0) || (add_weak && PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0)) continue; @@ -3311,7 +3311,7 @@ Py_XDECREF(mod); return NULL; } - if (mod != NULL && _PyUnicode_CompareWithId(mod, &PyId_builtins)) + if (mod != NULL && !_PyUnicode_CompareWithIdEqual(mod, &PyId_builtins)) rtn = PyUnicode_FromFormat("<%U.%U object at %p>", mod, name, self); else rtn = PyUnicode_FromFormat("<%s object at %p>", @@ -6763,7 +6763,7 @@ (i.e. super, or a subclass), not the class of su->obj. */ skip = (PyUnicode_Check(name) && PyUnicode_GET_LENGTH(name) == 9 && - _PyUnicode_CompareWithId(name, &PyId___class__) == 0); + _PyUnicode_CompareWithIdEqual(name, &PyId___class__) > 0); } if (!skip) { @@ -6969,7 +6969,7 @@ for (i = 0; i < n; i++) { PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); assert(PyUnicode_Check(name)); - if (!_PyUnicode_CompareWithId(name, &PyId___class__)) { + if (_PyUnicode_CompareWithIdEqual(name, &PyId___class__) > 0) { Py_ssize_t index = co->co_nlocals + PyTuple_GET_SIZE(co->co_cellvars) + i; PyObject *cell = f->f_localsplus[index]; diff -r 6234f4caba57 Objects/unicodeobject.c --- a/Objects/unicodeobject.c Tue May 06 11:42:37 2014 -0500 +++ b/Objects/unicodeobject.c Tue May 06 17:32:23 2014 -0400 @@ -10787,12 +10787,23 @@ } int -_PyUnicode_CompareWithId(PyObject *left, _Py_Identifier *right) -{ - PyObject *right_str = _PyUnicode_FromId(right); /* borrowed */ - if (right_str == NULL) - return -1; - return PyUnicode_Compare(left, right_str); +_PyUnicode_CompareWithIdEqual(PyObject *left, _Py_Identifier *right) +{ + if (PyUnicode_Check(left)) { + PyObject *right_str = _PyUnicode_FromId(right); /* borrowed */ + if (right_str == NULL) + return -1; + /* If left side is interned, then reference equality suffices */ + if (PyUnicode_CHECK_INTERNED(left)) + return left == right_str; + if (PyUnicode_READY(left) == -1) + return -1; + return unicode_compare_eq(left, right_str); + } + PyErr_Format(PyExc_TypeError, + "Can't compare %.100s and str", + left->ob_type->tp_name); + return -1; } int diff -r 6234f4caba57 Python/errors.c --- a/Python/errors.c Tue May 06 11:42:37 2014 -0500 +++ b/Python/errors.c Tue May 06 17:32:23 2014 -0400 @@ -908,7 +908,7 @@ goto done; } else { - if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) { + if (_PyUnicode_CompareWithIdEqual(moduleName, &PyId_builtins) == 0) { if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0) goto done; if (PyFile_WriteString(".", f) < 0) diff -r 6234f4caba57 Python/pythonrun.c --- a/Python/pythonrun.c Tue May 06 11:42:37 2014 -0500 +++ b/Python/pythonrun.c Tue May 06 17:32:23 2014 -0400 @@ -1965,7 +1965,7 @@ err = PyFile_WriteString("", f); } else { - if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) + if (_PyUnicode_CompareWithIdEqual(moduleName, &PyId_builtins) == 0) { err = PyFile_WriteObject(moduleName, f, Py_PRINT_RAW); err += PyFile_WriteString(".", f);