diff options
author | Stefan Krah <skrah@bytereef.org> | 2012-04-10 21:11:54 (GMT) |
---|---|---|
committer | Stefan Krah <skrah@bytereef.org> | 2012-04-10 21:11:54 (GMT) |
commit | ec766a61795a21015ba5b95c106f1c2b089b3ff0 (patch) | |
tree | c2b3369c46528a9cc35b1b6d191442ce5d80eb37 /Modules/_decimal | |
parent | 7b544ca08d6daa4d0b30aee6fab9a5f71540adaa (diff) | |
download | cpython-ec766a61795a21015ba5b95c106f1c2b089b3ff0.zip cpython-ec766a61795a21015ba5b95c106f1c2b089b3ff0.tar.gz cpython-ec766a61795a21015ba5b95c106f1c2b089b3ff0.tar.bz2 |
1) Remove claim of an input invariant that is only true for static mpd_t.
Resizing is used _inside_ libmpdec functions, and it is permitted to
change x->alloc several times while setting x->len at the end of the
function. Therefore, for dynamic mpd_t x->alloc can _temporarily_ drop
below x->len. Of course the final result always has x->len <= x->alloc.
For static mpd_t this cannot happen, since resizing to a smaller
coefficient is a no-op.
2) Remove micro optimization in mpd_switch_to_dyn(): Previously only the
valid initialized part of the existing coefficient up to x->len was
copied to the new dynamic memory area. Now copying does the same as
realloc() and the entire old memory area is copied.
The rationale for this change is that it is no longer needed to memorize
the explanation given in 1).
Diffstat (limited to 'Modules/_decimal')
-rw-r--r-- | Modules/_decimal/libmpdec/memory.c | 2 | ||||
-rw-r--r-- | Modules/_decimal/libmpdec/mpdecimal.c | 4 |
2 files changed, 2 insertions, 4 deletions
diff --git a/Modules/_decimal/libmpdec/memory.c b/Modules/_decimal/libmpdec/memory.c index 037ba35..bf6350f 100644 --- a/Modules/_decimal/libmpdec/memory.c +++ b/Modules/_decimal/libmpdec/memory.c @@ -222,7 +222,7 @@ mpd_switch_to_dyn(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) return 0; } - memcpy(result->data, p, result->len * (sizeof *result->data)); + memcpy(result->data, p, result->alloc * (sizeof *result->data)); result->alloc = nwords; mpd_set_dynamic_data(result); return 1; diff --git a/Modules/_decimal/libmpdec/mpdecimal.c b/Modules/_decimal/libmpdec/mpdecimal.c index b83334e..844f238 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.c +++ b/Modules/_decimal/libmpdec/mpdecimal.c @@ -454,9 +454,7 @@ mpd_del(mpd_t *dec) * Resize the coefficient. Existing data up to 'nwords' is left untouched. * Return 1 on success, 0 otherwise. * - * Input invariants: - * 1) MPD_MINALLOC <= result->alloc. - * 2) 0 <= result->len <= result->alloc. + * Input invariant: MPD_MINALLOC <= result->alloc. * * Case nwords == result->alloc: * 'result' is unchanged. Return 1. |