[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]