codegen.c: fix a bug in bit shift constant folding.

This commit is contained in:
Yukihiro "Matz" Matsumoto
2021-08-02 08:53:50 +09:00
parent a9d721ea8f
commit 9902ab50fc
+5 -16
View File
@@ -798,6 +798,8 @@ gen_muldiv(codegen_scope *s, uint8_t op, uint16_t dst)
}
}
mrb_bool mrb_num_shift(mrb_state *mrb, mrb_int val, mrb_int width, mrb_int *num);
static mrb_bool
gen_binop(codegen_scope *s, mrb_sym op, uint16_t dst)
{
@@ -814,24 +816,11 @@ gen_binop(codegen_scope *s, mrb_sym op, uint16_t dst)
return FALSE;
}
if (op == MRB_OPSYM_2(s->mrb, lshift)) {
if (n < 0) {
if (-63 > n || -n >= sizeof(mrb_int)*8) return FALSE;
n = n0 >> (-n);
}
else {
if (n >= sizeof(mrb_int)*8-1) return FALSE;
n = n0 << n;
}
if (!mrb_num_shift(s->mrb, n0, n, &n)) return FALSE;
}
else if (op == MRB_OPSYM_2(s->mrb, rshift)) {
if (n < 0) {
if (-63 > n || -n > sizeof(mrb_int)*8-1) return FALSE;
n = n0 << (-n);
}
else {
if (n >= sizeof(mrb_int)*8-1) return FALSE;
n = n0 >> n;
}
if (n == MRB_INT_MIN) return FALSE;
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;