diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-11-30 23:21:19 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-11-30 23:21:19 +0900 |
| commit | 1c361f8a22e9a5506e8461b7b76e21e36ba36f9d (patch) | |
| tree | cb2ac551d032550060bcbaac5feb0ed833bb89ef | |
| parent | d56db2296d30e4c8cb69b76258dbca5d8fbafeb8 (diff) | |
| parent | 3bc9453c9ae0795724bbf4d77fdc289bf2e636b1 (diff) | |
| download | mruby-1c361f8a22e9a5506e8461b7b76e21e36ba36f9d.tar.gz mruby-1c361f8a22e9a5506e8461b7b76e21e36ba36f9d.zip | |
Merge pull request #5206 from dearblue/dumpirep
Improves dump irep
| -rw-r--r-- | src/dump.c | 48 |
1 files changed, 10 insertions, 38 deletions
diff --git a/src/dump.c b/src/dump.c index 03aa04c54..85074d5a2 100644 --- a/src/dump.c +++ b/src/dump.c @@ -48,14 +48,15 @@ write_irep_header(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf) return cur - buf; } - static size_t get_iseq_block_size(mrb_state *mrb, const mrb_irep *irep) { size_t size = 0; + size += sizeof(uint16_t); /* clen */ size += sizeof(uint16_t); /* ilen */ size += irep->ilen * sizeof(mrb_code); /* iseq(n) */ + size += irep->clen * sizeof(struct mrb_irep_catch_handler); return size; } @@ -64,10 +65,13 @@ static ptrdiff_t write_iseq_block(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf, uint8_t flags) { uint8_t *cur = buf; + size_t seqlen = irep->ilen * sizeof(mrb_code) + + irep->clen * sizeof(struct mrb_irep_catch_handler); + cur += uint16_to_bin(irep->clen, cur); /* number of catch handlers */ cur += uint16_to_bin(irep->ilen, cur); /* number of opcode */ - memcpy(cur, irep->iseq, irep->ilen * sizeof(mrb_code)); - cur += irep->ilen * sizeof(mrb_code); + memcpy(cur, irep->iseq, seqlen); + cur += seqlen; return cur - buf; } @@ -136,8 +140,9 @@ get_pool_block_size(mrb_state *mrb, const mrb_irep *irep) default: /* packed IREP_TT_STRING */ { - mrb_int len = irep->pool[pool_no].tt >> 1; /* unpack length */ + mrb_int len = irep->pool[pool_no].tt >> 2; /* unpack length */ mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX); + size += sizeof(uint16_t); size += (size_t)len+1; } break; @@ -262,40 +267,12 @@ write_syms_block(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf) } static size_t -get_catch_table_block_size(mrb_state *mrb, const mrb_irep *irep) -{ - size_t size = 0; - - size += sizeof(uint16_t); /* number of catch handler */ - size += (sizeof(struct mrb_irep_catch_handler)) * irep->clen; - - return size; -} - -static ptrdiff_t -write_catch_table_block(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf) -{ - uint8_t *cur = buf; - const struct mrb_irep_catch_handler *e = mrb_irep_catch_handler_table(irep); - mrb_static_assert1(sizeof(*e) == 13); - - if (e == NULL) return 0; - /* irep->clen has already been written before iseq block */ - memcpy(cur, (const void *)e, sizeof(*e) * irep->clen); - cur += sizeof(*e) * irep->clen; - - return cur - buf; -} - -static size_t get_irep_record_size_1(mrb_state *mrb, const mrb_irep *irep) { size_t size = 0; size += get_irep_header_size(mrb); - size += sizeof(uint16_t); size += get_iseq_block_size(mrb, irep); - size += get_catch_table_block_size(mrb, irep); size += get_pool_block_size(mrb, irep); size += get_syms_block_size(mrb, irep); return size; @@ -325,13 +302,7 @@ write_irep_record(mrb_state *mrb, const mrb_irep *irep, uint8_t *bin, size_t *ir } bin += write_irep_header(mrb, irep, bin); - /* - * The catch handler table is after iseq block, but the number of - * elements is placed before iseq block. - */ - bin += uint16_to_bin(irep->clen, bin); bin += write_iseq_block(mrb, irep, bin, flags); - bin += write_catch_table_block(mrb, irep, bin); bin += write_pool_block(mrb, irep, bin); bin += write_syms_block(mrb, irep, bin); @@ -393,6 +364,7 @@ write_section_irep(mrb_state *mrb, const mrb_irep *irep, uint8_t *bin, size_t *l if (result != MRB_DUMP_OK) { return result; } + mrb_assert(rsize == get_irep_record_size(mrb, irep)); *len_p = cur - bin + rsize; write_section_irep_header(mrb, *len_p, bin); |
