From c4bad9f74e432572b80c24c7f1c519c5cc4c59a2 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 18 May 2019 09:35:40 +0900 Subject: Distinguish pre-condition and post-condition loops --- ast.c | 3 ++- test/ruby/test_ast.rb | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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 -- cgit v1.2.3