mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
codegen.c: fix a bug in bit shift constant folding.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user