summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--compile.c19
-rw-r--r--test/ruby/test_settracefunc.rb33
3 files changed, 45 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 3b7f7003fa..9e2a4f3a14 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Thu Nov 27 19:59:49 2014 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_compile_each): remove duplicated line event.
+ [Bug #10449]
+
+ * test/ruby/test_settracefunc.rb: add and fix tests.
+
Thu Nov 27 19:04:50 2014 Koichi Sasada <ko1@atdot.net>
* vm_args.c: fix backtrace location for keyword related exceptions.
diff --git a/compile.c b/compile.c
index 6b3f49ad2f..b505fbe0d4 100644
--- a/compile.c
+++ b/compile.c
@@ -3268,16 +3268,23 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
return COMPILE_OK;
}
- iseq->compile_data->last_line = line = (int)nd_line(node);
+ line = (int)nd_line(node);
+
+ if (iseq->compile_data->last_line == line) {
+ /* ignore */
+ }
+ else {
+ if (node->flags & NODE_FL_NEWLINE) {
+ iseq->compile_data->last_line = line;
+ ADD_TRACE(ret, line, RUBY_EVENT_LINE);
+ saved_last_element = ret->last;
+ }
+ }
+
debug_node_start(node);
type = nd_type(node);
- if (node->flags & NODE_FL_NEWLINE) {
- ADD_TRACE(ret, line, RUBY_EVENT_LINE);
- saved_last_element = ret->last;
- }
-
switch (type) {
case NODE_BLOCK:{
while (node && nd_type(node) == NODE_BLOCK) {
diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb
index 44a9edee11..637078ae6e 100644
--- a/test/ruby/test_settracefunc.rb
+++ b/test/ruby/test_settracefunc.rb
@@ -506,7 +506,6 @@ class TestSetTraceFunc < Test::Unit::TestCase
[:return, 16, "xyzzy", xyzzy.class, :bar, xyzzy, :XYZZY_bar, xyzzy],
[:return, 12, "xyzzy", xyzzy.class, :foo, xyzzy, :XYZZY_foo, xyzzy],
[:line, 20, "xyzzy", TestSetTraceFunc, method, self, :outer, :nothing],
- [:line, 20, "xyzzy", TestSetTraceFunc, method, self, :outer, :nothing],
[:c_call, 20, "xyzzy", Kernel, :raise, self, :outer, :nothing],
[:c_call, 20, "xyzzy", Exception, :exception, RuntimeError, :outer, :nothing],
[:c_call, 20, "xyzzy", Exception, :initialize, raised_exc, :outer, :nothing],
@@ -562,14 +561,18 @@ class TestSetTraceFunc < Test::Unit::TestCase
def test_tracepoint
events1, answer_events = *trace_by_tracepoint(:line, :class, :end, :call, :return, :c_call, :c_return, :raise)
- mesg = events1.map{|e|
- if false
- p [:event, e[0]]
- p [:line_file, e[1], e[2]]
- p [:id, e[4]]
+ ms = [events1, answer_events].map{|evs|
+ evs.map{|e|
+ "#{e[0]} - #{e[2]}:#{e[1]} id: #{e[4]}"
+ }
+ }
+
+ mesg = ms[0].zip(ms[1]).map{|a, b|
+ if a != b
+ "#{a} <-> #{b}"
end
- "#{e[0]} - #{e[2]}:#{e[1]} id: #{e[4]}"
- }.join("\n")
+ }.compact.join("\n")
+
answer_events.zip(events1){|answer, event|
assert_equal answer, event, mesg
}
@@ -1294,4 +1297,18 @@ class TestSetTraceFunc < Test::Unit::TestCase
}
end
end
+
+ def test_no_duplicate_line_events
+ lines = []
+ dummy = []
+
+ TracePoint.new(:line){|tp|
+ next unless target_thread?
+ lines << tp.lineno
+ }.enable{
+ dummy << (1) + (2)
+ dummy << (1) + (2)
+ }
+ assert_equal [__LINE__ - 3, __LINE__ - 2], lines, 'Bug #10449'
+ end
end