summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-05-18 09:35:40 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-05-18 09:35:40 +0900
commitc4bad9f74e432572b80c24c7f1c519c5cc4c59a2 (patch)
tree39da14b04c3cd4fadfb8a5e36576b97afd28ea70
parent39336a4210557d8677a2e07094efd785af0711ca (diff)
Distinguish pre-condition and post-condition loops
-rw-r--r--ast.c3
-rw-r--r--test/ruby/test_ast.rb12
2 files changed, 14 insertions, 1 deletions
diff --git a/ast.c b/ast.c
index 3e25c89a55..2d219092c7 100644
--- a/ast.c
+++ b/ast.c
@@ -374,7 +374,8 @@ node_children(rb_ast_t *ast, NODE *node)
goto loop;
case NODE_UNTIL:
loop:
- return rb_ary_new_from_node_args(ast, 2, node->nd_cond, node->nd_body);
+ return rb_ary_push(rb_ary_new_from_node_args(ast, 2, node->nd_cond, node->nd_body),
+ (node->nd_state ? Qtrue : Qfalse));
case NODE_ITER:
case NODE_FOR:
return rb_ary_new_from_node_args(ast, 2, node->nd_iter, node->nd_body);
diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb
index 974dfb77fb..7809be0994 100644
--- a/test/ruby/test_ast.rb
+++ b/test/ruby/test_ast.rb
@@ -278,4 +278,16 @@ class TestAst < Test::Unit::TestCase
assert_equal(:LIT, body.type)
assert_equal([1], body.children)
end
+
+ def test_while
+ node = RubyVM::AbstractSyntaxTree.parse('1 while 1')
+ _, _, body = *node.children
+ assert_equal(:WHILE, body.type)
+ type1 = body.children[2]
+ node = RubyVM::AbstractSyntaxTree.parse('begin 1 end while 1')
+ _, _, body = *node.children
+ assert_equal(:WHILE, body.type)
+ type2 = body.children[2]
+ assert_not_equal(type1, type2)
+ end
end