summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Objects/unicodeobject.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 1c276d1..4c6868f 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 ---------------------------------------------------- */