Mercurial > cpython-lru_cache-weakref
changeset 68208:378ee328b60e
Issue #8923: cache str.encode() result
When a string is encoded to UTF-8 in strict mode, the result is cached into the
object. Examples: str.encode(), str.encode('utf-8'), PyUnicode_AsUTF8String()
and PyUnicode_AsEncodedString(unicode, "utf-8", NULL).
| author | Victor Stinner <victor.stinner@haypocalc.com> |
|---|---|
| date | Wed, 02 Mar 2011 01:03:14 +0000 |
| parents | c7a936362281 |
| children | a1dbe53f3798 |
| files | Misc/NEWS Objects/unicodeobject.c |
| diffstat | 2 files changed, 21 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/Misc/NEWS Wed Mar 02 01:03:11 2011 +0000 +++ b/Misc/NEWS Wed Mar 02 01:03:14 2011 +0000 @@ -10,6 +10,11 @@ Core and Builtins ----------------- +- Issue #8923: When a string is encoded to UTF-8 in strict mode, the result is + cached into the object. Examples: str.encode(), str.encode('utf-8'), + PyUnicode_AsUTF8String() and PyUnicode_AsEncodedString(unicode, "utf-8", + NULL). + - Issue #10831: PyUnicode_FromFormat() supports %li, %lli and %zi formats. - Issue #10829: Refactor PyUnicode_FromFormat(), use the same function to parse
--- a/Objects/unicodeobject.c Wed Mar 02 01:03:11 2011 +0000 +++ b/Objects/unicodeobject.c Wed Mar 02 01:03:14 2011 +0000 @@ -1710,17 +1710,21 @@ } if (encoding == NULL) - return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode), - PyUnicode_GET_SIZE(unicode), - errors); + return PyUnicode_AsUTF8String(unicode); /* Shortcuts for common default encodings */ if (normalize_encoding(encoding, lower, sizeof(lower))) { if ((strcmp(lower, "utf-8") == 0) || (strcmp(lower, "utf8") == 0)) - return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode), - PyUnicode_GET_SIZE(unicode), - errors); + { + if (errors == NULL || strcmp(errors, "strict") == 0) { + return PyUnicode_AsUTF8String(unicode); + } else { + return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode), + PyUnicode_GET_SIZE(unicode), + errors); + } + } else if ((strcmp(lower, "latin-1") == 0) || (strcmp(lower, "latin1") == 0) || (strcmp(lower, "iso-8859-1") == 0)) @@ -3077,13 +3081,16 @@ PyObject * PyUnicode_AsUTF8String(PyObject *unicode) { + PyObject *utf8; if (!PyUnicode_Check(unicode)) { PyErr_BadArgument(); return NULL; } - return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode), - PyUnicode_GET_SIZE(unicode), - NULL); + utf8 = _PyUnicode_AsDefaultEncodedString(unicode); + if (utf8 == NULL) + return NULL; + Py_INCREF(utf8); + return utf8; } /* --- UTF-32 Codec ------------------------------------------------------- */
