diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2012-06-16 14:38:26 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2012-06-16 14:38:26 (GMT) |
commit | f185226244bdb3ead8c0ff44153d5ef5420464f1 (patch) | |
tree | fa80c4401aca29b5bccc2452c6df46183c4c7f0a /Objects | |
parent | 6319e0fa2037a70435dfba8c3be2c0db3ae8b7ec (diff) | |
download | cpython-f185226244bdb3ead8c0ff44153d5ef5420464f1.zip cpython-f185226244bdb3ead8c0ff44153d5ef5420464f1.tar.gz cpython-f185226244bdb3ead8c0ff44153d5ef5420464f1.tar.bz2 |
_copy_characters(): move debug code at the top to avoid noisy #ifdef
And don't use assert() anymore if check_maxchar is set: return -1 on error
instead.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/unicodeobject.c | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 267dae1..ce82717 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1148,27 +1148,31 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, to_kind = PyUnicode_KIND(to); to_data = PyUnicode_DATA(to); +#ifdef Py_DEBUG + if (!check_maxchar + && PyUnicode_MAX_CHAR_VALUE(from) > PyUnicode_MAX_CHAR_VALUE(to)) + { + const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); + Py_UCS4 ch; + Py_ssize_t i; + for (i=0; i < how_many; i++) { + ch = PyUnicode_READ(from_kind, from_data, from_start + i); + assert(ch <= to_maxchar); + } + } +#endif + if (from_kind == to_kind) { - if (!PyUnicode_IS_ASCII(from) && PyUnicode_IS_ASCII(to)) { + if (check_maxchar + && !PyUnicode_IS_ASCII(from) && PyUnicode_IS_ASCII(to)) + { /* Writing Latin-1 characters into an ASCII string requires to check that all written characters are pure ASCII */ -#ifndef Py_DEBUG - if (check_maxchar) { - Py_UCS4 max_char; - max_char = ucs1lib_find_max_char(from_data, - (Py_UCS1*)from_data + how_many); - if (max_char >= 128) - return -1; - } -#else - const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); - Py_UCS4 ch; - Py_ssize_t i; - for (i=0; i < how_many; i++) { - ch = PyUnicode_READ(from_kind, from_data, from_start + i); - assert(ch <= to_maxchar); - } -#endif + Py_UCS4 max_char; + max_char = ucs1lib_find_max_char(from_data, + (Py_UCS1*)from_data + how_many); + if (max_char >= 128) + return -1; } Py_MEMCPY((char*)to_data + to_kind * to_start, (char*)from_data + from_kind * from_start, @@ -1207,7 +1211,6 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, else { assert (PyUnicode_MAX_CHAR_VALUE(from) > PyUnicode_MAX_CHAR_VALUE(to)); -#ifndef Py_DEBUG if (!check_maxchar) { if (from_kind == PyUnicode_2BYTE_KIND && to_kind == PyUnicode_1BYTE_KIND) @@ -1244,21 +1247,15 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, return -1; } } - else -#endif - { + else { const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); Py_UCS4 ch; Py_ssize_t i; for (i=0; i < how_many; i++) { ch = PyUnicode_READ(from_kind, from_data, from_start + i); -#ifndef Py_DEBUG if (ch > to_maxchar) return -1; -#else - assert(ch <= to_maxchar); -#endif PyUnicode_WRITE(to_kind, to_data, to_start + i, ch); } } |