ruby-changes:3947
From: ko1@a...
Date: Tue, 12 Feb 2008 11:46:40 +0900 (JST)
Subject: [ruby-changes:3947] matz - Ruby:r15437 (trunk): * numeric.c (rb_num_coerce_bin): add ID argument to specify
matz 2008-02-12 11:46:21 +0900 (Tue, 12 Feb 2008) New Revision: 15437 Modified files: trunk/ChangeLog trunk/bignum.c trunk/ext/bigdecimal/bigdecimal.c trunk/include/ruby/intern.h trunk/numeric.c Log: * numeric.c (rb_num_coerce_bin): add ID argument to specify caller's method name. [ruby-dev:33663] * numeric.c (rb_num_coerce_cmp): ditto. * numeric.c (rb_num_coerce_relop): ditto. * ext/bigdecimal/bigdecimal.c (DoSomeOne): add function name argument. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/numeric.c?r1=15437&r2=15436&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15437&r2=15436&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bignum.c?r1=15437&r2=15436&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/intern.h?r1=15437&r2=15436&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ext/bigdecimal/bigdecimal.c?r1=15437&r2=15436&diff_format=u Index: include/ruby/intern.h =================================================================== --- include/ruby/intern.h (revision 15436) +++ include/ruby/intern.h (revision 15437) @@ -364,9 +364,9 @@ void rb_marshal_define_compat(VALUE newclass, VALUE oldclass, VALUE (*dumper)(VALUE), VALUE (*loader)(VALUE, VALUE)); /* numeric.c */ void rb_num_zerodiv(void); -VALUE rb_num_coerce_bin(VALUE, VALUE); -VALUE rb_num_coerce_cmp(VALUE, VALUE); -VALUE rb_num_coerce_relop(VALUE, VALUE); +VALUE rb_num_coerce_bin(VALUE, VALUE, ID); +VALUE rb_num_coerce_cmp(VALUE, VALUE, ID); +VALUE rb_num_coerce_relop(VALUE, VALUE, ID); VALUE rb_float_new(double); VALUE rb_num2fix(VALUE); VALUE rb_fix2str(VALUE, int); Index: ChangeLog =================================================================== --- ChangeLog (revision 15436) +++ ChangeLog (revision 15437) @@ -1,3 +1,14 @@ +Tue Feb 12 11:38:57 2008 Yukihiro Matsumoto <matz@r...> + + * numeric.c (rb_num_coerce_bin): add ID argument to specify + caller's method name. [ruby-dev:33663] + + * numeric.c (rb_num_coerce_cmp): ditto. + + * numeric.c (rb_num_coerce_relop): ditto. + + * ext/bigdecimal/bigdecimal.c (DoSomeOne): add function name argument. + Tue Feb 12 10:25:02 2008 * lib/rdoc/rdoc.rb: Wrap parse_files' read in version check for Index: ext/bigdecimal/bigdecimal.c =================================================================== --- ext/bigdecimal/bigdecimal.c (revision 15436) +++ ext/bigdecimal/bigdecimal.c (revision 15437) @@ -38,7 +38,7 @@ /* * ================== Ruby Interface part ========================== */ -#define DoSomeOne(x,y) rb_num_coerce_bin(x,y) +#define DoSomeOne(x,y,f) rb_num_coerce_bin(x,y,f) #if 0 /* BigDecimal provides arbitrary-precision floating point decimal arithmetic. @@ -657,7 +657,7 @@ U_LONG mx; GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); - if(!b) return DoSomeOne(self,r); + if(!b) return DoSomeOne(self,r,'+'); SAVE(b); if(VpIsNaN(b)) return b->obj; if(VpIsNaN(a)) return a->obj; @@ -696,7 +696,7 @@ GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); - if(!b) return DoSomeOne(self,r); + if(!b) return DoSomeOne(self,r,'-'); SAVE(b); if(VpIsNaN(b)) return b->obj; @@ -725,7 +725,20 @@ Real *a, *b; GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); - if(!b) return rb_num_coerce_cmp(self,r); + if(!b) { + ID f; + + switch(op) + { + case '*': return INT2FIX(e); /* any op */ + 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; + } + return rb_num_coerce_cmp(self,r,f); + } SAVE(b); e = VpComp(a, b); if(e==999) return Qnil; @@ -862,7 +875,7 @@ GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); - if(!b) return DoSomeOne(self,r); + if(!b) return DoSomeOne(self,r,'*'); SAVE(b); mx = a->Prec + b->Prec; @@ -881,7 +894,7 @@ GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); - if(!b) return DoSomeOne(self,r); + if(!b) return DoSomeOne(self,r,'/'); SAVE(b); *div = b; mx =(a->MaxPrec + b->MaxPrec + 1) * VpBaseFig(); @@ -942,7 +955,7 @@ GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); - if(!b) return DoSomeOne(self,r); + if(!b) return DoSomeOne(self,r,rb_intern("divmod")); SAVE(b); if(VpIsNaN(a) || VpIsNaN(b)) goto NaN; @@ -1015,7 +1028,7 @@ GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); - if(!b) return DoSomeOne(self,r); + if(!b) return DoSomeOne(self,r,rb_intern("remainder")); SAVE(b); mx =(a->MaxPrec + b->MaxPrec) *VpBaseFig(); Index: numeric.c =================================================================== --- numeric.c (revision 15436) +++ numeric.c (revision 15437) @@ -162,27 +162,27 @@ } VALUE -rb_num_coerce_bin(VALUE x, VALUE y) +rb_num_coerce_bin(VALUE x, VALUE y, ID func) { do_coerce(&x, &y, Qtrue); - return rb_funcall(x, rb_frame_this_func(), 1, y); + return rb_funcall(x, func, 1, y); } VALUE -rb_num_coerce_cmp(VALUE x, VALUE y) +rb_num_coerce_cmp(VALUE x, VALUE y, ID func) { if (do_coerce(&x, &y, Qfalse)) - return rb_funcall(x, rb_frame_this_func(), 1, y); + return rb_funcall(x, func, 1, y); return Qnil; } VALUE -rb_num_coerce_relop(VALUE x, VALUE y) +rb_num_coerce_relop(VALUE x, VALUE y, ID func) { VALUE c, x0 = x, y0 = y; if (!do_coerce(&x, &y, Qfalse) || - NIL_P(c = rb_funcall(x, rb_frame_this_func(), 1, y))) { + NIL_P(c = rb_funcall(x, func, 1, y))) { rb_cmperr(x0, y0); return Qnil; /* not reached */ } @@ -567,7 +567,7 @@ case T_FLOAT: return DOUBLE2NUM(RFLOAT_VALUE(x) + RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '+'); } } @@ -590,7 +590,7 @@ case T_FLOAT: return DOUBLE2NUM(RFLOAT_VALUE(x) - RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '-'); } } @@ -613,7 +613,7 @@ case T_FLOAT: return DOUBLE2NUM(RFLOAT_VALUE(x) * RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '*'); } } @@ -641,7 +641,7 @@ case T_FLOAT: return DOUBLE2NUM(RFLOAT_VALUE(x) / RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '/'); } } @@ -701,7 +701,7 @@ fy = RFLOAT_VALUE(y); break; default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '%'); } flodivmod(RFLOAT_VALUE(x), fy, 0, &mod); return DOUBLE2NUM(mod); @@ -731,7 +731,7 @@ fy = RFLOAT_VALUE(y); break; default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("divmod")); } flodivmod(RFLOAT_VALUE(x), fy, &div, &mod); if (FIXABLE(div)) { @@ -767,7 +767,7 @@ case T_FLOAT: return DOUBLE2NUM(pow(RFLOAT_VALUE(x), RFLOAT_VALUE(y))); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("**")); } } @@ -906,7 +906,7 @@ break; default: - return rb_num_coerce_cmp(x, y); + return rb_num_coerce_cmp(x, y, rb_intern("<=>")); } return rb_dbl_cmp(a, b); } @@ -939,7 +939,7 @@ break; default: - return rb_num_coerce_relop(x, y); + return rb_num_coerce_relop(x, y, '>'); } if (isnan(a)) return Qfalse; return (a > b)?Qtrue:Qfalse; @@ -974,7 +974,7 @@ break; default: - return rb_num_coerce_relop(x, y); + return rb_num_coerce_relop(x, y, rb_intern(">=")); } if (isnan(a)) return Qfalse; return (a >= b)?Qtrue:Qfalse; @@ -1008,7 +1008,7 @@ break; default: - return rb_num_coerce_relop(x, y); + return rb_num_coerce_relop(x, y, '<'); } if (isnan(a)) return Qfalse; return (a < b)?Qtrue:Qfalse; @@ -1043,7 +1043,7 @@ break; default: - return rb_num_coerce_relop(x, y); + return rb_num_coerce_relop(x, y, rb_intern("<=")); } if (isnan(a)) return Qfalse; return (a <= b)?Qtrue:Qfalse; @@ -2047,7 +2047,7 @@ case T_FLOAT: return DOUBLE2NUM((double)FIX2LONG(x) + RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '+'); } } @@ -2081,7 +2081,7 @@ case T_FLOAT: return DOUBLE2NUM((double)FIX2LONG(x) - RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '-'); } } @@ -2140,7 +2140,7 @@ case T_FLOAT: return DOUBLE2NUM((double)FIX2LONG(x) * RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '*'); } } @@ -2196,7 +2196,7 @@ case T_FLOAT: return DOUBLE2NUM((double)FIX2LONG(x) / RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("quo")); } } @@ -2222,7 +2222,7 @@ return LONG2NUM(div); } default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, flo ? '/' : rb_intern("div")); } } @@ -2284,7 +2284,7 @@ return DOUBLE2NUM(mod); } default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '%'); } } @@ -2319,7 +2319,7 @@ return rb_assoc_new(a, b); } default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("divmod")); } } @@ -2416,7 +2416,7 @@ if (a == 1) return DOUBLE2NUM(1.0); return DOUBLE2NUM(pow((double)a, RFLOAT_VALUE(y))); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("**")); } } @@ -2469,7 +2469,7 @@ case T_FLOAT: return rb_dbl_cmp((double)FIX2LONG(x), RFLOAT_VALUE(y)); default: - return rb_num_coerce_cmp(x, y); + return rb_num_coerce_cmp(x, y, rb_intern("<=>")); } } @@ -2494,7 +2494,7 @@ case T_FLOAT: return (double)FIX2LONG(x) > RFLOAT_VALUE(y) ? Qtrue : Qfalse; default: - return rb_num_coerce_relop(x, y); + return rb_num_coerce_relop(x, y, '>'); } } @@ -2519,7 +2519,7 @@ case T_FLOAT: return (double)FIX2LONG(x) >= RFLOAT_VALUE(y) ? Qtrue : Qfalse; default: - return rb_num_coerce_relop(x, y); + return rb_num_coerce_relop(x, y, rb_intern(">=")); } } @@ -2544,7 +2544,7 @@ case T_FLOAT: return (double)FIX2LONG(x) < RFLOAT_VALUE(y) ? Qtrue : Qfalse; default: - return rb_num_coerce_relop(x, y); + return rb_num_coerce_relop(x, y, '<'); } } @@ -2569,7 +2569,7 @@ case T_FLOAT: return (double)FIX2LONG(x) <= RFLOAT_VALUE(y) ? Qtrue : Qfalse; default: - return rb_num_coerce_relop(x, y); + return rb_num_coerce_relop(x, y, rb_intern("<=")); } } Index: bignum.c =================================================================== --- bignum.c (revision 15436) +++ bignum.c (revision 15437) @@ -1184,7 +1184,7 @@ return rb_dbl_cmp(rb_big2dbl(x), RFLOAT_VALUE(y)); default: - return rb_num_coerce_cmp(x, y); + return rb_num_coerce_cmp(x, y, rb_intern("<=>")); } if (RBIGNUM_SIGN(x) > RBIGNUM_SIGN(y)) return INT2FIX(1); @@ -1419,7 +1419,7 @@ return DOUBLE2NUM(rb_big2dbl(x) + RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '+'); } } @@ -1444,7 +1444,7 @@ return DOUBLE2NUM(rb_big2dbl(x) - RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '-'); } } @@ -1508,7 +1508,7 @@ return DOUBLE2NUM(rb_big2dbl(x) * RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '*'); } bms.x = x; @@ -1742,7 +1742,7 @@ return DOUBLE2NUM(rb_big2dbl(x) / RFLOAT_VALUE(y)); default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '/'); } bigdivmod(x, y, &z, 0); @@ -1772,7 +1772,7 @@ break; default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, '%'); } bigdivmod(x, y, 0, &z); @@ -1802,7 +1802,7 @@ break; default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("remainder")); } bigdivrem(x, y, 0, &z); @@ -1830,7 +1830,7 @@ break; default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("divmod")); } bigdivmod(x, y, &div, &mod); @@ -1931,7 +1931,7 @@ break; default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("quo")); } return DOUBLE2NUM(dx / dy); } @@ -2038,7 +2038,7 @@ break; default: - return rb_num_coerce_bin(x, y); + return rb_num_coerce_bin(x, y, rb_intern("**")); } return DOUBLE2NUM(pow(rb_big2dbl(x), d)); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/