summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bignum.c6
-rw-r--r--internal.h1
2 files changed, 4 insertions, 3 deletions
diff --git a/bignum.c b/bignum.c
index 8f79713682..1f9dfb56aa 100644
--- a/bignum.c
+++ b/bignum.c
@@ -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)