遠藤と申します。
以下のようにすると反応がなくなります。Ctrl+C でも止められません。
$ ./ruby -ve 'p(65536**(1<<29))'
ruby 1.8.6 (2007-07-17 patchlevel 5000) [i686-linux]
$ ./ruby -ve 'p(65536**(1<<29))'
ruby 1.9.0 (2007-07-17 patchlevel 0) [i686-linux]
bignum の大きさのチェックで integer overflow しているのが原因のようです。
1.8 での応急措置です。
Index: bignum.c
===================================================================
--- bignum.c (revision 12809)
+++ bignum.c (working copy)
@@ -1755,8 +1755,13 @@
if (yy > 0) {
VALUE z = 0;
long mask;
+ VALUE f = 1, t1 = RBIGNUM(x)->len * SIZEOF_BDIGITS;
+ if (t1 / SIZEOF_BDIGITS == RBIGNUM(x)->len && t1 %
SIZEOF_BDIGITS == 0) {
+ VALUE t2 = t1 * yy;
+ if (t2 / yy == t1 && t2 % yy == 0 && t2 <= 1024*1024) f = 0;
+ }
- if (RBIGNUM(x)->len * SIZEOF_BDIGITS * yy > 1024*1024) {
+ if (f) {
rb_warn("in a**b, b may be too big");
d = (double)yy;
break;
1024*1024 が即値で埋め込まれているのが気持ち悪いんですが、
bignum の最大値ってちゃんと決まってないんでしょうか。
ついでに、重箱の隅ですが、以下の仕様変更は意図されたものでしょうか。
$ ./ruby -ve 'p(0**(1<<30))'
ruby 1.8.6 (2007-06-07 patchlevel 36) [i686-linux]
-e:1: warning: in a**b, b may be too big
0.0
$ ./ruby -ve 'p(0**(1<<30))'
ruby 1.8.6 (2007-07-17 patchlevel 5000) [i686-linux]
0
--
Yusuke ENDOH <mame / tsg.ne.jp>