diff options
Diffstat (limited to 'src/debug.c')
| -rw-r--r-- | src/debug.c | 86 |
1 files changed, 47 insertions, 39 deletions
diff --git a/src/debug.c b/src/debug.c index 95e5906d4..98b3338ff 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,21 +1,21 @@ -#include "mruby/debug.h" - +#include <string.h> #include "mruby.h" #include "mruby/irep.h" +#include "mruby/debug.h" -#include <string.h> - -static mrb_irep_debug_info_file* -get_file(mrb_irep_debug_info* info, uint32_t const pc) +static mrb_irep_debug_info_file * +get_file(mrb_irep_debug_info *info, uint32_t pc) { - if(pc >= info->pc_count) { return NULL; } + mrb_irep_debug_info_file **ret; + int32_t count; + if(pc >= info->pc_count) { return NULL; } // get upper bound - mrb_irep_debug_info_file** ret = info->files; - int32_t count = info->flen; + ret = info->files; + count = info->flen; while (count > 0) { - int32_t const step = count / 2; - mrb_irep_debug_info_file** const it = ret + step; + int32_t step = count / 2; + mrb_irep_debug_info_file **it = ret + step; if (!(pc < (*it)->start_pos)) { ret = it + 1; count -= step + 1; @@ -33,7 +33,7 @@ get_file(mrb_irep_debug_info* info, uint32_t const pc) } static mrb_debug_line_type -select_line_type(uint16_t const* lines, size_t lines_len) +select_line_type(const uint16_t *lines, size_t lines_len) { size_t line_count = 0; int prev_line = -1; @@ -48,7 +48,7 @@ select_line_type(uint16_t const* lines, size_t lines_len) } char const* -mrb_debug_get_filename(mrb_irep* irep, uint32_t pc) +mrb_debug_get_filename(mrb_irep *irep, uint32_t pc) { if (irep && pc < irep->ilen) { mrb_irep_debug_info_file* f = NULL; @@ -61,7 +61,7 @@ mrb_debug_get_filename(mrb_irep* irep, uint32_t pc) } int32_t -mrb_debug_get_line(mrb_irep* irep, uint32_t const pc) +mrb_debug_get_line(mrb_irep *irep, uint32_t pc) { if (irep && pc < irep->ilen) { mrb_irep_debug_info_file* f = NULL; @@ -76,11 +76,11 @@ mrb_debug_get_line(mrb_irep* irep, uint32_t const pc) case mrb_debug_line_flat_map: { // get upper bound - mrb_irep_debug_info_line* ret = f->line_flat_map; - int32_t count = f->line_entry_count; + mrb_irep_debug_info_line *ret = f->line_flat_map; + uint32_t count = f->line_entry_count; while (count > 0) { - int32_t const step = count / 2; - mrb_irep_debug_info_line* const it = ret + step; + int32_t step = count / 2; + mrb_irep_debug_info_line *it = ret + step; if (!(pc < it->start_pos)) { ret = it + 1; count -= step + 1; @@ -89,7 +89,7 @@ mrb_debug_get_line(mrb_irep* irep, uint32_t const pc) --ret; - mrb_assert((ret - f->line_flat_map) < f->line_entry_count); + mrb_assert((ret - f->line_flat_map) < (ptrdiff_t)f->line_entry_count); mrb_assert(ret->start_pos <= pc && pc < (((ret + 1 - f->line_flat_map) < f->line_entry_count) ? (ret+1)->start_pos : irep->debug_info->pc_count)); @@ -102,49 +102,56 @@ mrb_debug_get_line(mrb_irep* irep, uint32_t const pc) return -1; } -mrb_irep_debug_info* -mrb_debug_info_alloc(mrb_state* mrb, mrb_irep* irep) +mrb_irep_debug_info * +mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep) { - static mrb_irep_debug_info const initial = { 0, 0, NULL }; - mrb_assert(!irep->debug_info); + static const mrb_irep_debug_info initial = { 0, 0, NULL }; + mrb_irep_debug_info *ret; - mrb_irep_debug_info* const ret = (mrb_irep_debug_info*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info)); + mrb_assert(!irep->debug_info); + ret = (mrb_irep_debug_info *)mrb_malloc(mrb, sizeof(*ret)); *ret = initial; irep->debug_info = ret; return ret; } -mrb_irep_debug_info_file* -mrb_debug_info_append_file(mrb_state* mrb, mrb_irep* irep, - uint32_t const start_pos, uint32_t const end_pos) +mrb_irep_debug_info_file * +mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep, + uint32_t start_pos, uint32_t end_pos) { + mrb_irep_debug_info *info; + mrb_irep_debug_info_file *ret; + uint32_t file_pc_count; + size_t fn_len; + size_t len; + uint32_t i; + if (!irep->debug_info) { return NULL; } mrb_assert(irep->filename); mrb_assert(irep->lines); - mrb_irep_debug_info* info = irep->debug_info; + info = irep->debug_info; if (info->flen > 0 && strcmp(irep->filename, info->files[info->flen - 1]->filename) == 0) { return NULL; } - mrb_irep_debug_info_file* const ret = - (mrb_irep_debug_info_file*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info_file)); + ret = (mrb_irep_debug_info_file *)mrb_malloc(mrb, sizeof(*ret)); info->files = (mrb_irep_debug_info_file*)info->files ? mrb_realloc(mrb, info->files, sizeof(mrb_irep_debug_info_file*) * (info->flen + 1)) : mrb_malloc(mrb, sizeof(mrb_irep_debug_info_file*)); info->files[info->flen++] = ret; - uint32_t const file_pc_count = end_pos - start_pos; + file_pc_count = end_pos - start_pos; ret->start_pos = start_pos; info->pc_count = end_pos; - size_t const fn_len = strlen(irep->filename); + fn_len = strlen(irep->filename); ret->filename_sym = mrb_intern2(mrb, irep->filename, fn_len); - size_t len = 0; + len = 0; ret->filename = mrb_sym2name_len(mrb, ret->filename_sym, &len); ret->line_type = select_line_type(irep->lines + start_pos, end_pos - start_pos); @@ -154,24 +161,24 @@ mrb_debug_info_append_file(mrb_state* mrb, mrb_irep* irep, case mrb_debug_line_ary: ret->line_entry_count = file_pc_count; ret->line_ary = mrb_malloc(mrb, sizeof(uint16_t) * file_pc_count); - uint32_t i; for(i = 0; i < file_pc_count; ++i) { ret->line_ary[i] = irep->lines[start_pos + i]; } break; case mrb_debug_line_flat_map: { + uint16_t prev_line = 0; + mrb_irep_debug_info_line m; ret->line_flat_map = mrb_malloc(mrb, sizeof(mrb_irep_debug_info_line) * 1); ret->line_entry_count = 0; - uint16_t prev_line = 0; - uint32_t i; for(i = 0; i < file_pc_count; ++i) { if(irep->lines[start_pos + i] == prev_line) { continue; } ret->line_flat_map = mrb_realloc( mrb, ret->line_flat_map, sizeof(mrb_irep_debug_info_line) * (ret->line_entry_count + 1)); - mrb_irep_debug_info_line const m = { start_pos + i, irep->lines[start_pos + i] }; + m.start_pos = start_pos + i; + m.line = irep->lines[start_pos + i]; ret->line_flat_map[ret->line_entry_count] = m; // update @@ -187,11 +194,12 @@ mrb_debug_info_append_file(mrb_state* mrb, mrb_irep* irep, } void -mrb_debug_info_free(mrb_state* mrb, mrb_irep_debug_info* d) +mrb_debug_info_free(mrb_state *mrb, mrb_irep_debug_info *d) { + uint32_t i; + if(!d) { return; } - uint32_t i; for(i = 0; i < d->flen; ++i) { mrb_assert(d->files[i]); mrb_free(mrb, d->files[i]->line_ptr); |
