diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-03-12 16:21:32 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-03-12 16:21:32 +0900 |
| commit | 4ae5ae353564291cdb28108c26382c32242966a8 (patch) | |
| tree | 6cb495e5c3c59a0c9f46b8e4548f17e7082443d2 /src/dump.c | |
| parent | 84e27d3b519d8fba87c6ffdf318ccadf67d5318f (diff) | |
| download | mruby-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.c | 29 |
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 */ |
