summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-07-20 13:33:13 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-10-12 16:21:23 +0900
commit8b3f3c0bf3551c4808ce2e9ab58fcca480e0ab9c (patch)
tree0189545db956f3c19e74353aaa88f23a61257c8a /src
parentcf2aabdad6922eca1317f8541672e6176fc4c7b5 (diff)
downloadmruby-8b3f3c0bf3551c4808ce2e9ab58fcca480e0ab9c.tar.gz
mruby-8b3f3c0bf3551c4808ce2e9ab58fcca480e0ab9c.zip
Fix the bug by the combination with `MRB_64BIT` and `MRB_INT32`.
Which is caused by `MRB_NAN_BOXING`.
Diffstat (limited to 'src')
-rw-r--r--src/dump.c13
-rw-r--r--src/vm.c8
2 files changed, 16 insertions, 5 deletions
diff --git a/src/dump.c b/src/dump.c
index aeb23d033..6acba12c2 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -934,14 +934,19 @@ dump_pool(mrb_state *mrb, const mrb_pool_value *p, FILE *fp)
{
if (p->tt & IREP_TT_NFLAG) { /* number */
switch (p->tt) {
- case IREP_TT_INT32:
- fprintf(fp, "{IREP_TT_INT32, {.i32=%" PRId32 "}},\n", p->u.i32);
- break;
#ifdef MRB_64BIT
case IREP_TT_INT64:
- fprintf(fp, "{IREP_TT_INT64, {.i64=%" PRId64 "}},\n", p->u.i64);
+ if (p->u.i64 < INT32_MIN || INT32_MAX < p->u.i64) {
+ fprintf(fp, "{IREP_TT_INT64, {.i64=%" PRId64 "}},\n", p->u.i64);
+ }
+ else {
+ fprintf(fp, "{IREP_TT_INT32, {.i64=%" PRId64 "}},\n", p->u.i64);
+ }
break;
#endif
+ case IREP_TT_INT32:
+ fprintf(fp, "{IREP_TT_INT32, {.i32=%" PRId32 "}},\n", p->u.i32);
+ break;
case IREP_TT_FLOAT:
if (p->u.f == 0) {
fprintf(fp, "{IREP_TT_FLOAT, {.f=%#.1f}},\n", p->u.f);
diff --git a/src/vm.c b/src/vm.c
index c97c9678c..e184e7cc6 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1018,10 +1018,16 @@ RETRY_TRY_BLOCK:
regs[a] = mrb_fixnum_value((mrb_int)pool[b].u.i32);
break;
case IREP_TT_INT64:
-#if defined(MRB_INT64) && defined(MRB_64BIT)
+#if defined(MRB_INT64)
regs[a] = mrb_fixnum_value((mrb_int)pool[b].u.i64);
break;
#else
+#if defined(MRB_64BIT)
+ if (INT32_MIN <= pool[b].u.i64 && pool[b].u.i64 <= INT32_MAX) {
+ regs[a] = mrb_fixnum_value((mrb_int)pool[b].u.i64);
+ break;
+ }
+#endif
{
mrb_value exc = mrb_exc_new_str_lit(mrb, E_RUNTIME_ERROR, "integer overflow");
mrb_exc_set(mrb, exc);