diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-08-18 13:22:28 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 16:21:43 +0900 |
| commit | ee544dc881453cdd1f18f87344627206834e1ab4 (patch) | |
| tree | 1ab9e42cadc9f02c62f29744f5a584acf5ab9984 /src | |
| parent | ed32b6fcdc0acc9e70f21a9df8e85d20ec662185 (diff) | |
| download | mruby-ee544dc881453cdd1f18f87344627206834e1ab4.tar.gz mruby-ee544dc881453cdd1f18f87344627206834e1ab4.zip | |
Update the PR #4922 according to #3123.
close #3123
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 28 |
1 files changed, 27 insertions, 1 deletions
@@ -2315,7 +2315,33 @@ RETRY_TRY_BLOCK: { mrb_int x = mrb_fixnum(regs[a]); mrb_int y = mrb_fixnum(regs[a+1]); - SET_INT_VALUE(regs[a], y ? x / y : 0); + if (y == 0 || (x == MRB_INT_MIN && y == -1)) { +#ifdef MRB_NO_FLOAT + SET_INT_VALUE(regs[a], y ? x / y : 0); +#else + SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / (mrb_float)y); +#endif + } + else { + mrb_int div, mod; + if (y < 0) { + if (x < 0) + div = -x / -y; + else + div = - (x / -y); + } + else { + if (x < 0) + div = - (-x / y); + else + div = x / y; + } + mod = x - div*y; + if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) { + div -= 1; + } + SET_INT_VALUE(regs[a], div); + } } NEXT; #ifndef MRB_NO_FLOAT |
