aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-29 14:38:26 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-29 14:38:26 +0000
commit1522375b99de8fa5e6e99d69724c89250d8181c2 (patch)
tree8da19b27f1710403d22d813dd41851672634f239
parent69f1a3351fe731e8d92c2f1c7f8507c08fb7e59b (diff)
downloadruby-1522375b99de8fa5e6e99d69724c89250d8181c2.tar.gz
* bignum.c (bary_neg): Extracted from bary_2comp.
(bary_plus_one): Extracted from bary_2comp. (bary_2comp): Use bary_neg and bary_plus_one. (big_extend_carry): Extracted from get2comp. (get2comp): Use big_extend_carry. (rb_integer_unpack): Use big_extend_carry. (rb_big_neg): Use bary_neg. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41695 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog10
-rw-r--r--bignum.c40
2 files changed, 37 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 7e5df87bf8..02269952b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Sat Jun 29 23:26:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_neg): Extracted from bary_2comp.
+ (bary_plus_one): Extracted from bary_2comp.
+ (bary_2comp): Use bary_neg and bary_plus_one.
+ (big_extend_carry): Extracted from get2comp.
+ (get2comp): Use big_extend_carry.
+ (rb_integer_unpack): Use big_extend_carry.
+ (rb_big_neg): Use bary_neg.
+
Sat Jun 29 22:31:59 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (bary_2comp): Simplified.
diff --git a/bignum.c b/bignum.c
index 583d324560..382986366f 100644
--- a/bignum.c
+++ b/bignum.c
@@ -267,13 +267,17 @@ bytes_2comp(unsigned char *buf, size_t len)
return 1;
}
+static void
+bary_neg(BDIGIT *ds, size_t n)
+{
+ while (n--)
+ ds[n] = BIGLO(~ds[n]);
+}
+
static int
-bary_2comp(BDIGIT *ds, size_t n)
+bary_plus_one(BDIGIT *ds, size_t n)
{
- size_t i = n;
- if (!n) return 1;
- while (i--) ds[i] = BIGLO(~ds[i]);
- i = 0;
+ size_t i;
for (i = 0; i < n; i++) {
ds[i] = BIGLO(ds[i]+1);
if (ds[i] != 0)
@@ -282,6 +286,21 @@ bary_2comp(BDIGIT *ds, size_t n)
return 1;
}
+static int
+bary_2comp(BDIGIT *ds, size_t n)
+{
+ if (!n) return 1;
+ bary_neg(ds, n);
+ return bary_plus_one(ds, n);
+}
+
+static void
+big_extend_carry(VALUE x)
+{
+ rb_big_resize(x, RBIGNUM_LEN(x)+1);
+ BDIGITS(x)[RBIGNUM_LEN(x)-1] = 1;
+}
+
/* modify a bignum by 2's complement */
static void
get2comp(VALUE x)
@@ -290,9 +309,7 @@ get2comp(VALUE x)
BDIGIT *ds = BDIGITS(x);
if (bary_2comp(ds, i)) {
- rb_big_resize(x, RBIGNUM_LEN(x)+1);
- ds = BDIGITS(x);
- ds[RBIGNUM_LEN(x)-1] = 1;
+ big_extend_carry(x);
}
}
@@ -1696,8 +1713,7 @@ rb_integer_unpack(const void *words, size_t numwords, size_t wordsize, size_t na
if (sign == -2) {
if (val) {
- rb_big_resize(val, (long)num_bdigits+1);
- BDIGITS(val)[num_bdigits] = 1;
+ big_extend_carry(val);
}
else if (num_bdigits == numberof(fixbuf)) {
val = bignew((long)num_bdigits+1, 0);
@@ -3026,9 +3042,7 @@ rb_big_neg(VALUE x)
ds = BDIGITS(z);
i = RBIGNUM_LEN(x);
if (!i) return INT2FIX(~(SIGNED_VALUE)0);
- while (i--) {
- ds[i] = BIGLO(~ds[i]);
- }
+ bary_neg(ds, i);
RBIGNUM_SET_SIGN(z, !RBIGNUM_SIGN(z));
if (RBIGNUM_SIGN(x)) get2comp(z);