mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* bignum.c (rb_big2str1): Truncate topmost zeros of x.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42570 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
02b6f663c5
commit
7fc4142a02
2 changed files with 24 additions and 14 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
Fri Aug 16 00:33:12 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* bignum.c (rb_big2str1): Truncate topmost zeros of x.
|
||||||
|
|
||||||
Fri Aug 16 00:00:57 2013 Tanaka Akira <akr@fsij.org>
|
Fri Aug 16 00:00:57 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* bignum.c (bary_divmod): Simplify an expression.
|
* bignum.c (bary_divmod): Simplify an expression.
|
||||||
|
|
34
bignum.c
34
bignum.c
|
@ -4497,18 +4497,25 @@ rb_big2str1(VALUE x, int base)
|
||||||
struct big2str_struct b2s_data;
|
struct big2str_struct b2s_data;
|
||||||
int power_level;
|
int power_level;
|
||||||
VALUE power;
|
VALUE power;
|
||||||
|
BDIGIT *xds;
|
||||||
|
size_t xn;
|
||||||
|
|
||||||
if (FIXNUM_P(x)) {
|
if (FIXNUM_P(x)) {
|
||||||
return rb_fix2str(x, base);
|
return rb_fix2str(x, base);
|
||||||
}
|
}
|
||||||
if (BIGZEROP(x)) {
|
|
||||||
|
xds = BDIGITS(x);
|
||||||
|
xn = RBIGNUM_LEN(x);
|
||||||
|
BARY_TRUNC(xds, xn);
|
||||||
|
|
||||||
|
if (xn == 0) {
|
||||||
return rb_usascii_str_new2("0");
|
return rb_usascii_str_new2("0");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (base < 2 || 36 < base)
|
if (base < 2 || 36 < base)
|
||||||
rb_raise(rb_eArgError, "invalid radix %d", base);
|
rb_raise(rb_eArgError, "invalid radix %d", base);
|
||||||
|
|
||||||
if (RBIGNUM_LEN(x) >= LONG_MAX/BITSPERDIG) {
|
if (xn >= LONG_MAX/BITSPERDIG) {
|
||||||
rb_raise(rb_eRangeError, "bignum too big to convert into `string'");
|
rb_raise(rb_eRangeError, "bignum too big to convert into `string'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4520,13 +4527,13 @@ rb_big2str1(VALUE x, int base)
|
||||||
power_level = 0;
|
power_level = 0;
|
||||||
power = power_cache_get_power(base, power_level, NULL);
|
power = power_cache_get_power(base, power_level, NULL);
|
||||||
while (power_level < MAX_BASE36_POWER_TABLE_ENTRIES &&
|
while (power_level < MAX_BASE36_POWER_TABLE_ENTRIES &&
|
||||||
RBIGNUM_LEN(power) <= (RBIGNUM_LEN(x)+1)/2) {
|
(size_t)RBIGNUM_LEN(power) <= (xn+1)/2) {
|
||||||
power_level++;
|
power_level++;
|
||||||
power = power_cache_get_power(base, power_level, NULL);
|
power = power_cache_get_power(base, power_level, NULL);
|
||||||
}
|
}
|
||||||
assert(power_level != MAX_BASE36_POWER_TABLE_ENTRIES);
|
assert(power_level != MAX_BASE36_POWER_TABLE_ENTRIES);
|
||||||
|
|
||||||
if (RBIGNUM_LEN(power) <= RBIGNUM_LEN(x)) {
|
if ((size_t)RBIGNUM_LEN(power) <= xn) {
|
||||||
/*
|
/*
|
||||||
* This increment guarantees x < power_cache_get_power(base, power_level)
|
* This increment guarantees x < power_cache_get_power(base, power_level)
|
||||||
* without invoking it actually.
|
* without invoking it actually.
|
||||||
|
@ -4549,19 +4556,18 @@ rb_big2str1(VALUE x, int base)
|
||||||
b2s_data.ptr = NULL;
|
b2s_data.ptr = NULL;
|
||||||
|
|
||||||
if (power_level == 0) {
|
if (power_level == 0) {
|
||||||
big2str_orig(&b2s_data, BDIGITS(x), RBIGNUM_LEN(x), 0);
|
big2str_orig(&b2s_data, xds, xn, 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
VALUE tmpx = 0;
|
VALUE tmpw = 0;
|
||||||
BDIGIT *xds;
|
BDIGIT *wds;
|
||||||
size_t xn, wn;
|
size_t wn;
|
||||||
xn = RBIGNUM_LEN(x);
|
|
||||||
wn = bitsize(xn) + 1 + RBIGNUM_LEN(power);
|
wn = bitsize(xn) + 1 + RBIGNUM_LEN(power);
|
||||||
xds = ALLOCV_N(BDIGIT, tmpx, xn + wn);
|
wds = ALLOCV_N(BDIGIT, tmpw, xn + wn);
|
||||||
MEMCPY(xds, BDIGITS(x), BDIGIT, xn);
|
MEMCPY(wds, xds, BDIGIT, xn);
|
||||||
big2str_karatsuba(&b2s_data, xds, xn, wn, power_level, 0);
|
big2str_karatsuba(&b2s_data, wds, xn, wn, power_level, 0);
|
||||||
if (tmpx)
|
if (tmpw)
|
||||||
ALLOCV_END(tmpx);
|
ALLOCV_END(tmpw);
|
||||||
}
|
}
|
||||||
RB_GC_GUARD(x);
|
RB_GC_GUARD(x);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue