Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dc36efa

Browse files
author
Stefan Krah
committed
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.
1 parent e3c3f24 commit dc36efa

1 file changed

Lines changed: 12 additions & 15 deletions

File tree

Modules/_decimal/libmpdec/mpdecimal.c

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2251,6 +2251,7 @@ mpd_qshiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
22512251
{
22522252
mpd_ssize_t size;
22532253

2254+
assert(!mpd_isspecial(a));
22542255
assert(n >= 0);
22552256

22562257
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)
22652266
_mpd_baseshiftl(result->data, a->data, size, a->len, n);
22662267

22672268
mpd_copy_flags(result, a);
2268-
result->len = size;
22692269
result->exp = a->exp;
22702270
result->digits = a->digits+n;
2271+
result->len = size;
22712272

22722273
return 1;
22732274
}
@@ -2295,16 +2296,17 @@ _mpd_get_rnd(const mpd_uint_t *data, mpd_ssize_t len, int use_msd)
22952296
}
22962297

22972298
/*
2298-
* Same as mpd_qshiftr(), but 'result' is a static array. It is the
2299-
* caller's responsibility to make sure that the array is big enough.
2300-
* The function cannot fail.
2299+
* Same as mpd_qshiftr(), but 'result' is an mpd_t with a static coefficient.
2300+
* It is the caller's responsibility to ensure that the coefficient is big
2301+
* enough. The function cannot fail.
23012302
*/
23022303
mpd_uint_t
23032304
mpd_qsshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n)
23042305
{
23052306
mpd_uint_t rnd;
23062307
mpd_ssize_t size;
23072308

2309+
assert(!mpd_isspecial(a));
23082310
assert(n >= 0);
23092311

23102312
if (mpd_iszerocoeff(a) || n == 0) {
@@ -2315,18 +2317,16 @@ mpd_qsshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n)
23152317
if (n >= a->digits) {
23162318
rnd = _mpd_get_rnd(a->data, a->len, (n==a->digits));
23172319
mpd_zerocoeff(result);
2318-
result->digits = 1;
2319-
size = 1;
23202320
}
23212321
else {
23222322
result->digits = a->digits-n;
23232323
size = mpd_digits_to_size(result->digits);
23242324
rnd = _mpd_baseshiftr(result->data, a->data, a->len, n);
2325+
result->len = size;
23252326
}
23262327

23272328
mpd_copy_flags(result, a);
23282329
result->exp = a->exp;
2329-
result->len = size;
23302330

23312331
return rnd;
23322332
}
@@ -2343,6 +2343,7 @@ mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n)
23432343
mpd_uint_t rnd;
23442344
mpd_ssize_t size;
23452345

2346+
assert(!mpd_isspecial(result));
23462347
assert(n >= 0);
23472348

23482349
if (mpd_iszerocoeff(result) || n == 0) {
@@ -2352,19 +2353,16 @@ mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n)
23522353
if (n >= result->digits) {
23532354
rnd = _mpd_get_rnd(result->data, result->len, (n==result->digits));
23542355
mpd_zerocoeff(result);
2355-
result->digits = 1;
2356-
size = 1;
23572356
}
23582357
else {
23592358
rnd = _mpd_baseshiftr(result->data, result->data, result->len, n);
23602359
result->digits -= n;
23612360
size = mpd_digits_to_size(result->digits);
23622361
/* reducing the size cannot fail */
23632362
mpd_qresize(result, size, &dummy);
2363+
result->len = size;
23642364
}
23652365

2366-
result->len = size;
2367-
23682366
return rnd;
23692367
}
23702368

@@ -2381,6 +2379,7 @@ mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
23812379
mpd_uint_t rnd;
23822380
mpd_ssize_t size;
23832381

2382+
assert(!mpd_isspecial(a));
23842383
assert(n >= 0);
23852384

23862385
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)
23932392
if (n >= a->digits) {
23942393
rnd = _mpd_get_rnd(a->data, a->len, (n==a->digits));
23952394
mpd_zerocoeff(result);
2396-
result->digits = 1;
2397-
size = 1;
23982395
}
23992396
else {
24002397
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)
24102407
}
24112408
rnd = _mpd_baseshiftr(result->data, a->data, a->len, n);
24122409
}
2410+
result->len = size;
24132411
}
24142412

24152413
mpd_copy_flags(result, a);
24162414
result->exp = a->exp;
2417-
result->len = size;
24182415

24192416
return rnd;
24202417
}
@@ -3485,6 +3482,7 @@ _mpd_qdiv(int action, mpd_t *q, const mpd_t *a, const mpd_t *b,
34853482
newsize = _mpd_real_size(q->data, newsize);
34863483
/* resize to smaller cannot fail */
34873484
mpd_qresize(q, newsize, status);
3485+
mpd_set_flags(q, sign_a^sign_b);
34883486
q->len = newsize;
34893487
mpd_setdigits(q);
34903488

@@ -3502,7 +3500,6 @@ _mpd_qdiv(int action, mpd_t *q, const mpd_t *a, const mpd_t *b,
35023500
exp += shift;
35033501
}
35043502

3505-
mpd_set_flags(q, sign_a^sign_b);
35063503
q->exp = exp;
35073504

35083505

0 commit comments

Comments
 (0)