summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-08-18 13:22:28 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-10-12 16:21:43 +0900
commitee544dc881453cdd1f18f87344627206834e1ab4 (patch)
tree1ab9e42cadc9f02c62f29744f5a584acf5ab9984 /src
parented32b6fcdc0acc9e70f21a9df8e85d20ec662185 (diff)
downloadmruby-ee544dc881453cdd1f18f87344627206834e1ab4.tar.gz
mruby-ee544dc881453cdd1f18f87344627206834e1ab4.zip
Update the PR #4922 according to #3123.
close #3123
Diffstat (limited to 'src')
-rw-r--r--src/vm.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index edfce43c0..401d52414 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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