Avoid integer overflow in comparison.

parent 0113db67
...@@ -2487,8 +2487,12 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2487,8 +2487,12 @@ codegen(codegen_scope *s, node *tree, int val)
if (i == -1) genop_1(s, OP_LOADI__1, cursp()); if (i == -1) genop_1(s, OP_LOADI__1, cursp());
else if (i >= -0xff) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i); else if (i >= -0xff) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
else if (i >= -0x8000) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i); else if (i >= -0x8000) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
else if (i >= -0x80000000) genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i); #ifdef MRB_INT64
else if (i >= -(int32_t)0x80000000) genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
else goto lit_int; else goto lit_int;
#else
else genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
#endif
} }
else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp()); else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp());
else if (i <= 0xff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i); else if (i <= 0xff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i);
...@@ -2497,7 +2501,9 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2497,7 +2501,9 @@ codegen(codegen_scope *s, node *tree, int val)
else { else {
int off; int off;
#ifdef MRB_INT64
lit_int: lit_int:
#endif
off = new_lit(s, mrb_int_value(s->mrb, i)); off = new_lit(s, mrb_int_value(s->mrb, i));
genop_bs(s, OP_LOADL, cursp(), off); genop_bs(s, OP_LOADL, cursp(), off);
} }
...@@ -2560,6 +2566,9 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2560,6 +2566,9 @@ codegen(codegen_scope *s, node *tree, int val)
else if (i >= -0x8000) { else if (i >= -0x8000) {
genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i); genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
} }
#ifdef MRB_INT32
else genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
#else
else if (i >= -0x80000000) { else if (i >= -0x80000000) {
genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i); genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
} }
...@@ -2567,6 +2576,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2567,6 +2576,7 @@ codegen(codegen_scope *s, node *tree, int val)
int off = new_lit(s, mrb_int_value(s->mrb, i)); int off = new_lit(s, mrb_int_value(s->mrb, i));
genop_bs(s, OP_LOADL, cursp(), off); genop_bs(s, OP_LOADL, cursp(), off);
} }
#endif
#ifndef MRB_NO_FLOAT #ifndef MRB_NO_FLOAT
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment