From: pegacorn Date: 2008-07-27T15:11:34+09:00 Subject: [ruby-dev:35665] Re: trunk: BigDecimal#<=> が不定値を返す場合がある pegacorn です。 From: pegacorn Date: Sat, 26 Apr 2008 23:54:57 +0900 Message-Id: <20080426.235249.97273912.subscriber.jp@gmail.com> /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > BigDecimal#<=> が不定値を返す場合があります。 > > % ruby -rbigdecimal -e 'p BigDecimal("1.0") <=> ""' > 8 r18162 の変更で、このケースは問題なくなりますが、 他のケースがまずくなっているのではないでしょうか。 % ruby -v ruby 1.9.0 (2008-07-27 revision 18230) [i386-freebsd7.0] % ruby -rbigdecimal -e 'p BigDecimal("1.0") <=> ""' nil % ruby -rbigdecimal -e 'p BigDecimal("1.0") <=> 1.0' nil % ./ruby -v ruby 1.9.0 (2008-07-22 revision 18161) [i386-freebsd7.0] % ruby -rbigdecimal -e 'p BigDecimal("1.0") <=> 1.0' 0 From: pegacorn Date: Sat, 26 Apr 2008 23:54:57 +0900 Message-Id: <20080426.235249.97273912.subscriber.jp@gmail.com> /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > BigDecimal#<=> が不定値を返す場合があります。 > > % ruby -rbigdecimal -e 'p BigDecimal("1.0") <=> ""' > 8 > > > Index: ext/bigdecimal/bigdecimal.c > =================================================================== > --- ext/bigdecimal/bigdecimal.c (リビジョン 16197) > +++ ext/bigdecimal/bigdecimal.c (作業コピー) > @@ -730,12 +730,13 @@ > > switch(op) > { > - case '*': return INT2FIX(e); /* any op */ > + case '*': f = rb_intern("<=>"); break; > case '=': f = rb_intern("=="); break; > case '!': f = rb_intern("!="); break; > case 'G': f = rb_intern(">="); break; > case 'L': f = rb_intern("<="); break; > case '>': case '<': f = (ID)op; break; > + default: rb_bug("Undefined operation in BigDecimalCmp()"); > } > return rb_num_coerce_cmp(self,r,f); > } > > > # なんで '*' が any op なのかわかりませんが、 > # + case '*': return Qnil; /* any op */ > # は違うし… -- pegacorn