From: Victor Stinner Date: Mon, 21 Nov 2011 22:12:56 +0000 (+0100) Subject: Rewrite PyUnicode_TransformDecimalToASCII() to use the new Unicode API X-Git-Tag: v3.3.0a1~761 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f01245067a54e3863b7db5e2eebd9f7ca45b29b5;p=thirdparty%2FPython%2Fcpython.git Rewrite PyUnicode_TransformDecimalToASCII() to use the new Unicode API --- diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 1c276d1d1f42..4c6868f86e00 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8779,32 +8779,41 @@ PyObject * PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t length) { - PyObject *result; - Py_UNICODE *p; /* write pointer into result */ + PyObject *decimal; Py_ssize_t i; + Py_UCS4 maxchar; + enum PyUnicode_Kind kind; + void *data; + + maxchar = 0; + for (i = 0; i < length; i++) { + Py_UNICODE ch = s[i]; + if (ch > 127) { + int decimal = Py_UNICODE_TODECIMAL(ch); + if (decimal >= 0) + ch = '0' + decimal; + } + maxchar = Py_MAX(maxchar, ch); + } + /* Copy to a new string */ - result = (PyObject *)_PyUnicode_New(length); - Py_UNICODE_COPY(PyUnicode_AS_UNICODE(result), s, length); - if (result == NULL) - return result; - p = PyUnicode_AS_UNICODE(result); + decimal = PyUnicode_New(length, maxchar); + if (decimal == NULL) + return decimal; + kind = PyUnicode_KIND(decimal); + data = PyUnicode_DATA(decimal); /* Iterate over code points */ for (i = 0; i < length; i++) { - Py_UNICODE ch =s[i]; + Py_UNICODE ch = s[i]; if (ch > 127) { int decimal = Py_UNICODE_TODECIMAL(ch); if (decimal >= 0) - p[i] = '0' + decimal; + ch = '0' + decimal; } + PyUnicode_WRITE(kind, data, i, ch); } -#ifndef DONT_MAKE_RESULT_READY - if (_PyUnicode_READY_REPLACE(&result)) { - Py_DECREF(result); - return NULL; - } -#endif - assert(_PyUnicode_CheckConsistency(result, 1)); - return result; + assert(_PyUnicode_CheckConsistency(decimal, 1)); + return decimal; } /* --- Decimal Encoder ---------------------------------------------------- */