summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2012-06-16 14:38:26 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2012-06-16 14:38:26 (GMT)
commitf185226244bdb3ead8c0ff44153d5ef5420464f1 (patch)
treefa80c4401aca29b5bccc2452c6df46183c4c7f0a /Objects
parent6319e0fa2037a70435dfba8c3be2c0db3ae8b7ec (diff)
downloadcpython-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.c49
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);
}
}