diff options
-rw-r--r-- | bignum.c | 6 | ||||
-rw-r--r-- | internal.h | 1 |
2 files changed, 4 insertions, 3 deletions
@@ -5526,7 +5526,7 @@ rb_big_uminus(VALUE x) { VALUE z = rb_big_clone(x); - BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x)); + BIGNUM_NEGATE(z); return bignorm(z); } @@ -5624,7 +5624,7 @@ bigsub_int(VALUE x, long y0) assert(xn == zn); num = (BDIGIT_DBL_SIGNED)xds[0] - y; if (xn == 1 && num < 0) { - BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x)); + BIGNUM_NEGATE(z); zds[0] = (BDIGIT)-num; RB_GC_GUARD(x); return bignorm(z); @@ -5687,7 +5687,7 @@ bigsub_int(VALUE x, long y0) assert(num == 0 || num == -1); if (num < 0) { get2comp(z); - BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x)); + BIGNUM_NEGATE(z); } RB_GC_GUARD(x); return bignorm(z); diff --git a/internal.h b/internal.h index 637ef1619b..949c6f8a42 100644 --- a/internal.h +++ b/internal.h @@ -364,6 +364,7 @@ struct RBignum { : (RBASIC(b)->flags &= ~BIGNUM_SIGN_BIT)) #define BIGNUM_POSITIVE_P(b) BIGNUM_SIGN(b) #define BIGNUM_NEGATIVE_P(b) (!BIGNUM_SIGN(b)) +#define BIGNUM_NEGATE(b) (RBASIC(b)->flags ^= BIGNUM_SIGN_BIT) #define BIGNUM_EMBED_FLAG FL_USER2 #define BIGNUM_EMBED_LEN_MASK (FL_USER5|FL_USER4|FL_USER3) |