diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-12-11 23:13:42 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-12-11 23:13:42 (GMT) |
commit | 7a9105a380779942bfe45936d074c8181dee14d9 (patch) | |
tree | 59c93c9e202c049e4cff0932d57bf99fed7a78ca | |
parent | 488fa49acffda76a6a81d3a14f85f2c65496de54 (diff) | |
download | cpython-7a9105a380779942bfe45936d074c8181dee14d9.zip cpython-7a9105a380779942bfe45936d074c8181dee14d9.tar.gz cpython-7a9105a380779942bfe45936d074c8181dee14d9.tar.bz2 |
resize_copy() now supports legacy ready strings
-rw-r--r-- | Include/unicodeobject.h | 4 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 28 |
2 files changed, 19 insertions, 13 deletions
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index ecf8386..be45b02 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -220,6 +220,7 @@ typedef struct { - compact ascii: * structure = PyASCIIObject + * test: PyUnicode_IS_COMPACT_ASCII(op) * kind = PyUnicode_1BYTE_KIND * compact = 1 * ascii = 1 @@ -231,6 +232,7 @@ typedef struct { - compact: * structure = PyCompactUnicodeObject + * test: PyUnicode_IS_ASCII(op) && !PyUnicode_IS_COMPACT(op) * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or PyUnicode_4BYTE_KIND * compact = 1 @@ -247,6 +249,7 @@ typedef struct { - legacy string, not ready: * structure = PyUnicodeObject + * test: kind == PyUnicode_WCHAR_KIND * length = 0 (use wstr_length) * hash = -1 * kind = PyUnicode_WCHAR_KIND @@ -262,6 +265,7 @@ typedef struct { - legacy string, ready: * structure = PyUnicodeObject structure + * test: !PyUnicode_IS_COMPACT(op) && kind != PyUnicode_WCHAR_KIND * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or PyUnicode_4BYTE_KIND * compact = 0 diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 681bfe3..ddb7baa 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -688,26 +688,19 @@ static int resize_inplace(PyObject *unicode, Py_ssize_t length) { wchar_t *wstr; + Py_ssize_t new_size; assert(!PyUnicode_IS_COMPACT(unicode)); assert(Py_REFCNT(unicode) == 1); if (PyUnicode_IS_READY(unicode)) { Py_ssize_t char_size; - Py_ssize_t new_size; int share_wstr, share_utf8; void *data; data = _PyUnicode_DATA_ANY(unicode); - assert(data != NULL); char_size = PyUnicode_KIND(unicode); share_wstr = _PyUnicode_SHARE_WSTR(unicode); share_utf8 = _PyUnicode_SHARE_UTF8(unicode); - if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode)) - { - PyObject_DEL(_PyUnicode_UTF8(unicode)); - _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; - } if (length > (PY_SSIZE_T_MAX / char_size - 1)) { PyErr_NoMemory(); @@ -715,6 +708,13 @@ resize_inplace(PyObject *unicode, Py_ssize_t length) } new_size = (length + 1) * char_size; + if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode)) + { + PyObject_DEL(_PyUnicode_UTF8(unicode)); + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; + } + data = (PyObject *)PyObject_REALLOC(data, new_size); if (data == NULL) { PyErr_NoMemory(); @@ -743,8 +743,9 @@ resize_inplace(PyObject *unicode, Py_ssize_t length) PyErr_NoMemory(); return -1; } + new_size = sizeof(wchar_t) * (length + 1); wstr = _PyUnicode_WSTR(unicode); - wstr = PyObject_REALLOC(wstr, sizeof(wchar_t) * (length + 1)); + wstr = PyObject_REALLOC(wstr, new_size); if (!wstr) { PyErr_NoMemory(); return -1; @@ -760,9 +761,11 @@ static PyObject* resize_copy(PyObject *unicode, Py_ssize_t length) { Py_ssize_t copy_length; - if (PyUnicode_IS_COMPACT(unicode)) { + if (_PyUnicode_KIND(unicode) != PyUnicode_WCHAR_KIND) { PyObject *copy; - assert(PyUnicode_IS_READY(unicode)); + + if (PyUnicode_READY(unicode) < 0) + return NULL; copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode)); if (copy == NULL) @@ -774,8 +777,7 @@ resize_copy(PyObject *unicode, Py_ssize_t length) } else { PyObject *w; - assert(_PyUnicode_WSTR(unicode) != NULL); - assert(_PyUnicode_DATA_ANY(unicode) == NULL); + w = (PyObject*)_PyUnicode_New(length); if (w == NULL) return NULL; |