From b6a98140d57e7e298046dae1f0f09b068c423e57 Mon Sep 17 00:00:00 2001 From: yugui Date: Sat, 8 Aug 2009 10:52:38 +0000 Subject: [PATCH] merges r24243 from trunk into ruby_1_9_1. -- * vm_core.h (struct rb_iseq_t): add a new field line_no. This field represents line number from which the original code of the iseq starts. [ruby-dev:38698] * iseq.c, compile.c: ditto. * parse.y: line number hack (for Proc#source_location) is no longer needed. * test/ruby/test_settracefunc.rb: line number of set_trace_func is now compatible with 1.8's. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@24446 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 14 +++++++++++ compile.c | 43 +++++++++++++++----------------- iseq.c | 45 +++++++++++++++++++--------------- parse.y | 4 --- test/ruby/test_settracefunc.rb | 6 ++--- version.h | 2 +- vm_core.h | 5 ++-- 7 files changed, 66 insertions(+), 53 deletions(-) diff --git a/ChangeLog b/ChangeLog index db63f3f764..0c4cf4377e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Wed Jul 22 22:23:24 2009 Yusuke Endoh + + * vm_core.h (struct rb_iseq_t): add a new field line_no. This field + represents line number from which the original code of the iseq + starts. [ruby-dev:38698] + + * iseq.c, compile.c: ditto. + + * parse.y: line number hack (for Proc#source_location) is no longer + needed. + + * test/ruby/test_settracefunc.rb: line number of set_trace_func is now + compatible with 1.8's. + Wed Jul 22 02:33:57 2009 Keiju Ishitsuka * lib/irb.rb: forget svn commit. diff --git a/compile.c b/compile.c index 8a68c5e9b4..49dae66abd 100644 --- a/compile.c +++ b/compile.c @@ -166,14 +166,11 @@ PRINTF_ARGS(void ruby_debug_printf(const char*, ...), 1, 2); #define iseq_filename(iseq) \ (((rb_iseq_t*)DATA_PTR(iseq))->filename) -#define NEW_ISEQVAL(node, name, type) \ - new_child_iseq(iseq, node, name, 0, type) +#define NEW_ISEQVAL(node, name, type, line_no) \ + new_child_iseq(iseq, node, name, 0, type, line_no) -#define NEW_CHILD_ISEQVAL(node, name, type) \ - new_child_iseq(iseq, node, name, iseq->self, type) - -#define NEW_SPECIAQL_BLOCK_ISEQVAL(iseq, sym) \ - new_child_iseq(iseq, iseq->node, iseq->name, iseq->parent_iseq, iseq->type, sym) +#define NEW_CHILD_ISEQVAL(node, name, type, line_no) \ + new_child_iseq(iseq, node, name, iseq->self, type, line_no) /* add instructions */ #define ADD_SEQ(seq1, seq2) \ @@ -447,13 +444,13 @@ rb_iseq_compile_node(VALUE self, NODE *node) break; } case ISEQ_TYPE_CLASS: { - ADD_TRACE(ret, nd_line(node), RUBY_EVENT_CLASS); + ADD_TRACE(ret, FIX2INT(iseq->line_no), RUBY_EVENT_CLASS); COMPILE(ret, "scoped node", node->nd_body); ADD_TRACE(ret, nd_line(node), RUBY_EVENT_END); break; } case ISEQ_TYPE_METHOD: { - ADD_TRACE(ret, nd_line(node), RUBY_EVENT_CALL); + ADD_TRACE(ret, FIX2INT(iseq->line_no), RUBY_EVENT_CALL); COMPILE(ret, "scoped node", node->nd_body); ADD_TRACE(ret, nd_line(node), RUBY_EVENT_RETURN); break; @@ -910,12 +907,12 @@ new_insn_send(rb_iseq_t *iseq, int line_no, static VALUE new_child_iseq(rb_iseq_t *iseq, NODE *node, - VALUE name, VALUE parent, VALUE type) + VALUE name, VALUE parent, VALUE type, int line_no) { VALUE ret; debugs("[new_child_iseq]> ---------------------------------------\n"); - ret = rb_iseq_new_with_opt(node, name, iseq_filename(iseq->self), + ret = rb_iseq_new_with_opt(node, name, iseq_filename(iseq->self), INT2FIX(line_no), parent, type, iseq->compile_data->option); debugs("[new_child_iseq]< ---------------------------------------\n"); iseq_add_mark_object(iseq, ret); @@ -2683,7 +2680,7 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret, rb_str_concat(rb_str_new2 ("defined guard in "), iseq->name), - ISEQ_TYPE_DEFINED_GUARD); + ISEQ_TYPE_DEFINED_GUARD, 0); defined_expr(iseq, ret, node->nd_recv, lfinish, Qfalse); ADD_INSNL(ret, nd_line(node), branchunless, lfinish[1]); @@ -3261,7 +3258,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) iseq->compile_data->current_block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), - ISEQ_TYPE_BLOCK); + ISEQ_TYPE_BLOCK, nd_line(node)); mid = idEach; ADD_SEND_R(ret, nd_line(node), ID2SYM(idEach), INT2FIX(0), @@ -3270,7 +3267,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) else { iseq->compile_data->current_block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), - ISEQ_TYPE_BLOCK); + ISEQ_TYPE_BLOCK, nd_line(node)); COMPILE(ret, "iter caller", node->nd_iter); } ADD_LABEL(ret, retry_end_l); @@ -3504,7 +3501,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) VALUE rescue = NEW_CHILD_ISEQVAL( node->nd_resq, rb_str_concat(rb_str_new2("rescue in "), iseq->name), - ISEQ_TYPE_RESCUE); + ISEQ_TYPE_RESCUE, nd_line(node)); ADD_LABEL(ret, lstart); COMPILE(ret, "rescue head", node->nd_head); @@ -3586,7 +3583,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) rb_str_concat(rb_str_new2 ("ensure in "), iseq->name), - ISEQ_TYPE_ENSURE); + ISEQ_TYPE_ENSURE, nd_line(node)); LABEL *lstart = NEW_LABEL(nd_line(node)); LABEL *lend = NEW_LABEL(nd_line(node)); LABEL *lcont = NEW_LABEL(nd_line(node)); @@ -4500,7 +4497,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) case NODE_DEFN:{ VALUE iseqval = NEW_ISEQVAL(node->nd_defn, rb_str_dup(rb_id2str(node->nd_mid)), - ISEQ_TYPE_METHOD); + ISEQ_TYPE_METHOD, nd_line(node)); debugp_param("defn/iseq", iseqval); @@ -4520,7 +4517,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) case NODE_DEFS:{ VALUE iseqval = NEW_ISEQVAL(node->nd_defn, rb_str_dup(rb_id2str(node->nd_mid)), - ISEQ_TYPE_METHOD); + ISEQ_TYPE_METHOD, nd_line(node)); debugp_param("defs/iseq", iseqval); @@ -4574,7 +4571,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) NEW_CHILD_ISEQVAL( node->nd_body, rb_sprintf("", rb_id2name(node->nd_cpath->nd_mid)), - ISEQ_TYPE_CLASS); + ISEQ_TYPE_CLASS, nd_line(node)); compile_cpath(ret, iseq, node->nd_cpath); COMPILE(ret, "super", node->nd_super); ADD_INSN3(ret, nd_line(node), defineclass, @@ -4589,7 +4586,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) VALUE iseqval = NEW_CHILD_ISEQVAL( node->nd_body, rb_sprintf("", rb_id2name(node->nd_cpath->nd_mid)), - ISEQ_TYPE_CLASS); + ISEQ_TYPE_CLASS, nd_line(node)); compile_cpath(ret, iseq, node->nd_cpath); ADD_INSN (ret, nd_line(node), putnil); /* dummy */ @@ -4604,7 +4601,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) ID singletonclass; VALUE iseqval = NEW_ISEQVAL(node->nd_body, rb_str_new2("singletonclass"), - ISEQ_TYPE_CLASS); + ISEQ_TYPE_CLASS, nd_line(node)); COMPILE(ret, "sclass#recv", node->nd_recv); ADD_INSN (ret, nd_line(node), putnil); @@ -4806,7 +4803,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) case NODE_POSTEXE:{ LABEL *lstart = NEW_LABEL(nd_line(node)); LABEL *lend = NEW_LABEL(nd_line(node)); - VALUE block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK); + VALUE block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, nd_line(node)); ADD_LABEL(ret, lstart); ADD_INSN2(ret, nd_line(node), onceinlinecache, 0, lend); @@ -4899,7 +4896,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) } case NODE_LAMBDA:{ /* compile same as lambda{...} */ - VALUE block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK); + VALUE block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, nd_line(node)); VALUE argc = INT2FIX(0); ADD_CALL_RECEIVER(ret, nd_line(node)); ADD_CALL_WITH_BLOCK(ret, nd_line(node), ID2SYM(idLambda), argc, block); diff --git a/iseq.c b/iseq.c index 69cdd7fe1d..159da22ed5 100644 --- a/iseq.c +++ b/iseq.c @@ -148,7 +148,7 @@ set_relation(rb_iseq_t *iseq, const VALUE parent) static VALUE prepare_iseq_build(rb_iseq_t *iseq, - VALUE name, VALUE filename, + VALUE name, VALUE filename, VALUE line_no, VALUE parent, VALUE type, VALUE block_opt, const rb_compile_option_t *option) { @@ -157,6 +157,7 @@ prepare_iseq_build(rb_iseq_t *iseq, iseq->name = name; iseq->filename = filename; + iseq->line_no = line_no; iseq->defined_method_id = 0; iseq->mark_ary = rb_ary_new(); RBASIC(iseq->mark_ary)->klass = 0; @@ -301,14 +302,14 @@ VALUE rb_iseq_new(NODE *node, VALUE name, VALUE filename, VALUE parent, VALUE type) { - return rb_iseq_new_with_opt(node, name, filename, parent, type, + return rb_iseq_new_with_opt(node, name, filename, INT2FIX(0), parent, type, &COMPILE_OPTION_DEFAULT); } VALUE rb_iseq_new_top(NODE *node, VALUE name, VALUE filename, VALUE parent) { - return rb_iseq_new_with_opt(node, name, filename, parent, ISEQ_TYPE_TOP, + return rb_iseq_new_with_opt(node, name, filename, INT2FIX(0), parent, ISEQ_TYPE_TOP, &COMPILE_OPTION_DEFAULT); } @@ -317,12 +318,12 @@ rb_iseq_new_main(NODE *node, VALUE filename) { rb_thread_t *th = GET_THREAD(); VALUE parent = th->base_block->iseq->self; - return rb_iseq_new_with_opt(node, rb_str_new2("
"), filename, + return rb_iseq_new_with_opt(node, rb_str_new2("
"), filename, INT2FIX(0), parent, ISEQ_TYPE_MAIN, &COMPILE_OPTION_DEFAULT); } static VALUE -rb_iseq_new_with_bopt_and_opt(NODE *node, VALUE name, VALUE filename, +rb_iseq_new_with_bopt_and_opt(NODE *node, VALUE name, VALUE filename, VALUE line_no, VALUE parent, VALUE type, VALUE bopt, const rb_compile_option_t *option) { @@ -332,26 +333,26 @@ rb_iseq_new_with_bopt_and_opt(NODE *node, VALUE name, VALUE filename, GetISeqPtr(self, iseq); iseq->self = self; - prepare_iseq_build(iseq, name, filename, parent, type, bopt, option); + prepare_iseq_build(iseq, name, filename, line_no, parent, type, bopt, option); rb_iseq_compile_node(self, node); cleanup_iseq_build(iseq); return self; } VALUE -rb_iseq_new_with_opt(NODE *node, VALUE name, VALUE filename, +rb_iseq_new_with_opt(NODE *node, VALUE name, VALUE filename, VALUE line_no, VALUE parent, VALUE type, const rb_compile_option_t *option) { - return rb_iseq_new_with_bopt_and_opt(node, name, filename, parent, type, - Qfalse, option); + return rb_iseq_new_with_bopt_and_opt(node, name, filename, line_no, parent, type, + Qfalse, option); } VALUE -rb_iseq_new_with_bopt(NODE *node, VALUE name, VALUE filename, +rb_iseq_new_with_bopt(NODE *node, VALUE name, VALUE filename, VALUE line_no, VALUE parent, VALUE type, VALUE bopt) { - return rb_iseq_new_with_bopt_and_opt(node, name, filename, parent, type, + return rb_iseq_new_with_bopt_and_opt(node, name, filename, line_no, parent, type, bopt, &COMPILE_OPTION_DEFAULT); } @@ -365,7 +366,7 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt) VALUE iseqval = iseq_alloc(self); VALUE magic, version1, version2, format_type, misc; - VALUE name, filename; + VALUE name, filename, line_no; VALUE type, body, locals, args, exception; VALUE iseq_type; @@ -375,7 +376,7 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt) int i = 0; /* [magic, major_version, minor_version, format_type, misc, - * name, filename, + * name, filename, line_no, * type, locals, args, exception_table, body] */ @@ -389,6 +390,7 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt) name = CHECK_STRING(rb_ary_entry(data, i++)); filename = CHECK_STRING(rb_ary_entry(data, i++)); + line_no = CHECK_INTEGER(rb_ary_entry(data, i++)); type = CHECK_SYMBOL(rb_ary_entry(data, i++)); locals = CHECK_ARRAY(rb_ary_entry(data, i++)); @@ -430,7 +432,7 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt) } make_compile_option(&option, opt); - prepare_iseq_build(iseq, name, filename, + prepare_iseq_build(iseq, name, filename, line_no, parent, iseq_type, 0, &option); rb_iseq_build_from_ary(iseq, locals, args, exception, body); @@ -477,11 +479,11 @@ rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE line, VALUE opt) if (th->base_block && th->base_block->iseq) { return rb_iseq_new_with_opt(node, th->base_block->iseq->name, - file, th->base_block->iseq->self, + file, line, th->base_block->iseq->self, ISEQ_TYPE_EVAL, &option); } else { - return rb_iseq_new_with_opt(node, rb_str_new2(""), file, Qfalse, + return rb_iseq_new_with_opt(node, rb_str_new2(""), file, line, Qfalse, ISEQ_TYPE_TOP, &option); } } @@ -526,7 +528,7 @@ iseq_s_compile_file(int argc, VALUE *argv, VALUE self) parser = rb_parser_new(); node = rb_parser_compile_file(parser, fname, f, NUM2INT(line)); make_compile_option(&option, opt); - return rb_iseq_new_with_opt(node, rb_str_new2("
"), file, Qfalse, + return rb_iseq_new_with_opt(node, rb_str_new2("
"), file, line, Qfalse, ISEQ_TYPE_TOP, &option); } @@ -592,7 +594,7 @@ iseq_to_a(VALUE self) int rb_iseq_first_lineno(rb_iseq_t *iseq) { - return iseq->insn_info_table[0].line_no; + return FIX2INT(iseq->line_no); } /* TODO: search algorithm is brute force. @@ -1243,7 +1245,7 @@ iseq_data_to_ary(rb_iseq_t *iseq) /* * [:magic, :major_version, :minor_version, :format_type, :misc, - * :name, :filename, :type, :locals, :args, + * :name, :filename, :line_no, :type, :locals, :args, * :catch_table, :bytecode] */ rb_ary_push(val, rb_str_new2("YARVInstructionSequence/SimpleDataFormat")); @@ -1253,6 +1255,7 @@ iseq_data_to_ary(rb_iseq_t *iseq) rb_ary_push(val, misc); rb_ary_push(val, iseq->name); rb_ary_push(val, iseq->filename); + rb_ary_push(val, iseq->line_no); rb_ary_push(val, type); rb_ary_push(val, locals); rb_ary_push(val, args); @@ -1296,7 +1299,8 @@ rb_iseq_build_for_ruby2cext( const VALUE *arg_opt_table, const struct iseq_catch_table_entry *catch_table, const char *name, - const char *filename) + const char *filename, + const unsigned short line_no) { int i; VALUE iseqval = iseq_alloc(rb_cISeq); @@ -1308,6 +1312,7 @@ rb_iseq_build_for_ruby2cext( iseq->name = rb_str_new2(name); iseq->filename = rb_str_new2(filename); iseq->mark_ary = rb_ary_new(); + iseq->line_no = line_no; iseq->self = iseqval; iseq->iseq = ALLOC_N(VALUE, iseq->iseq_size); diff --git a/parse.y b/parse.y index 44a5e09129..84314c816c 100644 --- a/parse.y +++ b/parse.y @@ -2941,7 +2941,6 @@ primary : literal reduce_nodes(&body); $$ = NEW_DEFN($2, $4, body, NOEX_PRIVATE); fixpos($$, $4); - fixpos($$->nd_defn, $4); local_pop(); /*% $$ = dispatch3(def, $2, $4, $5); @@ -2967,7 +2966,6 @@ primary : literal reduce_nodes(&body); $$ = NEW_DEFS($2, $5, $7, body); fixpos($$, $2); - fixpos($$->nd_defn, $2); local_pop(); /*% $$ = dispatch5(defs, $2, $3, $5, $7, $8); @@ -3670,8 +3668,6 @@ brace_block : '{' /*%%%*/ $$ = NEW_ITER($3,$4); nd_set_line($$, $2); - nd_set_line($$->nd_body, $2); - nd_set_line($$->nd_body->nd_body, $2); dyna_pop(); /*% $$ = dispatch2(brace_block, escape_Qundef($3), $4); diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb index 5898ce488d..8e06c3b515 100644 --- a/test/ruby/test_settracefunc.rb +++ b/test/ruby/test_settracefunc.rb @@ -68,7 +68,7 @@ class TestSetTraceFunc < Test::Unit::TestCase events.shift) assert_equal(["c-return", 5, :+, Fixnum], events.shift) - assert_equal(["return", 4, :add, self.class], + assert_equal(["return", 6, :add, self.class], events.shift) assert_equal(["line", 8, __method__, self.class], events.shift) @@ -98,7 +98,7 @@ class TestSetTraceFunc < Test::Unit::TestCase events.shift) assert_equal(["c-return", 4, :inherited, Class], events.shift) - assert_equal(["class", 7, nil, nil], + assert_equal(["class", 4, nil, nil], events.shift) assert_equal(["line", 5, nil, nil], events.shift) @@ -120,7 +120,7 @@ class TestSetTraceFunc < Test::Unit::TestCase events.shift) assert_equal(["call", 5, :bar, Foo], events.shift) - assert_equal(["return", 5, :bar, Foo], + assert_equal(["return", 6, :bar, Foo], events.shift) assert_equal(["line", 9, __method__, self.class], events.shift) diff --git a/version.h b/version.h index 49df7857a6..7b197de22d 100644 --- a/version.h +++ b/version.h @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.1" -#define RUBY_PATCHLEVEL 252 +#define RUBY_PATCHLEVEL 253 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 1 diff --git a/vm_core.h b/vm_core.h index b7a8aa93f5..167c300d38 100644 --- a/vm_core.h +++ b/vm_core.h @@ -132,6 +132,7 @@ struct rb_iseq_struct { unsigned long iseq_size; VALUE mark_ary; /* Array: includes operands which should be GC marked */ VALUE coverage; /* coverage array */ + unsigned short line_no; /* insn info, must be freed */ struct iseq_insn_info_entry *insn_info_table; @@ -433,8 +434,8 @@ typedef struct rb_thread_struct VALUE rb_iseq_new(NODE*, VALUE, VALUE, VALUE, VALUE); VALUE rb_iseq_new_top(NODE *node, VALUE name, VALUE filename, VALUE parent); VALUE rb_iseq_new_main(NODE *node, VALUE filename); -VALUE rb_iseq_new_with_bopt(NODE*, VALUE, VALUE, VALUE, VALUE, VALUE); -VALUE rb_iseq_new_with_opt(NODE*, VALUE, VALUE, VALUE, VALUE, const rb_compile_option_t*); +VALUE rb_iseq_new_with_bopt(NODE*, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE); +VALUE rb_iseq_new_with_opt(NODE*, VALUE, VALUE, VALUE, VALUE, VALUE, const rb_compile_option_t*); VALUE rb_iseq_compile(VALUE src, VALUE file, VALUE line); VALUE rb_iseq_disasm(VALUE self); VALUE rb_iseq_disasm_insn(VALUE str, VALUE *iseqval, int pos, rb_iseq_t *iseq, VALUE child);