Skip to content

Commit cd9df2b

Browse files
committed
merge -c 12224
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@12332 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 365958f commit cd9df2b

File tree

3 files changed

+39
-21
lines changed

3 files changed

+39
-21
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
Wed May 23 05:35:42 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
2+
3+
* bignum.c (rb_big_pow): truncate all zero BDIGITs. [ruby-dev:30733]
4+
15
Wed May 23 05:17:33 2007 NAKAMURA Usaku <usa@ruby-lang.org>
26

37
* ext/iconv/iconv.c (iconv_s_conv): rdoc fix.

bignum.c

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -96,35 +96,49 @@ rb_big_2comp(x) /* get 2's complement */
9696
}
9797

9898
static VALUE
99-
bignorm(x)
99+
bigtrunc(x)
100100
VALUE x;
101101
{
102-
if (FIXNUM_P(x)) {
103-
return x;
104-
}
105-
else if (TYPE(x) == T_BIGNUM) {
106-
long len = RBIGNUM(x)->len;
107-
BDIGIT *ds = BDIGITS(x);
102+
long len = RBIGNUM(x)->len;
103+
BDIGIT *ds = BDIGITS(x);
108104

109-
while (len-- && !ds[len]) ;
110-
RBIGNUM(x)->len = ++len;
105+
while (len-- && !ds[len]);
106+
RBIGNUM(x)->len = ++len;
107+
return x;
108+
}
109+
110+
static VALUE
111+
bigfixize(VALUE x)
112+
{
113+
long len = RBIGNUM(x)->len;
114+
BDIGIT *ds = BDIGITS(x);
111115

112-
if (len*SIZEOF_BDIGITS <= sizeof(VALUE)) {
113-
long num = 0;
114-
while (len--) {
115-
num = BIGUP(num) + ds[len];
116+
if (len*SIZEOF_BDIGITS <= sizeof(VALUE)) {
117+
long num = 0;
118+
while (len--) {
119+
num = BIGUP(num) + ds[len];
120+
}
121+
if (num >= 0) {
122+
if (RBIGNUM(x)->sign) {
123+
if (POSFIXABLE(num)) return LONG2FIX(num);
116124
}
117-
if (num >= 0) {
118-
if (RBIGNUM(x)->sign) {
119-
if (POSFIXABLE(num)) return LONG2FIX(num);
120-
}
121-
else if (NEGFIXABLE(-(long)num)) return LONG2FIX(-(long)num);
125+
else {
126+
if (NEGFIXABLE(-(long)num)) return LONG2FIX(-(long)num);
122127
}
123128
}
124129
}
125130
return x;
126131
}
127132

133+
static VALUE
134+
bignorm(VALUE x)
135+
{
136+
if (!FIXNUM_P(x) && TYPE(x) == T_BIGNUM) {
137+
x = bigfixize(bigtrunc(x));
138+
}
139+
return x;
140+
}
141+
128142
VALUE
129143
rb_big_norm(x)
130144
VALUE x;
@@ -1641,10 +1655,10 @@ rb_big_pow(x, y)
16411655
while (yy % 2 == 0) {
16421656
yy /= 2;
16431657
x = rb_big_mul0(x, x);
1644-
if (!BDIGITS(x)[RBIGNUM(x)->len-1]) RBIGNUM(x)->len--;
1658+
bigtrunc(x);
16451659
}
16461660
z = rb_big_mul0(z, x);
1647-
if (!BDIGITS(z)[RBIGNUM(z)->len-1]) RBIGNUM(z)->len--;
1661+
bigtrunc(z);
16481662
}
16491663
return bignorm(z);
16501664
}

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define RUBY_RELEASE_DATE "2007-05-23"
33
#define RUBY_VERSION_CODE 186
44
#define RUBY_RELEASE_CODE 20070523
5-
#define RUBY_PATCHLEVEL 21
5+
#define RUBY_PATCHLEVEL 22
66

77
#define RUBY_VERSION_MAJOR 1
88
#define RUBY_VERSION_MINOR 8

0 commit comments

Comments
 (0)