summaryrefslogtreecommitdiff
path: root/bignum.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-07-15 15:26:12 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-07-15 15:26:12 +0000
commit66e1be60c39e3ab96fc7de01fb950cac9b5bc700 (patch)
tree1e92b6b2c409098ace98edcbbf3a425fc2f6fc79 /bignum.c
parentcba32dcaa6cd7369d0c0d130a15522048440c658 (diff)
* bignum.c (rb_big_pow): removed invariant variable. [ruby-dev:31236]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12802 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r--bignum.c18
1 files changed, 3 insertions, 15 deletions
diff --git a/bignum.c b/bignum.c
index 36b4240def..39403a980d 100644
--- a/bignum.c
+++ b/bignum.c
@@ -1674,7 +1674,7 @@ rb_big_pow(VALUE x, VALUE y)
yy = FIX2LONG(y);
if (yy > 0) {
VALUE z = 0;
- SIGNED_VALUE mask, n = 1;
+ SIGNED_VALUE mask;
if (RBIGNUM(x)->len * SIZEOF_BDIGITS * yy > 1024*1024) {
rb_warn("in a**b, b may be too big");
@@ -1682,21 +1682,9 @@ rb_big_pow(VALUE x, VALUE y)
break;
}
for (mask = FIXNUM_MAX + 1; mask; mask >>= 1) {
- if (!z) {
- SIGNED_VALUE n2 = n * n;
- if (!POSFIXABLE(n2) || (n2 / n != n)) {
- z = bigtrunc(bigsqr(rb_int2big(n)));
- }
- else {
- n = n2;
- }
- }
- else {
- z = bigtrunc(bigsqr(z));
- }
+ if (z) z = bigtrunc(bigsqr(z));
if (yy & mask) {
- if (!z) z = rb_int2big(n);
- z = bigtrunc(rb_big_mul0(z, x));
+ z = z ? bigtrunc(rb_big_mul0(z, x)) : x;
}
}
return bignorm(z);