mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	iseq.c: indent iseq dump
* iseq.c (rb_iseq_disasm): indent catch_table iseq entries. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63091 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									51d227e3a5
								
							
						
					
					
						commit
						c2007e191b
					
				
					 1 changed files with 33 additions and 8 deletions
				
			
		
							
								
								
									
										41
									
								
								iseq.c
									
										
									
									
									
								
							
							
						
						
									
										41
									
								
								iseq.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1926,8 +1926,8 @@ iseq_inspect(const rb_iseq_t *iseq)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VALUE
 | 
			
		||||
rb_iseq_disasm(const rb_iseq_t *iseq)
 | 
			
		||||
static VALUE
 | 
			
		||||
rb_iseq_disasm_recursive(const rb_iseq_t *iseq, VALUE indent)
 | 
			
		||||
{
 | 
			
		||||
    VALUE *code;
 | 
			
		||||
    VALUE str = rb_str_new(0, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -1938,46 +1938,61 @@ rb_iseq_disasm(const rb_iseq_t *iseq)
 | 
			
		|||
    size_t n;
 | 
			
		||||
    enum {header_minlen = 72};
 | 
			
		||||
    st_table *done_iseq = 0;
 | 
			
		||||
    const char *indent_str;
 | 
			
		||||
    long indent_len;
 | 
			
		||||
 | 
			
		||||
    rb_secure(1);
 | 
			
		||||
 | 
			
		||||
    size = iseq->body->iseq_size;
 | 
			
		||||
 | 
			
		||||
    indent_len = RSTRING_LEN(indent);
 | 
			
		||||
    indent_str = RSTRING_PTR(indent);
 | 
			
		||||
 | 
			
		||||
    rb_str_cat(str, indent_str, indent_len);
 | 
			
		||||
    rb_str_cat2(str, "== disasm: ");
 | 
			
		||||
 | 
			
		||||
    rb_str_concat(str, iseq_inspect(iseq));
 | 
			
		||||
    rb_str_append(str, iseq_inspect(iseq));
 | 
			
		||||
    rb_str_catf(str, " (catch: %s)", iseq->body->catch_except_p ? "TRUE" : "FALSE");
 | 
			
		||||
    if ((l = RSTRING_LEN(str)) < header_minlen) {
 | 
			
		||||
	rb_str_resize(str, header_minlen);
 | 
			
		||||
	memset(RSTRING_PTR(str) + l, '=', header_minlen - l);
 | 
			
		||||
    if ((l = RSTRING_LEN(str) - indent_len) < header_minlen) {
 | 
			
		||||
	rb_str_modify_expand(str, header_minlen - l);
 | 
			
		||||
	memset(RSTRING_END(str), '=', header_minlen - l);
 | 
			
		||||
    }
 | 
			
		||||
    rb_str_cat2(str, "\n");
 | 
			
		||||
 | 
			
		||||
    /* show catch table information */
 | 
			
		||||
    if (iseq->body->catch_table) {
 | 
			
		||||
	rb_str_cat(str, indent_str, indent_len);
 | 
			
		||||
	rb_str_cat2(str, "== catch table\n");
 | 
			
		||||
    }
 | 
			
		||||
    if (iseq->body->catch_table) {
 | 
			
		||||
	rb_str_cat_cstr(indent, "| ");
 | 
			
		||||
	indent_str = RSTRING_PTR(indent);
 | 
			
		||||
	for (i = 0; i < iseq->body->catch_table->size; i++) {
 | 
			
		||||
	    const struct iseq_catch_table_entry *entry = &iseq->body->catch_table->entries[i];
 | 
			
		||||
	    rb_str_cat(str, indent_str, indent_len);
 | 
			
		||||
	    rb_str_catf(str,
 | 
			
		||||
			"| 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 && !(done_iseq && st_is_member(done_iseq, (st_data_t)entry->iseq))) {
 | 
			
		||||
		rb_str_concat(str, rb_iseq_disasm(rb_iseq_check(entry->iseq)));
 | 
			
		||||
		rb_str_concat(str, rb_iseq_disasm_recursive(rb_iseq_check(entry->iseq), indent));
 | 
			
		||||
		if (!done_iseq) done_iseq = st_init_numtable();
 | 
			
		||||
		st_insert(done_iseq, (st_data_t)entry->iseq, (st_data_t)0);
 | 
			
		||||
		indent_str = RSTRING_PTR(indent);
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	rb_str_resize(indent, indent_len);
 | 
			
		||||
	indent_str = RSTRING_PTR(indent);
 | 
			
		||||
    }
 | 
			
		||||
    if (iseq->body->catch_table) {
 | 
			
		||||
	rb_str_cat(str, indent_str, indent_len);
 | 
			
		||||
	rb_str_cat2(str, "|-------------------------------------"
 | 
			
		||||
		    "-----------------------------------\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* show local table information */
 | 
			
		||||
    if (iseq->body->local_table) {
 | 
			
		||||
	rb_str_cat(str, indent_str, indent_len);
 | 
			
		||||
	rb_str_catf(str,
 | 
			
		||||
		    "local table (size: %d, argc: %d "
 | 
			
		||||
		    "[opts: %d, rest: %d, post: %d, block: %d, kw: %d@%d, kwrest: %d])\n",
 | 
			
		||||
| 
						 | 
				
			
			@ -2015,6 +2030,7 @@ rb_iseq_disasm(const rb_iseq_t *iseq)
 | 
			
		|||
		     (iseq->body->param.flags.has_kwrest && iseq->body->param.keyword->rest_start == li) ? "Kwrest" : "",
 | 
			
		||||
		     (iseq->body->param.flags.has_block && iseq->body->param.block_start == li) ? "Block" : "");
 | 
			
		||||
 | 
			
		||||
	    rb_str_cat(str, indent_str, indent_len);
 | 
			
		||||
	    rb_str_catf(str, "[%2d] ", i + 1);
 | 
			
		||||
	    width = RSTRING_LEN(str) + 11;
 | 
			
		||||
	    rb_str_append(str, name);
 | 
			
		||||
| 
						 | 
				
			
			@ -2027,19 +2043,28 @@ rb_iseq_disasm(const rb_iseq_t *iseq)
 | 
			
		|||
    /* show each line */
 | 
			
		||||
    code = rb_iseq_original_iseq(iseq);
 | 
			
		||||
    for (n = 0; n < size;) {
 | 
			
		||||
	rb_str_cat(str, indent_str, indent_len);
 | 
			
		||||
	n += rb_iseq_disasm_insn(str, code, n, iseq, child);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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)));
 | 
			
		||||
	rb_str_cat_cstr(str, "\n");
 | 
			
		||||
	rb_str_concat(str, rb_iseq_disasm_recursive(rb_iseq_check((rb_iseq_t *)isv), indent));
 | 
			
		||||
	indent_str = RSTRING_PTR(indent);
 | 
			
		||||
    }
 | 
			
		||||
    if (done_iseq) st_free_table(done_iseq);
 | 
			
		||||
 | 
			
		||||
    return str;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VALUE
 | 
			
		||||
rb_iseq_disasm(const rb_iseq_t *iseq)
 | 
			
		||||
{
 | 
			
		||||
    return rb_iseq_disasm_recursive(iseq, rb_str_new(0, 0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
rb_iseq_all_children(const rb_iseq_t *iseq)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue