mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* compile.c (iseq_compile_each): remove redundant trace(line)
instruction. for example, at the following script def m() p:xyzzy 1 2 end compiler ignores `1' because there is no effect. However, `trace(line)' instruction remains in bytecode. This modification removes such redundant trace(line) instruction. * test/ruby/test_iseq.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39539 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
338ec3cee7
commit
4cf0918e8e
3 changed files with 52 additions and 3 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
Thu Feb 28 22:57:48 2013 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* compile.c (iseq_compile_each): remove redundant trace(line)
|
||||||
|
instruction. for example, at the following script
|
||||||
|
def m()
|
||||||
|
p:xyzzy
|
||||||
|
1
|
||||||
|
2
|
||||||
|
end
|
||||||
|
compiler ignores `1' because there is no effect. However,
|
||||||
|
`trace(line)' instruction remains in bytecode.
|
||||||
|
This modification removes such redundant trace(line) instruction.
|
||||||
|
|
||||||
|
* test/ruby/test_iseq.rb: add a test.
|
||||||
|
|
||||||
Thu Feb 28 22:23:27 2013 Tanaka Akira <akr@fsij.org>
|
Thu Feb 28 22:23:27 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* ext/socket/raddrinfo.c (inspect_sockaddr): don't show that Unix
|
* ext/socket/raddrinfo.c (inspect_sockaddr): don't show that Unix
|
||||||
|
|
|
@ -3154,6 +3154,7 @@ static int
|
||||||
iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
|
iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
|
||||||
{
|
{
|
||||||
enum node_type type;
|
enum node_type type;
|
||||||
|
LINK_ELEMENT *saved_last_element = 0;
|
||||||
|
|
||||||
if (node == 0) {
|
if (node == 0) {
|
||||||
if (!poped) {
|
if (!poped) {
|
||||||
|
@ -3170,6 +3171,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
|
||||||
|
|
||||||
if (node->flags & NODE_FL_NEWLINE) {
|
if (node->flags & NODE_FL_NEWLINE) {
|
||||||
ADD_TRACE(ret, nd_line(node), RUBY_EVENT_LINE);
|
ADD_TRACE(ret, nd_line(node), RUBY_EVENT_LINE);
|
||||||
|
saved_last_element = ret->last;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -5295,6 +5297,13 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
|
||||||
return COMPILE_NG;
|
return COMPILE_NG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check & remove redundant trace(line) */
|
||||||
|
if (saved_last_element && ret /* ret can be 0 when error */ &&
|
||||||
|
ret->last == saved_last_element &&
|
||||||
|
((INSN *)saved_last_element)->insn_id == BIN(trace)) {
|
||||||
|
POP_ELEMENT(ret);
|
||||||
|
}
|
||||||
|
|
||||||
debug_node_end();
|
debug_node_end();
|
||||||
return COMPILE_OK;
|
return COMPILE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,11 @@ class TestISeq < Test::Unit::TestCase
|
||||||
assert_normal_exit('p RubyVM::InstructionSequence.compile("1", "mac", "", 0).to_a', bug5894)
|
assert_normal_exit('p RubyVM::InstructionSequence.compile("1", "mac", "", 0).to_a', bug5894)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def lines src
|
||||||
|
body = RubyVM::InstructionSequence.new(src).to_a[13]
|
||||||
|
lines = body.find_all{|e| e.kind_of? Fixnum}
|
||||||
|
end
|
||||||
|
|
||||||
def test_to_a_lines
|
def test_to_a_lines
|
||||||
src = <<-EOS
|
src = <<-EOS
|
||||||
p __LINE__ # 1
|
p __LINE__ # 1
|
||||||
|
@ -16,9 +21,29 @@ class TestISeq < Test::Unit::TestCase
|
||||||
# 3
|
# 3
|
||||||
p __LINE__ # 4
|
p __LINE__ # 4
|
||||||
EOS
|
EOS
|
||||||
body = RubyVM::InstructionSequence.new(src).to_a[13]
|
assert_equal [1, 2, 4], lines(src)
|
||||||
lines = body.find_all{|e| e.kind_of? Fixnum}
|
|
||||||
assert_equal [1, 2, 4], lines
|
src = <<-EOS
|
||||||
|
# 1
|
||||||
|
p __LINE__ # 2
|
||||||
|
# 3
|
||||||
|
p __LINE__ # 4
|
||||||
|
# 5
|
||||||
|
EOS
|
||||||
|
assert_equal [2, 4], lines(src)
|
||||||
|
|
||||||
|
src = <<-EOS
|
||||||
|
1 # should be optimized out
|
||||||
|
2 # should be optimized out
|
||||||
|
p __LINE__ # 3
|
||||||
|
p __LINE__ # 4
|
||||||
|
5 # should be optimized out
|
||||||
|
6 # should be optimized out
|
||||||
|
p __LINE__ # 7
|
||||||
|
8 # should be optimized out
|
||||||
|
9
|
||||||
|
EOS
|
||||||
|
assert_equal [3, 4, 7, 9], lines(src)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_unsupport_type
|
def test_unsupport_type
|
||||||
|
|
Loading…
Add table
Reference in a new issue