diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-05-14 01:19:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-05-14 01:19:27 +0900 |
| commit | e1b84143c6afefa5aa7edf7c02c019c6c4a4c1d4 (patch) | |
| tree | a1ff8eb842b493b34db4c57cbc5375810851c9e2 | |
| parent | 1a462131c06cdea16f09cd99d049ac6a200ba8ce (diff) | |
| parent | f0fed9dbec5f6a334ede9f7ccd3e6ceba014ab4f (diff) | |
| download | mruby-e1b84143c6afefa5aa7edf7c02c019c6c4a4c1d4.tar.gz mruby-e1b84143c6afefa5aa7edf7c02c019c6c4a4c1d4.zip | |
Merge pull request #2248 from carsonmcdonald/mulfix
Another change to fix issue #2244
| -rw-r--r-- | src/numeric.c | 3 | ||||
| -rw-r--r-- | src/vm.c | 29 |
2 files changed, 19 insertions, 13 deletions
diff --git a/src/numeric.c b/src/numeric.c index 8af7bfd15..b3daddf85 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -702,7 +702,8 @@ mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y) a = mrb_fixnum(x); if (mrb_fixnum_p(y)) { - mrb_int b, c; + mrb_float c; + mrb_int b; if (a == 0) return x; b = mrb_fixnum(y); @@ -1729,19 +1729,24 @@ RETRY_TRY_BLOCK: switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) { case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM): { - mrb_int x, y, z; + mrb_value z; - x = mrb_fixnum(regs[a]); - y = mrb_fixnum(regs[a+1]); - z = x * y; -#ifdef MRB_WORD_BOXING - z = (z << MRB_FIXNUM_SHIFT) / (1 << MRB_FIXNUM_SHIFT); -#endif - if (x != 0 && z/x != y) { - SET_FLT_VALUE(mrb, regs[a], (mrb_float)x * (mrb_float)y); - } - else { - SET_INT_VALUE(regs[a], z); + z = mrb_fixnum_mul(mrb, regs[a], regs[a+1]); + + switch (mrb_type(z)) { + case MRB_TT_FIXNUM: + { + SET_INT_VALUE(regs[a], mrb_fixnum(z)); + } + break; + case MRB_TT_FLOAT: + { + SET_FLT_VALUE(mrb, regs[a], mrb_float(z)); + } + break; + default: + /* cannot happen */ + break; } } break; |
