aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--marshal.c7
-rw-r--r--missing/nan.c28
-rw-r--r--numeric.c12
-rw-r--r--rational.c4
5 files changed, 31 insertions, 22 deletions
diff --git a/configure.ac b/configure.ac
index eb8daf2131..27729048af 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2266,6 +2266,7 @@ AC_REPLACE_FUNCS(isinf)
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)
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)
diff --git a/marshal.c b/marshal.c
index c6c3922283..4cfa2e10dc 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1678,12 +1678,7 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
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;
diff --git a/missing/nan.c b/missing/nan.c
new file mode 100644
index 0000000000..507cc586d2
--- /dev/null
+++ b/missing/nan.c
@@ -0,0 +1,28 @@
+#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;
+ }
+}
diff --git a/numeric.c b/numeric.c
index e7b1a69d4d..a7769ca255 100644
--- a/numeric.c
+++ b/numeric.c
@@ -3651,11 +3651,7 @@ rb_int_fdiv_double(VALUE x, VALUE y)
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)
/*
* 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");
diff --git a/rational.c b/rational.c
index c1c1081446..d82d487d51 100644
--- a/rational.c
+++ b/rational.c
@@ -1073,11 +1073,7 @@ nurat_expt(VALUE self, VALUE other)
}
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 */