summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-08-06 10:35:06 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-08-06 10:35:06 +0900
commit37dbb91b9614eb287729ecf0ef10e679f6b61aa1 (patch)
treefa71ac968d08372b5485f28a8efd50cf69188f2d /mrbgems/mruby-compiler/core/codegen.c
parent7ecc16f97a75d0f0b1ecc0c08987f80e568b5749 (diff)
downloadmruby-37dbb91b9614eb287729ecf0ef10e679f6b61aa1.tar.gz
mruby-37dbb91b9614eb287729ecf0ef10e679f6b61aa1.zip
codegen.c: `-9223372036854775808 % -1` overflows 64 bit integer.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index eb53d5407..e4445c1bf 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -824,11 +824,16 @@ gen_binop(codegen_scope *s, mrb_sym op, uint16_t dst)
if (!mrb_num_shift(s->mrb, n0, -n, &n)) return FALSE;
}
else if (op == MRB_OPSYM_2(s->mrb, mod) && n != 0) {
- mrb_int n1 = n0 % n;
- if ((n0 < 0) != (n < 0) && n1 != 0) {
- n1 += n;
+ if (n0 == MRB_INT_MIN && n == -1) {
+ n = 0;
+ }
+ else {
+ mrb_int n1 = n0 % n;
+ if ((n0 < 0) != (n < 0) && n1 != 0) {
+ n1 += n;
+ }
+ n = n1;
}
- n = n1;
}
else if (op == MRB_OPSYM_2(s->mrb, and)) {
n = n0 & n;