diff -r ac93d188ebd6 Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst Tue Nov 15 09:12:36 2016 +0100 +++ b/Doc/c-api/unicode.rst Tue Nov 15 21:20:16 2016 +0200 @@ -1643,6 +1643,9 @@ They all return *NULL* or ``-1`` if an e Compare two strings and return ``-1``, ``0``, ``1`` for less than, equal, and greater than, respectively. + This function returns ``-1`` upon failure, so one should call + :c:func:`PyErr_Occurred` to check for errors. + .. c:function:: int PyUnicode_CompareWithASCIIString(PyObject *uni, const char *string) @@ -1651,6 +1654,9 @@ They all return *NULL* or ``-1`` if an e ASCII-encoded strings, but the function interprets the input string as ISO-8859-1 if it contains non-ASCII characters. + This function returns ``-1`` upon failure, so one should call + :c:func:`PyErr_Occurred` to check for errors. + .. c:function:: PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) diff -r ac93d188ebd6 Include/unicodeobject.h --- a/Include/unicodeobject.h Tue Nov 15 09:12:36 2016 +0100 +++ b/Include/unicodeobject.h Tue Nov 15 21:20:16 2016 +0200 @@ -2048,6 +2048,17 @@ PyAPI_FUNC(int) PyUnicode_CompareWithASC const char *right /* ASCII-encoded string */ ); +#ifndef Py_LIMITED_API +/* Test whether a unicode is equal to ASCII string. Return 1 if true + otherwise 0. Return 0 if any argument contains non-ASCII characters. + Any error occurs inside will be cleared before return. */ + +PyAPI_FUNC(int) _PyUnicode_EqualToASCIIString( + PyObject *left, + const char *right /* ASCII-encoded string */ + ); +#endif + /* Rich compare two strings and return one of the following: - NULL in case an exception was raised diff -r ac93d188ebd6 Modules/_decimal/_decimal.c --- a/Modules/_decimal/_decimal.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/_decimal/_decimal.c Tue Nov 15 21:20:16 2016 +0200 @@ -1118,12 +1118,12 @@ context_getattr(PyObject *self, PyObject PyObject *retval; if (PyUnicode_Check(name)) { - if (PyUnicode_CompareWithASCIIString(name, "traps") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "traps")) { retval = ((PyDecContextObject *)self)->traps; Py_INCREF(retval); return retval; } - if (PyUnicode_CompareWithASCIIString(name, "flags") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "flags")) { retval = ((PyDecContextObject *)self)->flags; Py_INCREF(retval); return retval; @@ -1143,10 +1143,10 @@ context_setattr(PyObject *self, PyObject } if (PyUnicode_Check(name)) { - if (PyUnicode_CompareWithASCIIString(name, "traps") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "traps")) { return context_settraps_dict(self, value); } - if (PyUnicode_CompareWithASCIIString(name, "flags") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "flags")) { return context_setstatus_dict(self, value); } } @@ -2449,14 +2449,14 @@ dectuple_as_str(PyObject *dectuple) tmp = PyTuple_GET_ITEM(dectuple, 2); if (PyUnicode_Check(tmp)) { /* special */ - if (PyUnicode_CompareWithASCIIString(tmp, "F") == 0) { + if (_PyUnicode_EqualToASCIIString(tmp, "F")) { strcat(sign_special, "Inf"); is_infinite = 1; } - else if (PyUnicode_CompareWithASCIIString(tmp, "n") == 0) { + else if (_PyUnicode_EqualToASCIIString(tmp, "n")) { strcat(sign_special, "NaN"); } - else if (PyUnicode_CompareWithASCIIString(tmp, "N") == 0) { + else if (_PyUnicode_EqualToASCIIString(tmp, "N")) { strcat(sign_special, "sNaN"); } else { diff -r ac93d188ebd6 Modules/_elementtree.c --- a/Modules/_elementtree.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/_elementtree.c Tue Nov 15 21:20:16 2016 +0200 @@ -3661,11 +3661,11 @@ xmlparser_getattro(XMLParserObject* self { if (PyUnicode_Check(nameobj)) { PyObject* res; - if (PyUnicode_CompareWithASCIIString(nameobj, "entity") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "entity")) res = self->entity; - else if (PyUnicode_CompareWithASCIIString(nameobj, "target") == 0) + else if (_PyUnicode_EqualToASCIIString(nameobj, "target")) res = self->target; - else if (PyUnicode_CompareWithASCIIString(nameobj, "version") == 0) { + else if (_PyUnicode_EqualToASCIIString(nameobj, "version")) { return PyUnicode_FromFormat( "Expat %d.%d.%d", XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); diff -r ac93d188ebd6 Modules/_io/textio.c --- a/Modules/_io/textio.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/_io/textio.c Tue Nov 15 21:20:16 2016 +0200 @@ -1023,7 +1023,7 @@ static int else if (PyUnicode_Check(res)) { const encodefuncentry *e = encodefuncs; while (e->name != NULL) { - if (!PyUnicode_CompareWithASCIIString(res, e->name)) { + if (_PyUnicode_EqualToASCIIString(res, e->name)) { self->encodefunc = e->encodefunc; break; } diff -r ac93d188ebd6 Modules/_io/winconsoleio.c --- a/Modules/_io/winconsoleio.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/_io/winconsoleio.c Tue Nov 15 21:20:16 2016 +0200 @@ -93,11 +93,11 @@ char _PyIO_get_console_type(PyObject *pa } char m = '\0'; - if (PyUnicode_CompareWithASCIIString(decoded_upper, "CONIN$") == 0) { + if (_PyUnicode_EqualToASCIIString(decoded_upper, "CONIN$")) { m = 'r'; - } else if (PyUnicode_CompareWithASCIIString(decoded_upper, "CONOUT$") == 0) { + } else if (_PyUnicode_EqualToASCIIString(decoded_upper, "CONOUT$")) { m = 'w'; - } else if (PyUnicode_CompareWithASCIIString(decoded_upper, "CON") == 0) { + } else if (_PyUnicode_EqualToASCIIString(decoded_upper, "CON")) { m = 'x'; } diff -r ac93d188ebd6 Modules/_lsprof.c --- a/Modules/_lsprof.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/_lsprof.c Tue Nov 15 21:20:16 2016 +0200 @@ -181,7 +181,7 @@ normalizeUserObj(PyObject *obj) } } if (modname != NULL) { - if (PyUnicode_CompareWithASCIIString(modname, "builtins") != 0) { + if (!_PyUnicode_EqualToASCIIString(modname, "builtins")) { PyObject *result; result = PyUnicode_FromFormat("<%U.%s>", modname, fn->m_ml->ml_name); diff -r ac93d188ebd6 Modules/_pickle.c --- a/Modules/_pickle.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/_pickle.c Tue Nov 15 21:20:16 2016 +0200 @@ -1687,7 +1687,7 @@ whichmodule(PyObject *global, PyObject * while (PyDict_Next(modules_dict, &i, &module_name, &module)) { PyObject *candidate; if (PyUnicode_Check(module_name) && - !PyUnicode_CompareWithASCIIString(module_name, "__main__")) + _PyUnicode_EqualToASCIIString(module_name, "__main__")) continue; if (module == Py_None) continue; diff -r ac93d188ebd6 Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/_sqlite/connection.c Tue Nov 15 21:20:16 2016 +0200 @@ -1191,7 +1191,7 @@ static int pysqlite_connection_set_isola return -1; } for (candidate = begin_statements; *candidate; candidate++) { - if (!PyUnicode_CompareWithASCIIString(uppercase_level, *candidate + 6)) + if (_PyUnicode_EqualToASCIIString(uppercase_level, *candidate + 6)) break; } Py_DECREF(uppercase_level); diff -r ac93d188ebd6 Modules/_testcapimodule.c --- a/Modules/_testcapimodule.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/_testcapimodule.c Tue Nov 15 21:20:16 2016 +0200 @@ -2325,7 +2325,7 @@ test_string_from_format(PyObject *self, result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \ if (result == NULL) \ return NULL; \ - if (PyUnicode_CompareWithASCIIString(result, "1")) { \ + if (!_PyUnicode_EqualToASCIIString(result, "1")) { \ msg = FORMAT " failed at 1"; \ goto Fail; \ } \ diff -r ac93d188ebd6 Modules/pyexpat.c --- a/Modules/pyexpat.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Modules/pyexpat.c Tue Nov 15 21:20:16 2016 +0200 @@ -1244,8 +1244,7 @@ handlername2int(PyObject *name) { int i; for (i = 0; handler_info[i].name != NULL; i++) { - if (PyUnicode_CompareWithASCIIString( - name, handler_info[i].name) == 0) { + if (_PyUnicode_EqualToASCIIString(name, handler_info[i].name)) { return i; } } @@ -1283,45 +1282,45 @@ xmlparse_getattro(xmlparseobject *self, first_char = PyUnicode_READ_CHAR(nameobj, 0); if (first_char == 'E') { - if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorCode") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "ErrorCode")) return PyLong_FromLong((long) XML_GetErrorCode(self->itself)); - if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorLineNumber") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "ErrorLineNumber")) return PyLong_FromLong((long) XML_GetErrorLineNumber(self->itself)); - if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorColumnNumber") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "ErrorColumnNumber")) return PyLong_FromLong((long) XML_GetErrorColumnNumber(self->itself)); - if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorByteIndex") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "ErrorByteIndex")) return PyLong_FromLong((long) XML_GetErrorByteIndex(self->itself)); } if (first_char == 'C') { - if (PyUnicode_CompareWithASCIIString(nameobj, "CurrentLineNumber") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "CurrentLineNumber")) return PyLong_FromLong((long) XML_GetCurrentLineNumber(self->itself)); - if (PyUnicode_CompareWithASCIIString(nameobj, "CurrentColumnNumber") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "CurrentColumnNumber")) return PyLong_FromLong((long) XML_GetCurrentColumnNumber(self->itself)); - if (PyUnicode_CompareWithASCIIString(nameobj, "CurrentByteIndex") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "CurrentByteIndex")) return PyLong_FromLong((long) XML_GetCurrentByteIndex(self->itself)); } if (first_char == 'b') { - if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_size") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "buffer_size")) return PyLong_FromLong((long) self->buffer_size); - if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_text") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "buffer_text")) return get_pybool(self->buffer != NULL); - if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_used") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "buffer_used")) return PyLong_FromLong((long) self->buffer_used); } - if (PyUnicode_CompareWithASCIIString(nameobj, "namespace_prefixes") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "namespace_prefixes")) return get_pybool(self->ns_prefixes); - if (PyUnicode_CompareWithASCIIString(nameobj, "ordered_attributes") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "ordered_attributes")) return get_pybool(self->ordered_attributes); - if (PyUnicode_CompareWithASCIIString(nameobj, "specified_attributes") == 0) + if (_PyUnicode_EqualToASCIIString(nameobj, "specified_attributes")) return get_pybool((long) self->specified_attributes); - if (PyUnicode_CompareWithASCIIString(nameobj, "intern") == 0) { + if (_PyUnicode_EqualToASCIIString(nameobj, "intern")) { if (self->intern == NULL) { Py_INCREF(Py_None); return Py_None; @@ -1383,7 +1382,7 @@ xmlparse_setattro(xmlparseobject *self, PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute"); return -1; } - if (PyUnicode_CompareWithASCIIString(name, "buffer_text") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "buffer_text")) { int b = PyObject_IsTrue(v); if (b < 0) return -1; @@ -1405,7 +1404,7 @@ xmlparse_setattro(xmlparseobject *self, } return 0; } - if (PyUnicode_CompareWithASCIIString(name, "namespace_prefixes") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "namespace_prefixes")) { int b = PyObject_IsTrue(v); if (b < 0) return -1; @@ -1413,14 +1412,14 @@ xmlparse_setattro(xmlparseobject *self, XML_SetReturnNSTriplet(self->itself, self->ns_prefixes); return 0; } - if (PyUnicode_CompareWithASCIIString(name, "ordered_attributes") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "ordered_attributes")) { int b = PyObject_IsTrue(v); if (b < 0) return -1; self->ordered_attributes = b; return 0; } - if (PyUnicode_CompareWithASCIIString(name, "specified_attributes") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "specified_attributes")) { int b = PyObject_IsTrue(v); if (b < 0) return -1; @@ -1428,7 +1427,7 @@ xmlparse_setattro(xmlparseobject *self, return 0; } - if (PyUnicode_CompareWithASCIIString(name, "buffer_size") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "buffer_size")) { long new_buffer_size; if (!PyLong_Check(v)) { PyErr_SetString(PyExc_TypeError, "buffer_size must be an integer"); @@ -1474,7 +1473,7 @@ xmlparse_setattro(xmlparseobject *self, return 0; } - if (PyUnicode_CompareWithASCIIString(name, "CharacterDataHandler") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "CharacterDataHandler")) { /* If we're changing the character data handler, flush all * cached data with the old handler. Not sure there's a * "right" thing to do, though, but this probably won't diff -r ac93d188ebd6 Objects/longobject.c --- a/Objects/longobject.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Objects/longobject.c Tue Nov 15 21:20:16 2016 +0200 @@ -5166,9 +5166,9 @@ long_to_bytes(PyLongObject *v, PyObject return NULL; } - if (!PyUnicode_CompareWithASCIIString(byteorder_str, "little")) + if (_PyUnicode_EqualToASCIIString(byteorder_str, "little")) little_endian = 1; - else if (!PyUnicode_CompareWithASCIIString(byteorder_str, "big")) + else if (_PyUnicode_EqualToASCIIString(byteorder_str, "big")) little_endian = 0; else { PyErr_SetString(PyExc_ValueError, @@ -5249,9 +5249,9 @@ long_from_bytes(PyTypeObject *type, PyOb return NULL; } - if (!PyUnicode_CompareWithASCIIString(byteorder_str, "little")) + if (_PyUnicode_EqualToASCIIString(byteorder_str, "little")) little_endian = 1; - else if (!PyUnicode_CompareWithASCIIString(byteorder_str, "big")) + else if (_PyUnicode_EqualToASCIIString(byteorder_str, "big")) little_endian = 0; else { PyErr_SetString(PyExc_ValueError, diff -r ac93d188ebd6 Objects/moduleobject.c --- a/Objects/moduleobject.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Objects/moduleobject.c Tue Nov 15 21:20:16 2016 +0200 @@ -586,7 +586,7 @@ void while (PyDict_Next(d, &pos, &key, &value)) { if (value != Py_None && PyUnicode_Check(key)) { if (PyUnicode_READ_CHAR(key, 0) != '_' || - PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0) + !_PyUnicode_EqualToASCIIString(key, "__builtins__")) { if (Py_VerboseFlag > 1) { const char *s = _PyUnicode_AsString(key); diff -r ac93d188ebd6 Objects/typeobject.c --- a/Objects/typeobject.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Objects/typeobject.c Tue Nov 15 21:20:16 2016 +0200 @@ -2412,7 +2412,7 @@ type_new(PyTypeObject *metatype, PyObjec } add_dict++; } - if (PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0) { + if (_PyUnicode_EqualToASCIIString(tmp, "__weakref__")) { if (!may_add_weak || add_weak) { PyErr_SetString(PyExc_TypeError, "__weakref__ slot disallowed: " @@ -2436,7 +2436,7 @@ type_new(PyTypeObject *metatype, PyObjec if ((add_dict && _PyUnicode_CompareWithId(tmp, &PyId___dict__) == 0) || (add_weak && - PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0)) + _PyUnicode_EqualToASCIIString(tmp, "__weakref__"))) continue; tmp =_Py_Mangle(name, tmp); if (!tmp) { diff -r ac93d188ebd6 Objects/unicodeobject.c --- a/Objects/unicodeobject.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Objects/unicodeobject.c Tue Nov 15 21:20:16 2016 +0200 @@ -11048,6 +11048,41 @@ PyUnicode_CompareWithASCIIString(PyObjec } } +static int +non_ready_unicode_equal_to_ascii_string(PyObject *unicode, const char *str) +{ + size_t i, len; + const wchar_t *p; + len = (size_t)_PyUnicode_WSTR_LENGTH(unicode); + if (strlen(str) != len) + return 0; + p = _PyUnicode_WSTR(unicode); + assert(p); + for (i = 0; i < len; i++) { + unsigned char c = (unsigned char)str[i]; + if (c > 128 || p[i] != (wchar_t)c) + return 0; + } + return 1; +} + +int +_PyUnicode_EqualToASCIIString(PyObject *unicode, const char *str) +{ + size_t len; + assert(_PyUnicode_CHECK(unicode)); + if (PyUnicode_READY(unicode) == -1) { + /* Memory error or bad data */ + PyErr_Clear(); + return non_ready_unicode_equal_to_ascii_string(unicode, str); + } + if (!PyUnicode_IS_ASCII(unicode)) + return 0; + len = (size_t)PyUnicode_GET_LENGTH(unicode); + return strlen(str) == len && + memcmp(PyUnicode_1BYTE_DATA(unicode), str, len) == 0; +} + #define TEST_COND(cond) \ ((cond) ? Py_True : Py_False) diff -r ac93d188ebd6 Python/_warnings.c --- a/Python/_warnings.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Python/_warnings.c Tue Nov 15 21:20:16 2016 +0200 @@ -503,7 +503,7 @@ warn_explicit(PyObject *category, PyObje if (action == NULL) goto cleanup; - if (PyUnicode_CompareWithASCIIString(action, "error") == 0) { + if (_PyUnicode_EqualToASCIIString(action, "error")) { PyErr_SetObject(category, message); goto cleanup; } @@ -511,13 +511,13 @@ warn_explicit(PyObject *category, PyObje /* Store in the registry that we've been here, *except* when the action is "always". */ rc = 0; - if (PyUnicode_CompareWithASCIIString(action, "always") != 0) { + if (!_PyUnicode_EqualToASCIIString(action, "always")) { if (registry != NULL && registry != Py_None && PyDict_SetItem(registry, key, Py_True) < 0) goto cleanup; - else if (PyUnicode_CompareWithASCIIString(action, "ignore") == 0) + else if (_PyUnicode_EqualToASCIIString(action, "ignore")) goto return_none; - else if (PyUnicode_CompareWithASCIIString(action, "once") == 0) { + else if (_PyUnicode_EqualToASCIIString(action, "once")) { if (registry == NULL || registry == Py_None) { registry = get_once_registry(); if (registry == NULL) @@ -526,12 +526,12 @@ warn_explicit(PyObject *category, PyObje /* _once_registry[(text, category)] = 1 */ rc = update_registry(registry, text, category, 0); } - else if (PyUnicode_CompareWithASCIIString(action, "module") == 0) { + else if (_PyUnicode_EqualToASCIIString(action, "module")) { /* registry[(text, category, 0)] = 1 */ if (registry != NULL && registry != Py_None) rc = update_registry(registry, text, category, 0); } - else if (PyUnicode_CompareWithASCIIString(action, "default") != 0) { + else if (!_PyUnicode_EqualToASCIIString(action, "default")) { PyErr_Format(PyExc_RuntimeError, "Unrecognized action (%R) in warnings.filters:\n %R", action, item); @@ -715,7 +715,7 @@ setup_context(Py_ssize_t stack_level, Py } else { *filename = NULL; - if (*module != Py_None && PyUnicode_CompareWithASCIIString(*module, "__main__") == 0) { + if (*module != Py_None && _PyUnicode_EqualToASCIIString(*module, "__main__")) { PyObject *argv = _PySys_GetObjectId(&PyId_argv); /* PyList_Check() is needed because sys.argv is set to None during Python finalization */ diff -r ac93d188ebd6 Python/ast.c --- a/Python/ast.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Python/ast.c Tue Nov 15 21:20:16 2016 +0200 @@ -934,12 +934,12 @@ forbidden_name(struct compiling *c, iden int full_checks) { assert(PyUnicode_Check(name)); - if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) { + if (_PyUnicode_EqualToASCIIString(name, "__debug__")) { ast_error(c, n, "assignment to keyword"); return 1; } - if (PyUnicode_CompareWithASCIIString(name, "async") == 0 || - PyUnicode_CompareWithASCIIString(name, "await") == 0) + if (_PyUnicode_EqualToASCIIString(name, "async") || + _PyUnicode_EqualToASCIIString(name, "await")) { PyObject *message = PyUnicode_FromString( "'async' and 'await' will become reserved keywords" @@ -963,7 +963,7 @@ forbidden_name(struct compiling *c, iden if (full_checks) { const char * const *p; for (p = FORBIDDEN; *p; p++) { - if (PyUnicode_CompareWithASCIIString(name, *p) == 0) { + if (_PyUnicode_EqualToASCIIString(name, *p)) { ast_error(c, n, "assignment to keyword"); return 1; } diff -r ac93d188ebd6 Python/compile.c --- a/Python/compile.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Python/compile.c Tue Nov 15 21:20:16 2016 +0200 @@ -1522,7 +1522,7 @@ get_ref_type(struct compiler *c, PyObjec { int scope; if (c->u->u_scope_type == COMPILER_SCOPE_CLASS && - !PyUnicode_CompareWithASCIIString(name, "__class__")) + _PyUnicode_EqualToASCIIString(name, "__class__")) return CELL; scope = PyST_GetScope(c->u->u_ste, name); if (scope == 0) { @@ -2688,7 +2688,7 @@ compiler_from_import(struct compiler *c, } if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module && - !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) { + _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) { Py_DECREF(level); Py_DECREF(names); return compiler_error(c, "from __future__ imports must occur " @@ -3027,9 +3027,9 @@ compiler_nameop(struct compiler *c, iden if (!mangled) return 0; - assert(PyUnicode_CompareWithASCIIString(name, "None") && - PyUnicode_CompareWithASCIIString(name, "True") && - PyUnicode_CompareWithASCIIString(name, "False")); + assert(!_PyUnicode_EqualToASCIIString(name, "None") && + !_PyUnicode_EqualToASCIIString(name, "True") && + !_PyUnicode_EqualToASCIIString(name, "False")); op = 0; optype = OP_NAME; diff -r ac93d188ebd6 Python/future.c --- a/Python/future.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Python/future.c Tue Nov 15 21:20:16 2016 +0200 @@ -102,7 +102,7 @@ future_parse(PyFutureFeatures *ff, mod_t if (s->kind == ImportFrom_kind) { identifier modname = s->v.ImportFrom.module; if (modname && - !PyUnicode_CompareWithASCIIString(modname, "__future__")) { + _PyUnicode_EqualToASCIIString(modname, "__future__")) { if (done) { PyErr_SetString(PyExc_SyntaxError, ERR_LATE_FUTURE); diff -r ac93d188ebd6 Python/getargs.c --- a/Python/getargs.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Python/getargs.c Tue Nov 15 21:20:16 2016 +0200 @@ -1808,7 +1808,7 @@ vgetargskeywords(PyObject *args, PyObjec return cleanreturn(0, &freelist); } for (i = 0; i < len; i++) { - if (*kwlist[i] && !PyUnicode_CompareWithASCIIString(key, kwlist[i])) { + if (*kwlist[i] && _PyUnicode_EqualToASCIIString(key, kwlist[i])) { match = 1; break; } diff -r ac93d188ebd6 Python/import.c --- a/Python/import.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Python/import.c Tue Nov 15 21:20:16 2016 +0200 @@ -936,10 +936,9 @@ static const struct _frozen * find_froze static int is_builtin(PyObject *name) { - int i, cmp; + int i; for (i = 0; PyImport_Inittab[i].name != NULL; i++) { - cmp = PyUnicode_CompareWithASCIIString(name, PyImport_Inittab[i].name); - if (cmp == 0) { + if (_PyUnicode_EqualToASCIIString(name, PyImport_Inittab[i].name)) { if (PyImport_Inittab[i].initfunc == NULL) return -1; else @@ -1059,7 +1058,7 @@ static PyObject * for (p = PyImport_Inittab; p->name != NULL; p++) { PyModuleDef *def; - if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) { + if (_PyUnicode_EqualToASCIIString(name, p->name)) { if (p->initfunc == NULL) { /* Cannot re-init internal module ("sys" or "builtins") */ mod = PyImport_AddModule(namestr); @@ -1109,7 +1108,7 @@ find_frozen(PyObject *name) for (p = PyImport_FrozenModules; ; p++) { if (p->name == NULL) return NULL; - if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) + if (_PyUnicode_EqualToASCIIString(name, p->name)) break; } return p; @@ -1310,12 +1309,8 @@ remove_importlib_frames(void) int now_in_importlib; assert(PyTraceBack_Check(tb)); - now_in_importlib = (PyUnicode_CompareWithASCIIString( - code->co_filename, - importlib_filename) == 0) || - (PyUnicode_CompareWithASCIIString( - code->co_filename, - external_filename) == 0); + now_in_importlib = _PyUnicode_EqualToASCIIString(code->co_filename, importlib_filename) || + _PyUnicode_EqualToASCIIString(code->co_filename, external_filename); if (now_in_importlib && !in_importlib) { /* This is the link to this chunk of importlib tracebacks */ outer_link = prev_link; @@ -1324,8 +1319,7 @@ remove_importlib_frames(void) if (in_importlib && (always_trim || - PyUnicode_CompareWithASCIIString(code->co_name, - remove_frames) == 0)) { + _PyUnicode_EqualToASCIIString(code->co_name, remove_frames))) { Py_XINCREF(next); Py_XSETREF(*outer_link, next); prev_link = outer_link; diff -r ac93d188ebd6 Python/symtable.c --- a/Python/symtable.c Tue Nov 15 09:12:36 2016 +0100 +++ b/Python/symtable.c Tue Nov 15 21:20:16 2016 +0200 @@ -1503,7 +1503,7 @@ symtable_visit_expr(struct symtable *st, /* Special-case super: it counts as a use of __class__ */ if (e->v.Name.ctx == Load && st->st_cur->ste_type == FunctionBlock && - !PyUnicode_CompareWithASCIIString(e->v.Name.id, "super")) { + _PyUnicode_EqualToASCIIString(e->v.Name.id, "super")) { if (!GET_IDENTIFIER(__class__) || !symtable_add_def(st, __class__, USE)) VISIT_QUIT(st, 0); @@ -1652,7 +1652,7 @@ symtable_visit_alias(struct symtable *st store_name = name; Py_INCREF(store_name); } - if (PyUnicode_CompareWithASCIIString(name, "*")) { + if (!_PyUnicode_EqualToASCIIString(name, "*")) { int r = symtable_add_def(st, store_name, DEF_IMPORT); Py_DECREF(store_name); return r;