diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-10 08:26:44 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-10 08:26:44 +0000 |
commit | 54b8b8e4f7da17d05242cabdfe431e4951844426 (patch) | |
tree | 1b9b68e9f0aab71e3e2ca5f7ac462b19386844ae /iseq.c | |
parent | 9b41c2af6d609268f2a65519e46d095ba19b85c3 (diff) | |
download | ruby-54b8b8e4f7da17d05242cabdfe431e4951844426.tar.gz |
iseq.c: disasm only once for each iseq
* iseq.c (rb_iseq_disasm): do not dump repeatedly same iseq which
has been dumped by catch tables.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60735 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'iseq.c')
-rw-r--r-- | iseq.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -1532,6 +1532,7 @@ rb_iseq_disasm(const rb_iseq_t *iseq) const ID *tbl; size_t n; enum {header_minlen = 72}; + st_table *done_iseq = 0; rb_secure(1); @@ -1557,8 +1558,10 @@ rb_iseq_disasm(const rb_iseq_t *iseq) "| catch type: %-6s st: %04d ed: %04d sp: %04d cont: %04d\n", catch_type((int)entry->type), (int)entry->start, (int)entry->end, (int)entry->sp, (int)entry->cont); - if (entry->iseq) { + if (entry->iseq && !(done_iseq && st_is_member(done_iseq, (st_data_t)entry->iseq))) { rb_str_concat(str, rb_iseq_disasm(rb_iseq_check(entry->iseq))); + if (!done_iseq) done_iseq = st_init_numtable(); + st_insert(done_iseq, (st_data_t)entry->iseq, (st_data_t)0); } } } @@ -1627,8 +1630,10 @@ rb_iseq_disasm(const rb_iseq_t *iseq) for (l = 0; l < RARRAY_LEN(child); l++) { VALUE isv = rb_ary_entry(child, l); + if (done_iseq && st_is_member(done_iseq, (st_data_t)isv)) continue; rb_str_concat(str, rb_iseq_disasm(rb_iseq_check((rb_iseq_t *)isv))); } + if (done_iseq) st_free_table(done_iseq); return str; } |