diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-11-27 14:30:55 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-27 14:30:55 +0100 |
commit | 54fa83e0a3f3b077763cb50705d7a7dbe4a40a4a (patch) | |
tree | efa1586a41dc13055b10c5f3027fd5bb2e315948 | |
parent | b59fc311609aadaafaae68240127b4997b85859d (diff) | |
download | cpython-git-54fa83e0a3f3b077763cb50705d7a7dbe4a40a4a.tar.gz |
bpo-33954: Rewrite FILL() macro of unicodeobject.c (GH-10740)
Copy code from master: add assertions on start and value, replace 'i'
iterator with 'end' pointer for the loop stop condition.
_PyUnicode_FastFill(): fix type of 'data', it must not be constant,
since data is modified by FILL().
-rw-r--r-- | Objects/unicodeobject.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 6bfcddaa64..29b019887a 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -205,22 +205,30 @@ static PyObject *unicode_empty = NULL; #define FILL(kind, data, value, start, length) \ do { \ - Py_ssize_t i_ = 0; \ + assert(0 <= start); \ assert(kind != PyUnicode_WCHAR_KIND); \ - switch ((kind)) { \ + switch (kind) { \ case PyUnicode_1BYTE_KIND: { \ - unsigned char * to_ = (unsigned char *)((data)) + (start); \ - memset(to_, (unsigned char)value, (length)); \ + assert(value <= 0xff); \ + Py_UCS1 ch = (unsigned char)value; \ + Py_UCS1 *to = (Py_UCS1 *)data + start; \ + memset(to, ch, length); \ break; \ } \ case PyUnicode_2BYTE_KIND: { \ - Py_UCS2 * to_ = (Py_UCS2 *)((data)) + (start); \ - for (; i_ < (length); ++i_, ++to_) *to_ = (value); \ + assert(value <= 0xffff); \ + Py_UCS2 ch = (Py_UCS2)value; \ + Py_UCS2 *to = (Py_UCS2 *)data + start; \ + const Py_UCS2 *end = to + length; \ + for (; to < end; ++to) *to = ch; \ break; \ } \ case PyUnicode_4BYTE_KIND: { \ - Py_UCS4 * to_ = (Py_UCS4 *)((data)) + (start); \ - for (; i_ < (length); ++i_, ++to_) *to_ = (value); \ + assert(value <= MAX_UNICODE); \ + Py_UCS4 ch = value; \ + Py_UCS4 * to = (Py_UCS4 *)data + start; \ + const Py_UCS4 *end = to + length; \ + for (; to < end; ++to) *to = ch; \ break; \ } \ default: assert(0); \ @@ -10262,7 +10270,7 @@ _PyUnicode_FastFill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length, Py_UCS4 fill_char) { const enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); - const void *data = PyUnicode_DATA(unicode); + void *data = PyUnicode_DATA(unicode); assert(PyUnicode_IS_READY(unicode)); assert(unicode_modifiable(unicode)); assert(fill_char <= PyUnicode_MAX_CHAR_VALUE(unicode)); |