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

ruby-changes:11300

From: nobu <ko1@a...>
Date: Thu, 12 Mar 2009 18:09:30 +0900 (JST)
Subject: [ruby-changes:11300] Ruby:r22913 (trunk): * marshal.c (div0), numeric.c (infinite_value): new functions to

nobu	2009-03-12 18:09:15 +0900 (Thu, 12 Mar 2009)

  New Revision: 22913

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22913

  Log:
    * marshal.c (div0), numeric.c (infinite_value): new functions to
      get rid of VC divion by 0 warnings.

  Modified files:
    trunk/ChangeLog
    trunk/marshal.c
    trunk/numeric.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 22912)
+++ ChangeLog	(revision 22913)
@@ -1,5 +1,8 @@
-Thu Mar 12 18:02:05 2009  Nobuyoshi Nakada  <nobu@r...>
+Thu Mar 12 18:09:14 2009  Nobuyoshi Nakada  <nobu@r...>
 
+	* marshal.c (div0), numeric.c (infinite_value): new functions to
+	  get rid of VC divion by 0 warnings.
+
 	* st.c: use st_index_t for indexes instead of int.
 
 	* vm.c (rb_vm_get_sourceline), vm_insnhelper.c (vm_throw): use
Index: numeric.c
===================================================================
--- numeric.c	(revision 22912)
+++ numeric.c	(revision 22913)
@@ -2445,6 +2445,20 @@
     return LONG2NUM(z);
 }
 
+#if defined _MSC_VER && _MSC_VER >= 1300
+#pragma warning(push)
+#pragma warning(disable:4723)
+#endif
+static inline double
+infinite_value(void)
+{
+    static const double zero = 0.0;
+    return 1.0 / zero;
+}
+#if defined _MSC_VER && _MSC_VER >= 1300
+#pragma warning(pop)
+#endif
+
 /*
  *  call-seq:
  *    fix ** other         => Numeric
@@ -2460,7 +2474,6 @@
 static VALUE
 fix_pow(VALUE x, VALUE y)
 {
-    static const double zero = 0.0;
     long a = FIX2LONG(x);
 
     if (FIXNUM_P(y)) {
@@ -2473,7 +2486,7 @@
 	if (b == 1) return x;
 	if (a == 0) {
 	    if (b > 0) return INT2FIX(0);
-	    return DBL2NUM(1.0 / zero);
+	    return DBL2NUM(infinite_value());
 	}
 	if (a == 1) return INT2FIX(1);
 	if (a == -1) {
@@ -2501,7 +2514,7 @@
       case T_FLOAT:
 	if (RFLOAT_VALUE(y) == 0.0) return DBL2NUM(1.0);
 	if (a == 0) {
-	    return DBL2NUM(RFLOAT_VALUE(y) < 0 ? (1.0 / zero) : 0.0);
+	    return DBL2NUM(RFLOAT_VALUE(y) < 0 ? infinite_value() : 0.0);
 	}
 	if (a == 1) return DBL2NUM(1.0);
 	return DBL2NUM(pow((double)a, RFLOAT_VALUE(y)));
Index: marshal.c
===================================================================
--- marshal.c	(revision 22912)
+++ marshal.c	(revision 22913)
@@ -1201,6 +1201,20 @@
     return rb_obj_alloc(klass);
 }
 
+#if defined _MSC_VER && _MSC_VER >= 1300
+#pragma warning(push)
+#pragma warning(disable:4723)
+#endif
+static double
+div0(double x)
+{
+    double t = 0.0;
+    return x / t;
+}
+#if defined _MSC_VER && _MSC_VER >= 1300
+#pragma warning(pop)
+#endif
+
 static VALUE
 r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
 {
@@ -1292,18 +1306,18 @@
 
       case TYPE_FLOAT:
 	{
-	    double d, t = 0.0;
+	    double d;
 	    VALUE str = r_bytes(arg);
 	    const char *ptr = RSTRING_PTR(str);
 
 	    if (strcmp(ptr, "nan") == 0) {
-		d = t / t;
+		d = div0(0.0);
 	    }
 	    else if (strcmp(ptr, "inf") == 0) {
-		d = 1.0 / t;
+		d = div0(+1.0);
 	    }
 	    else if (strcmp(ptr, "-inf") == 0) {
-		d = -1.0 / t;
+		d = div0(-1.0);
 	    }
 	    else {
 		char *e;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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