diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-20 03:16:59 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-20 03:16:59 +0000 |
commit | 782236e3bd5982930c22d3cf4955ec76474c8cec (patch) | |
tree | fa81b2fb7d4c4341125ccc830764c18da15339c9 | |
parent | 76b609c8c3d4cae09e619aeee6ee5743a498fd3d (diff) | |
download | ruby-782236e3bd5982930c22d3cf4955ec76474c8cec.tar.gz |
add missing/nan.c
instead of scattering #ifdef HAVE_NANF here and there define our
own nan() unless defined elsewhere.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61971 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | marshal.c | 7 | ||||
-rw-r--r-- | missing/nan.c | 28 | ||||
-rw-r--r-- | numeric.c | 12 | ||||
-rw-r--r-- | rational.c | 4 |
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) @@ -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; + } +} @@ -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 */ |