summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-08-02 16:48:16 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-08-02 16:48:16 +0900
commit4fa24e4ff9e0617a71f4570ec194a49ca52945e9 (patch)
treebaa5e18ea860779719e1ee91c0ffcd69cec7a3c9 /mrbgems/mruby-compiler
parent81d56477f2129f6e462b4247bf3d16cb616960c9 (diff)
downloadmruby-4fa24e4ff9e0617a71f4570ec194a49ca52945e9.tar.gz
mruby-4fa24e4ff9e0617a71f4570ec194a49ca52945e9.zip
codegen.c: allow constant folding for negative integer modulo.
Diffstat (limited to 'mrbgems/mruby-compiler')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 65d14bcf6..467b70e1b 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -823,8 +823,11 @@ 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)) {
- if (n0 < 0 || n < 0) return FALSE;
- n = n0 % n;
+ mrb_int n1 = n0 % n;
+ if ((n0 < 0) != (n < 0) && n1 != 0) {
+ n1 += n;
+ }
+ n = n1;
}
else if (op == MRB_OPSYM_2(s->mrb, and)) {
n = n0 & n;