diff options
| author | take_cheeze <[email protected]> | 2014-05-15 15:08:30 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-05-15 15:08:30 +0900 |
| commit | 30e0dc79566430a176dd2cfab593cd3620ba69da (patch) | |
| tree | a62536a241ebdb3c674d590cc47aca827eca9900 /src/dump.c | |
| parent | c2f77c7836e4310b57aa8bc510488762ceca382f (diff) | |
| download | mruby-30e0dc79566430a176dd2cfab593cd3620ba69da.tar.gz mruby-30e0dc79566430a176dd2cfab593cd3620ba69da.zip | |
Support `LVAR` section removing.
Diffstat (limited to 'src/dump.c')
| -rw-r--r-- | src/dump.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/src/dump.c b/src/dump.c index d0e230f1f..3d55302e6 100644 --- a/src/dump.c +++ b/src/dump.c @@ -860,6 +860,20 @@ is_debug_info_defined(mrb_irep *irep) return TRUE; } +static mrb_bool +is_lv_defined(mrb_irep *irep) +{ + size_t i; + + if (irep->lv) { return TRUE; } + + for (i = 0; i < irep->rlen; ++i) { + if (is_lv_defined(irep->reps[i])) { return TRUE; } + } + + return FALSE; +} + int mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size) { @@ -867,7 +881,7 @@ mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, siz size_t section_irep_size; size_t section_lineno_size = 0, section_lv_size = 0; uint8_t *cur = NULL; - mrb_bool const debug_info_defined = is_debug_info_defined(irep); + mrb_bool const debug_info_defined = is_debug_info_defined(irep), lv_defined = is_lv_defined(irep); mrb_sym *lv_syms = NULL; uint32_t lv_syms_len = 0; if (mrb == NULL) { @@ -900,9 +914,11 @@ mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, siz } } - section_lv_size += sizeof(struct rite_section_lv_header); - create_lv_sym_table(mrb, irep, &lv_syms, &lv_syms_len); - section_lv_size += get_lv_section_size(mrb, irep, lv_syms, lv_syms_len); + if (lv_defined) { + section_lv_size += sizeof(struct rite_section_lv_header); + create_lv_sym_table(mrb, irep, &lv_syms, &lv_syms_len); + section_lv_size += get_lv_section_size(mrb, irep, lv_syms, lv_syms_len); + } *bin_size = sizeof(struct rite_binary_header) + section_irep_size + section_lineno_size + section_lv_size + @@ -933,11 +949,13 @@ mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, siz cur += section_lineno_size; } - result = write_section_lv(mrb, irep, cur, lv_syms, lv_syms_len); - if (result != MRB_DUMP_OK) { - goto error_exit; + if (lv_defined) { + result = write_section_lv(mrb, irep, cur, lv_syms, lv_syms_len); + if (result != MRB_DUMP_OK) { + goto error_exit; + } + cur += section_lv_size; } - cur += section_lv_size; write_footer(mrb, cur); write_rite_binary_header(mrb, *bin_size, *bin); |
