From 30e0dc79566430a176dd2cfab593cd3620ba69da Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Thu, 15 May 2014 15:08:30 +0900 Subject: Support `LVAR` section removing. --- src/dump.c | 34 ++++++++++++++++++++++++++-------- src/etc.c | 16 ++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) (limited to 'src') 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); diff --git a/src/etc.c b/src/etc.c index 58b1c91c0..96ddca05b 100644 --- a/src/etc.c +++ b/src/etc.c @@ -9,6 +9,7 @@ #include "mruby/data.h" #include "mruby/class.h" #include "mruby/re.h" +#include "mruby/irep.h" struct RData* mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type) @@ -182,3 +183,18 @@ mrb_regexp_p(mrb_state *mrb, mrb_value v) { return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS)); } + +void +mrb_irep_remove_lv(mrb_state *mrb, mrb_irep *irep) +{ + size_t i; + + if (irep->lv) { + mrb_free(mrb, irep->lv); + irep->lv = NULL; + } + + for (i = 0; i < irep->rlen; ++i) { + mrb_irep_remove_lv(mrb, irep->reps[i]); + } +} -- cgit v1.2.3