Distinguish pre-condition and post-condition loops

This commit is contained in:
Nobuyoshi Nakada 2019-05-18 09:35:40 +09:00
Родитель 39336a4210
Коммит c4bad9f74e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4BC7D6DF58D8DF60
2 изменённых файлов: 14 добавлений и 1 удалений

3
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);

Просмотреть файл

@ -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