From 080525aa68c68df1fd4c1484bea1de88e3c1f79f Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 12 Mar 2009 09:09:15 +0000 Subject: [PATCH] * marshal.c (div0), numeric.c (infinite_value): new functions to get rid of VC divion by 0 warnings. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22913 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 ++++- marshal.c | 22 ++++++++++++++++++---- numeric.c | 19 ++++++++++++++++--- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9b3b130efb..1d0185ca82 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,7 @@ -Thu Mar 12 18:02:05 2009 Nobuyoshi Nakada +Thu Mar 12 18:09:14 2009 Nobuyoshi Nakada + + * 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. diff --git a/marshal.c b/marshal.c index 8a3a64e4c3..bf4e3323a2 100644 --- a/marshal.c +++ b/marshal.c @@ -1201,6 +1201,20 @@ obj_alloc_by_path(const char *path, struct load_arg *arg) 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 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod) 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; diff --git a/numeric.c b/numeric.c index fc0b7175ca..9af2b142fe 100644 --- a/numeric.c +++ b/numeric.c @@ -2445,6 +2445,20 @@ int_pow(long x, unsigned long y) 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 @@ int_pow(long x, unsigned long y) 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 @@ fix_pow(VALUE x, VALUE y) 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 @@ fix_pow(VALUE x, VALUE y) 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)));