summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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