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

ruby-changes:49853

From: shyouhei <ko1@a...>
Date: Sat, 20 Jan 2018 12:17:05 +0900 (JST)
Subject: [ruby-changes:49853] shyouhei:r61971 (trunk): add missing/nan.c

shyouhei	2018-01-20 12:16:59 +0900 (Sat, 20 Jan 2018)

  New Revision: 61971

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=61971

  Log:
    add missing/nan.c
    
    instead of scattering #ifdef HAVE_NANF here and there define our
    own nan() unless defined elsewhere.

  Added files:
    trunk/missing/nan.c
  Modified files:
    trunk/configure.ac
    trunk/marshal.c
    trunk/numeric.c
    trunk/rational.c
Index: configure.ac
===================================================================
--- configure.ac	(revision 61970)
+++ configure.ac	(revision 61971)
@@ -2266,6 +2266,7 @@ AC_REPLACE_FUNCS(isinf) https://github.com/ruby/ruby/blob/trunk/configure.ac#L2266
 AC_REPLACE_FUNCS(isnan)
 AC_REPLACE_FUNCS(lgamma_r)
 AC_REPLACE_FUNCS(memmove)
+AC_REPLACE_FUNCS(nan)
 AC_REPLACE_FUNCS(nextafter)
 AC_REPLACE_FUNCS(setproctitle)
 AC_REPLACE_FUNCS(strchr)
@@ -2396,7 +2397,6 @@ AC_CHECK_FUNCS(memmem) https://github.com/ruby/ruby/blob/trunk/configure.ac#L2397
 AC_CHECK_FUNCS(mkfifo)
 AC_CHECK_FUNCS(mknod)
 AC_CHECK_FUNCS(mktime)
-AC_CHECK_FUNCS(nanf) # We need nan(), but HAVE_NAN conflicts...
 AC_CHECK_FUNCS(openat)
 AC_CHECK_FUNCS(pipe2)
 AC_CHECK_FUNCS(poll)
Index: numeric.c
===================================================================
--- numeric.c	(revision 61970)
+++ numeric.c	(revision 61971)
@@ -3651,11 +3651,7 @@ rb_int_fdiv_double(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/numeric.c#L3651
         return rb_big_fdiv_double(x, y);
     }
     else {
-#ifdef HAVE_NANF
         return nan("");
-#else
-        return (double)NAN;
-#endif
     }
 }
 
@@ -5565,13 +5561,7 @@ Init_Numeric(void) https://github.com/ruby/ruby/blob/trunk/numeric.c#L5561
     /*
      *	An expression representing a value which is "not a number".
      */
-    rb_define_const(rb_cFloat, "NAN",
-#ifdef HAVE_NANF
-		    DBL2NUM(nan(""))
-#else
-		    DBL2NUM((double)NAN)
-#endif
-	);
+    rb_define_const(rb_cFloat, "NAN", DBL2NUM(nan("")));
 
     rb_define_method(rb_cFloat, "to_s", flo_to_s, 0);
     rb_define_alias(rb_cFloat, "inspect", "to_s");
Index: missing/nan.c
===================================================================
--- missing/nan.c	(nonexistent)
+++ missing/nan.c	(revision 61971)
@@ -0,0 +1,28 @@ https://github.com/ruby/ruby/blob/trunk/missing/nan.c#L1
+#include "ruby/missing.h"
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+double
+nan(const char *spec)
+{
+#if 0
+    /* FIXME: we have not yet seen any situation this is
+     * necessary. Please write a proper implementation that
+     * covers this branch.  */
+    if (spec && spec[0]) {
+        double generated_nan;
+	int len = snprintf(NULL, 0, "NAN(%s)", spec);
+	char *buf = malloc(len + 1); /* +1 for NUL */
+	sprintf(buf, "NAN(%s)", spec);
+	generated_nan = strtod(buf, NULL);
+	free(buf);
+        return generated_nan;
+    }
+    else
+#endif
+    {
+        assert(!spec || !spec[0]);
+        return (double)NAN;
+    }
+}

Property changes on: missing/nan.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Index: marshal.c
===================================================================
--- marshal.c	(revision 61970)
+++ marshal.c	(revision 61971)
@@ -1678,12 +1678,7 @@ r_object0(struct load_arg *arg, int *ivp https://github.com/ruby/ruby/blob/trunk/marshal.c#L1678
 	    const char *ptr = RSTRING_PTR(str);
 
 	    if (strcmp(ptr, "nan") == 0) {
-		d =
-#ifdef HAVE_NANF
-		    nan("");
-#else
-		    (double)NAN;
-#endif
+		d = nan("");
 	    }
 	    else if (strcmp(ptr, "inf") == 0) {
 		d = HUGE_VAL;
Index: rational.c
===================================================================
--- rational.c	(revision 61970)
+++ rational.c	(revision 61971)
@@ -1073,11 +1073,7 @@ nurat_expt(VALUE self, VALUE other) https://github.com/ruby/ruby/blob/trunk/rational.c#L1073
 	    }
 	    if (RB_FLOAT_TYPE_P(num)) { /* infinity due to overflow */
 		if (RB_FLOAT_TYPE_P(den))
-#ifdef HAVE_NANF
 		    return DBL2NUM(nan(""));
-#else
-		    return DBL2NUM((double)NAN);
-#endif
 		return num;
 	    }
 	    if (RB_FLOAT_TYPE_P(den)) { /* infinity due to overflow */

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

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