[Bug #20457] Do not remove final return
node
This was an optimization for versions prior to 1.9 that traverse the AST at runtime.
This commit is contained in:
parent
22f98bb7ca
commit
250fc1223c
4
parse.y
4
parse.y
@ -14045,10 +14045,6 @@ reduce_nodes(struct parser_params *p, NODE **body)
|
|||||||
case NODE_NIL:
|
case NODE_NIL:
|
||||||
*body = 0;
|
*body = 0;
|
||||||
return;
|
return;
|
||||||
case NODE_RETURN:
|
|
||||||
*body = node = RNODE_RETURN(node)->nd_stts;
|
|
||||||
if (newline && node) nd_set_fl_newline(node);
|
|
||||||
continue;
|
|
||||||
case NODE_BEGIN:
|
case NODE_BEGIN:
|
||||||
*body = node = RNODE_BEGIN(node)->nd_body;
|
*body = node = RNODE_BEGIN(node)->nd_body;
|
||||||
if (newline && node) nd_set_fl_newline(node);
|
if (newline && node) nd_set_fl_newline(node);
|
||||||
|
@ -67,6 +67,7 @@ describe 'TracePoint#inspect' do
|
|||||||
end
|
end
|
||||||
trace_point_spec_test_return
|
trace_point_spec_test_return
|
||||||
end
|
end
|
||||||
|
ruby_version_is("3.4") { line -= 1 }
|
||||||
|
|
||||||
inspect.should =~ /\A#<TracePoint:return [`']trace_point_spec_test_return'#{@path_prefix}#{__FILE__}:#{line}>\z/
|
inspect.should =~ /\A#<TracePoint:return [`']trace_point_spec_test_return'#{@path_prefix}#{__FILE__}:#{line}>\z/
|
||||||
end
|
end
|
||||||
|
@ -708,6 +708,37 @@ class TestAst < Test::Unit::TestCase
|
|||||||
assert_equal(:a, args.children[rest])
|
assert_equal(:a, args.children[rest])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_return
|
||||||
|
assert_ast_eqaul(<<~STR, <<~EXP)
|
||||||
|
def m(a)
|
||||||
|
return a
|
||||||
|
end
|
||||||
|
STR
|
||||||
|
(SCOPE@1:0-3:3
|
||||||
|
tbl: []
|
||||||
|
args: nil
|
||||||
|
body:
|
||||||
|
(DEFN@1:0-3:3
|
||||||
|
mid: :m
|
||||||
|
body:
|
||||||
|
(SCOPE@1:0-3:3
|
||||||
|
tbl: [:a]
|
||||||
|
args:
|
||||||
|
(ARGS@1:6-1:7
|
||||||
|
pre_num: 1
|
||||||
|
pre_init: nil
|
||||||
|
opt: nil
|
||||||
|
first_post: nil
|
||||||
|
post_num: 0
|
||||||
|
post_init: nil
|
||||||
|
rest: nil
|
||||||
|
kw: nil
|
||||||
|
kwrest: nil
|
||||||
|
block: nil)
|
||||||
|
body: (RETURN@2:2-2:10 (LVAR@2:9-2:10 :a)))))
|
||||||
|
EXP
|
||||||
|
end
|
||||||
|
|
||||||
def test_keep_script_lines_for_parse
|
def test_keep_script_lines_for_parse
|
||||||
node = RubyVM::AbstractSyntaxTree.parse(<<~END, keep_script_lines: true)
|
node = RubyVM::AbstractSyntaxTree.parse(<<~END, keep_script_lines: true)
|
||||||
1.times do
|
1.times do
|
||||||
@ -1271,9 +1302,13 @@ dummy
|
|||||||
end
|
end
|
||||||
|
|
||||||
def assert_error_tolerant(src, expected, keep_tokens: false)
|
def assert_error_tolerant(src, expected, keep_tokens: false)
|
||||||
|
assert_ast_eqaul(src, expected, error_tolerant: true, keep_tokens: keep_tokens)
|
||||||
|
end
|
||||||
|
|
||||||
|
def assert_ast_eqaul(src, expected, **options)
|
||||||
begin
|
begin
|
||||||
verbose_bak, $VERBOSE = $VERBOSE, false
|
verbose_bak, $VERBOSE = $VERBOSE, false
|
||||||
node = RubyVM::AbstractSyntaxTree.parse(src, error_tolerant: true, keep_tokens: keep_tokens)
|
node = RubyVM::AbstractSyntaxTree.parse(src, **options)
|
||||||
ensure
|
ensure
|
||||||
$VERBOSE = verbose_bak
|
$VERBOSE = verbose_bak
|
||||||
end
|
end
|
||||||
|
@ -232,7 +232,9 @@ class TestSetTraceFunc < Test::Unit::TestCase
|
|||||||
events.shift)
|
events.shift)
|
||||||
assert_equal(["line", 5, :meth_return, self.class],
|
assert_equal(["line", 5, :meth_return, self.class],
|
||||||
events.shift)
|
events.shift)
|
||||||
assert_equal(["return", 7, :meth_return, self.class],
|
assert_equal(["line", 6, :meth_return, self.class],
|
||||||
|
events.shift)
|
||||||
|
assert_equal(["return", 6, :meth_return, self.class],
|
||||||
events.shift)
|
events.shift)
|
||||||
assert_equal(["line", 10, :test_return, self.class],
|
assert_equal(["line", 10, :test_return, self.class],
|
||||||
events.shift)
|
events.shift)
|
||||||
@ -271,7 +273,7 @@ class TestSetTraceFunc < Test::Unit::TestCase
|
|||||||
events.shift)
|
events.shift)
|
||||||
assert_equal(["line", 6, :meth_return2, self.class],
|
assert_equal(["line", 6, :meth_return2, self.class],
|
||||||
events.shift)
|
events.shift)
|
||||||
assert_equal(["return", 7, :meth_return2, self.class],
|
assert_equal(["return", 6, :meth_return2, self.class],
|
||||||
events.shift)
|
events.shift)
|
||||||
assert_equal(["line", 9, :test_return2, self.class],
|
assert_equal(["line", 9, :test_return2, self.class],
|
||||||
events.shift)
|
events.shift)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user