diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-10-16 21:18:28 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-10-16 21:18:28 +0900 |
| commit | 1bf70ea255a36fc6ff0991c1ac05cb0f44df8ce1 (patch) | |
| tree | 52b6e8e8f91bf38d85f2f2c31747982725e8be34 | |
| parent | e7ff2bf72e172f7a4a30812d7f77323a48e799d3 (diff) | |
| download | mruby-1bf70ea255a36fc6ff0991c1ac05cb0f44df8ce1.tar.gz mruby-1bf70ea255a36fc6ff0991c1ac05cb0f44df8ce1.zip | |
1.divmod(0) should not crash, but return [Inf,NaN] (CRuby incompat); close #492
| -rw-r--r-- | src/numeric.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/numeric.c b/src/numeric.c index acc658e5c..6970869df 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -245,6 +245,11 @@ flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float * { mrb_float div, mod; + if (y == 0.0) { + *divp = strtod("inf", NULL); + *modp = strtod("nan", NULL); + return; + } mod = fmod(x, y); if (isinf(x) && !isinf(y) && !isnan(y)) div = x; @@ -772,6 +777,9 @@ fix_mod(mrb_state *mrb, mrb_value x) if (FIXNUM_P(y) && (b=mrb_fixnum(y)) != 0) { mrb_int mod; + if (mrb_fixnum(y) == 0) { + return mrb_float_value(strtod("nan", NULL)); + } fixdivmod(mrb, a, mrb_fixnum(y), 0, &mod); return mrb_fixnum_value(mod); } @@ -798,6 +806,10 @@ fix_divmod(mrb_state *mrb, mrb_value x) if (FIXNUM_P(y)) { mrb_int div, mod; + if (mrb_fixnum(y) == 0) { + return mrb_assoc_new(mrb, mrb_float_value(strtod("inf", NULL)), + mrb_float_value(strtod("nan", NULL))); + } fixdivmod(mrb, mrb_fixnum(x), mrb_fixnum(y), &div, &mod); return mrb_assoc_new(mrb, mrb_fixnum_value(div), mrb_fixnum_value(mod)); } |
