1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/bigdecimal/bigdecimal.c (BigDecimal_DoDivmod, BigDecimal_mod,

BigDecimal_divmod, BigDecimal_div2): BigDecimal#% and #div returned
  an array itself that was returned by #divmod.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26434 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mame 2010-01-26 15:25:04 +00:00
parent 671c165b6d
commit 1d3c2678e2
2 changed files with 24 additions and 16 deletions

View file

@ -1,3 +1,9 @@
Wed Jan 27 00:22:20 2010 Yusuke Endoh <mame@tsg.ne.jp>
* ext/bigdecimal/bigdecimal.c (BigDecimal_DoDivmod, BigDecimal_mod,
BigDecimal_divmod, BigDecimal_div2): BigDecimal#% and #div returned
an array itself that was returned by #divmod.
Wed Jan 27 00:19:30 2010 Yusuke Endoh <mame@tsg.ne.jp> Wed Jan 27 00:19:30 2010 Yusuke Endoh <mame@tsg.ne.jp>
* ext/bigdecimal/bigdecimal.c (VpCtoV): do not raise infinity * ext/bigdecimal/bigdecimal.c (VpCtoV): do not raise infinity

View file

@ -947,7 +947,7 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
GUARD_OBJ(a,GetVpValue(self,1)); GUARD_OBJ(a,GetVpValue(self,1));
b = GetVpValue(r,0); b = GetVpValue(r,0);
if(!b) return DoSomeOne(self,r,rb_intern("divmod")); if(!b) return Qfalse;
SAVE(b); SAVE(b);
if(VpIsNaN(a) || VpIsNaN(b)) goto NaN; if(VpIsNaN(a) || VpIsNaN(b)) goto NaN;
@ -960,7 +960,7 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
GUARD_OBJ(d,VpCreateRbObject(1, "0")); GUARD_OBJ(d,VpCreateRbObject(1, "0"));
*div = d; *div = d;
*mod = c; *mod = c;
return (VALUE)0; return Qtrue;
} }
mx = a->Prec; mx = a->Prec;
@ -983,14 +983,14 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
*div = d; *div = d;
*mod = c; *mod = c;
} }
return (VALUE)0; return Qtrue;
NaN: NaN:
GUARD_OBJ(c,VpCreateRbObject(1, "NaN")); GUARD_OBJ(c,VpCreateRbObject(1, "NaN"));
GUARD_OBJ(d,VpCreateRbObject(1, "NaN")); GUARD_OBJ(d,VpCreateRbObject(1, "NaN"));
*div = d; *div = d;
*mod = c; *mod = c;
return (VALUE)0; return Qtrue;
} }
/* call-seq: /* call-seq:
@ -1006,10 +1006,11 @@ BigDecimal_mod(VALUE self, VALUE r) /* %: a%b = a - (a.to_f/b).floor * b */
VALUE obj; VALUE obj;
Real *div=NULL, *mod=NULL; Real *div=NULL, *mod=NULL;
obj = BigDecimal_DoDivmod(self,r,&div,&mod); if(BigDecimal_DoDivmod(self,r,&div,&mod)) {
if(obj!=(VALUE)0) return obj; SAVE(div); SAVE(mod);
SAVE(div);SAVE(mod); return ToValue(mod);
return ToValue(mod); }
return DoSomeOne(self,r,'%');
} }
static VALUE static VALUE
@ -1089,11 +1090,11 @@ BigDecimal_divmod(VALUE self, VALUE r)
VALUE obj; VALUE obj;
Real *div=NULL, *mod=NULL; Real *div=NULL, *mod=NULL;
obj = BigDecimal_DoDivmod(self,r,&div,&mod); if(BigDecimal_DoDivmod(self,r,&div,&mod)) {
if(obj!=(VALUE)0) return obj; SAVE(div); SAVE(mod);
SAVE(div);SAVE(mod); return rb_assoc_new(ToValue(div), ToValue(mod));
obj = rb_assoc_new(BigDecimal_to_i(ToValue(div)), ToValue(mod)); }
return obj; return DoSomeOne(self,r,rb_intern("divmod"));
} }
static VALUE static VALUE
@ -1106,9 +1107,10 @@ BigDecimal_div2(int argc, VALUE *argv, VALUE self)
VALUE obj; VALUE obj;
Real *div=NULL; Real *div=NULL;
Real *mod; Real *mod;
obj = BigDecimal_DoDivmod(self,b,&div,&mod); if(BigDecimal_DoDivmod(self,b,&div,&mod)) {
if(obj!=(VALUE)0) return obj; return BigDecimal_to_i(ToValue(div));
return BigDecimal_to_i(ToValue(div)); }
return DoSomeOne(self,b,rb_intern("div"));
} else { /* div in BigDecimal sense */ } else { /* div in BigDecimal sense */
U_LONG ix = (U_LONG)GetPositiveInt(n); U_LONG ix = (U_LONG)GetPositiveInt(n);
if(ix==0) return BigDecimal_div(self,b); if(ix==0) return BigDecimal_div(self,b);