summaryrefslogtreecommitdiffhomepage
path: root/src/dump.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-03-12 16:21:32 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-03-12 16:21:32 +0900
commit4ae5ae353564291cdb28108c26382c32242966a8 (patch)
tree6cb495e5c3c59a0c9f46b8e4548f17e7082443d2 /src/dump.c
parent84e27d3b519d8fba87c6ffdf318ccadf67d5318f (diff)
downloadmruby-4ae5ae353564291cdb28108c26382c32242966a8.tar.gz
mruby-4ae5ae353564291cdb28108c26382c32242966a8.zip
codegen.c: no integer overflow error in `codegen`; close #5376
Add new pool value type `IREP_TT_BIGINT` and generate integer overflow error in the VM. In the future, `mruby` will support `Bignum` for integers bigger than `mrb_int` (probably using `mpz`).
Diffstat (limited to 'src/dump.c')
-rw-r--r--src/dump.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/dump.c b/src/dump.c
index 51e8dca4e..0822b2fac 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -129,6 +129,15 @@ get_pool_block_size(mrb_state *mrb, const mrb_irep *irep)
size += 4; /* 32bits = 4bytes */
break;
+ case IREP_TT_BIGINT:
+ {
+ mrb_int len = irep->pool[pool_no].u.str[0];
+ mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+ size += sizeof(uint8_t);
+ size += (size_t)len+2;
+ }
+ break;
+
case IREP_TT_FLOAT:
#ifndef MRB_NO_FLOAT
{
@@ -187,6 +196,14 @@ write_pool_block(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf)
cur += uint32_to_bin(irep->pool[pool_no].u.i32, cur); /* i32 */
break;
+ case IREP_TT_BIGINT:
+ cur += uint8_to_bin(IREP_TT_BIGINT, cur); /* data type */
+ len = irep->pool[pool_no].u.str[0];
+ memcpy(cur, irep->pool[pool_no].u.str, (size_t)len+2);
+ cur += len+2;
+ *cur++ = '\0';
+ break;
+
case IREP_TT_FLOAT:
cur += uint8_to_bin(IREP_TT_FLOAT, cur); /* data type */
#ifndef MRB_NO_FLOAT
@@ -216,7 +233,6 @@ write_pool_block(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf)
return cur - buf;
}
-
static size_t
get_syms_block_size(mrb_state *mrb, const mrb_irep *irep)
{
@@ -941,6 +957,17 @@ dump_pool(mrb_state *mrb, const mrb_pool_value *p, FILE *fp)
}
#endif
break;
+ case IREP_TT_BIGINT:
+ {
+ const char *s = p->u.str;
+ int len = s[0]+2;
+ fputs("{IREP_TT_BIGINT, {\"", fp);
+ for (int i=0; i<len; i++) {
+ fprintf(fp, "\\x%02x", (int)s[i]&0xff);
+ }
+ fputs("\"}},\n", fp);
+ }
+ break;
}
}
else { /* string */