diff options
| author | take_cheeze <[email protected]> | 2013-09-02 00:25:57 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2013-09-02 00:48:08 +0900 |
| commit | addb57f7e572db3cf9e2f68295f20321291501c6 (patch) | |
| tree | 5ff8a1f656cded62bda2e00ae7b0edede1fe252a /src/debug.c | |
| parent | 61e35988939e305f680c26cd1fa1c803e93d7caf (diff) | |
| download | mruby-addb57f7e572db3cf9e2f68295f20321291501c6.tar.gz mruby-addb57f7e572db3cf9e2f68295f20321291501c6.zip | |
better line type selector
Diffstat (limited to 'src/debug.c')
| -rw-r--r-- | src/debug.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/debug.c b/src/debug.c index b8982fc3e..28691ca1b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -33,9 +33,16 @@ get_file(mrb_irep_debug_info* info, uint32_t const pc) } static mrb_debug_line_type -select_line_type(uint32_t pc_count, uint16_t line_count) +select_line_type(uint16_t const* lines, size_t lines_len) { - return (sizeof(uint16_t) * pc_count) < (sizeof(mrb_irep_debug_info_line) * line_count) + size_t line_count = 0; + int prev_line = -1; + for (size_t i = 0; i < lines_len; ++i) { + if (lines[i] != prev_line) { + ++line_count; + } + } + return (sizeof(uint16_t) * lines_len) <= (sizeof(mrb_irep_debug_info_line) * line_count) ? mrb_debug_line_ary : mrb_debug_line_flat_map; } @@ -139,8 +146,7 @@ mrb_debug_info_append_file(mrb_state* mrb, mrb_irep* irep, size_t len = 0; ret->filename = mrb_sym2name_len(mrb, ret->filename_sym, &len); - ret->line_type = select_line_type( - file_pc_count, irep->lines[end_pos - 1] - irep->lines[0] + 1); + ret->line_type = select_line_type(irep->lines + start_pos, end_pos - start_pos); ret->line_ptr = NULL; switch(ret->line_type) { |
