* iseq.c (rb_iseq_line_trace_each): iterate `line' event only.

* test/ruby/test_iseq.rb: add a test for this change.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38133 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2012-12-01 20:07:58 +00:00
Родитель 921385a644
Коммит 5bdd03936c
3 изменённых файлов: 30 добавлений и 8 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Sun Dec 2 05:01:58 2012 Koichi Sasada <ko1@atdot.net>
* iseq.c (rb_iseq_line_trace_each): iterate `line' event only.
* test/ruby/test_iseq.rb: add a test for this change.
Sun Dec 2 02:46:04 2012 Koichi Sasada <ko1@atdot.net>
* vm_trace.c: add TracePoint#inspect.

6
iseq.c
Просмотреть файл

@ -1954,6 +1954,8 @@ rb_iseq_line_trace_each(VALUE iseqval, int (*func)(int line, rb_event_flag_t *ev
if (insn == BIN(trace)) {
rb_event_flag_t current_events = (VALUE)iseq->iseq[pos+1];
if (current_events & RUBY_EVENT_LINE) {
rb_event_flag_t events = current_events & RUBY_EVENT_SPECIFIED_LINE;
trace_num++;
@ -1962,7 +1964,9 @@ rb_iseq_line_trace_each(VALUE iseqval, int (*func)(int line, rb_event_flag_t *ev
/* printf("line: %d\n", line); */
cont = (*func)(line, &events, data);
if (current_events != events) {
iseq->iseq[pos+1] = iseq->iseq_encoded[pos+1] = (VALUE)(current_events | (events & RUBY_EVENT_SPECIFIED_LINE));
iseq->iseq[pos+1] = iseq->iseq_encoded[pos+1] =
(VALUE)(current_events | (events & RUBY_EVENT_SPECIFIED_LINE));
}
}
}
}

Просмотреть файл

@ -26,6 +26,15 @@ class TestISeq < Test::Unit::TestCase
Encoding.default_internal = enc
end
LINE_BEFORE_METHOD = __LINE__
def method_test_line_trace
a = 1
b = 2
end
def test_line_trace
iseq = ISeq.compile \
%q{ a = 1
@ -48,6 +57,9 @@ class TestISeq < Test::Unit::TestCase
iseq.eval
}
assert_equal([2, 5], result)
iseq = ISeq.of(self.class.instance_method(:method_test_line_trace))
assert_equal([LINE_BEFORE_METHOD + 3, LINE_BEFORE_METHOD + 5], iseq.line_trace_all)
end
LINE_OF_HERE = __LINE__