diff options
author | Stefan Krah <skrah@bytereef.org> | 2012-04-07 13:57:59 (GMT) |
---|---|---|
committer | Stefan Krah <skrah@bytereef.org> | 2012-04-07 13:57:59 (GMT) |
commit | dc36efa3680e9aaffcffb018c43359c9a75b6c61 (patch) | |
tree | d9920dc2b050b7a54be9876c634460667ea25424 /Modules/_decimal | |
parent | e3c3f24736ac26369c9562a8823a19a7420f59db (diff) | |
download | cpython-dc36efa3680e9aaffcffb018c43359c9a75b6c61.zip cpython-dc36efa3680e9aaffcffb018c43359c9a75b6c61.tar.gz cpython-dc36efa3680e9aaffcffb018c43359c9a75b6c61.tar.bz2 |
1) Fix comment.
2) Assert that the source operand is not special. Prevent resulting assert
failure (harmless) by initializing flags before calling mpd_qshiftr_inplace.
3) Save a couple of instructions (mpd_zerocoeff already sets digits and len).
Reorder initialization to match the order in the mpd_t struct.
Diffstat (limited to 'Modules/_decimal')
-rw-r--r-- | Modules/_decimal/libmpdec/mpdecimal.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/Modules/_decimal/libmpdec/mpdecimal.c b/Modules/_decimal/libmpdec/mpdecimal.c index fd4c2bd..81a4108 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.c +++ b/Modules/_decimal/libmpdec/mpdecimal.c @@ -2251,6 +2251,7 @@ mpd_qshiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status) { mpd_ssize_t size; + assert(!mpd_isspecial(a)); assert(n >= 0); if (mpd_iszerocoeff(a) || n == 0) { @@ -2265,9 +2266,9 @@ mpd_qshiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status) _mpd_baseshiftl(result->data, a->data, size, a->len, n); mpd_copy_flags(result, a); - result->len = size; result->exp = a->exp; result->digits = a->digits+n; + result->len = size; return 1; } @@ -2295,9 +2296,9 @@ _mpd_get_rnd(const mpd_uint_t *data, mpd_ssize_t len, int use_msd) } /* - * Same as mpd_qshiftr(), but 'result' is a static array. It is the - * caller's responsibility to make sure that the array is big enough. - * The function cannot fail. + * Same as mpd_qshiftr(), but 'result' is an mpd_t with a static coefficient. + * It is the caller's responsibility to ensure that the coefficient is big + * enough. The function cannot fail. */ mpd_uint_t mpd_qsshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n) @@ -2305,6 +2306,7 @@ mpd_qsshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n) mpd_uint_t rnd; mpd_ssize_t size; + assert(!mpd_isspecial(a)); assert(n >= 0); if (mpd_iszerocoeff(a) || n == 0) { @@ -2315,18 +2317,16 @@ mpd_qsshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n) if (n >= a->digits) { rnd = _mpd_get_rnd(a->data, a->len, (n==a->digits)); mpd_zerocoeff(result); - result->digits = 1; - size = 1; } else { result->digits = a->digits-n; size = mpd_digits_to_size(result->digits); rnd = _mpd_baseshiftr(result->data, a->data, a->len, n); + result->len = size; } mpd_copy_flags(result, a); result->exp = a->exp; - result->len = size; return rnd; } @@ -2343,6 +2343,7 @@ mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n) mpd_uint_t rnd; mpd_ssize_t size; + assert(!mpd_isspecial(result)); assert(n >= 0); if (mpd_iszerocoeff(result) || n == 0) { @@ -2352,8 +2353,6 @@ mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n) if (n >= result->digits) { rnd = _mpd_get_rnd(result->data, result->len, (n==result->digits)); mpd_zerocoeff(result); - result->digits = 1; - size = 1; } else { rnd = _mpd_baseshiftr(result->data, result->data, result->len, n); @@ -2361,10 +2360,9 @@ mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n) size = mpd_digits_to_size(result->digits); /* reducing the size cannot fail */ mpd_qresize(result, size, &dummy); + result->len = size; } - result->len = size; - return rnd; } @@ -2381,6 +2379,7 @@ mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status) mpd_uint_t rnd; mpd_ssize_t size; + assert(!mpd_isspecial(a)); assert(n >= 0); if (mpd_iszerocoeff(a) || n == 0) { @@ -2393,8 +2392,6 @@ mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status) if (n >= a->digits) { rnd = _mpd_get_rnd(a->data, a->len, (n==a->digits)); mpd_zerocoeff(result); - result->digits = 1; - size = 1; } else { result->digits = a->digits-n; @@ -2410,11 +2407,11 @@ mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status) } rnd = _mpd_baseshiftr(result->data, a->data, a->len, n); } + result->len = size; } mpd_copy_flags(result, a); result->exp = a->exp; - result->len = size; return rnd; } @@ -3485,6 +3482,7 @@ _mpd_qdiv(int action, mpd_t *q, const mpd_t *a, const mpd_t *b, newsize = _mpd_real_size(q->data, newsize); /* resize to smaller cannot fail */ mpd_qresize(q, newsize, status); + mpd_set_flags(q, sign_a^sign_b); q->len = newsize; mpd_setdigits(q); @@ -3502,7 +3500,6 @@ _mpd_qdiv(int action, mpd_t *q, const mpd_t *a, const mpd_t *b, exp += shift; } - mpd_set_flags(q, sign_a^sign_b); q->exp = exp; |