From: Tadashi Saito Date: 2005-08-09T20:30:22+09:00 Subject: [ruby-dev:26778] bignum.cの不自然な点 斎藤と申します。 とても細かい話で恐縮なのですが、bignum.cについて二点ほど指摘させて ください。 まず、rb_big_mul(x, y)の冒頭でxがFixnumかどうかチェックしていますが、 これは一貫性に欠けている、不必要なコードではないでしょうか。 もう一点ですが、以下のようにするとエラーになります。これは Numeric#coerceと比べて考えても、不自然ではないでしょうか。 $ ruby -e 'big = 1<<64; big.coerce(big)' -e:1:in `coerce': Can't coerce Bignum to Bignum (TypeError) from -e:1 しかしいずれの点も今まで問題にならなかった事なのでしょうから、 必要性は低い修正かもしれません。もし適用した方がよいと思う方が いらっしゃいましたら、よろしくおねがいします。 Index: bignum.c =================================================================== RCS file: /src/ruby/bignum.c,v retrieving revision 1.118 diff -u -p -r1.118 bignum.c --- bignum.c 3 Aug 2005 07:09:47 -0000 1.118 +++ bignum.c 9 Aug 2005 10:38:32 -0000 @@ -1230,7 +1230,6 @@ rb_big_mul(x, y) VALUE z; BDIGIT *zds; - if (FIXNUM_P(x)) x = rb_int2big(FIX2LONG(x)); switch (TYPE(y)) { case T_FIXNUM: y = rb_int2big(FIX2LONG(y)); @@ -1979,6 +1978,9 @@ rb_big_coerce(x, y) if (FIXNUM_P(y)) { return rb_assoc_new(rb_int2big(FIX2LONG(y)), x); } + else if (TYPE(y) == T_BIGNUM) { + return rb_assoc_new(y, x); + } else { rb_raise(rb_eTypeError, "can't coerce %s to Bignum", rb_obj_classname(y)); -- 斎藤ただし