diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-11-27 12:42:04 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-27 12:42:04 +0100 |
commit | 7f9fb0f34555641722be5468b7fbd53dd3c0f1e2 (patch) | |
tree | a68f414c1e91f34150624697ba36b6b5ca81be45 /Objects | |
parent | 716a8089b04095acaba493925751df194a4916bb (diff) | |
download | cpython-git-7f9fb0f34555641722be5468b7fbd53dd3c0f1e2.tar.gz |
bpo-33954: Rewrite FILL() macro of unicodeobject.c (GH-10738)
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().
Diffstat (limited to 'Objects')
-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 8dd7c3b825..e6371d2337 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -220,22 +220,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: Py_UNREACHABLE(); \ @@ -10079,7 +10087,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)); |