From 66661034808e5e1dab0683aff4e74d72bba042cc Mon Sep 17 00:00:00 2001 From: yui-knk Date: Thu, 7 Jun 2018 14:04:49 +0000 Subject: [PATCH] ast.c: Fix to raise `SyntaxError` * ast.c: Fix to raise `SyntaxError` when `RubyVM::AST.parse` or `RubyVM::AST.parse_file` fail to parse input. * test/ruby/test_ast.rb: Add test cases for invalid syntax. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63602 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ast.c | 14 ++++++++++---- test/ruby/test_ast.rb | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/ast.c b/ast.c index 1f0fde4bb1..d295ff9157 100644 --- a/ast.c +++ b/ast.c @@ -58,10 +58,13 @@ rb_ast_s_parse(VALUE module, VALUE str) const VALUE parser = rb_parser_new(); str = rb_check_string_type(str); - rb_parser_set_context(parser, NULL, 1); + rb_parser_set_context(parser, NULL, 0); ast = rb_parser_compile_string_path(parser, rb_str_new_cstr("no file name"), str, 1); - if (!ast->body.root) return Qnil; + if (!ast->body.root) { + rb_ast_dispose(ast); + rb_exc_raise(GET_EC()->errinfo); + } obj = ast_new_internal(ast, (NODE *)ast->body.root); @@ -80,12 +83,15 @@ rb_ast_s_parse_file(VALUE module, VALUE path) FilePathValue(path); f = rb_file_open_str(path, "r"); rb_funcall(f, rb_intern("set_encoding"), 2, rb_enc_from_encoding(enc), rb_str_new_cstr("-")); - rb_parser_set_context(parser, NULL, 1); + rb_parser_set_context(parser, NULL, 0); ast = rb_parser_compile_file_path(parser, path, f, 1); rb_io_close(f); - if (!ast->body.root) return Qnil; + if (!ast->body.root) { + rb_ast_dispose(ast); + rb_exc_raise(GET_EC()->errinfo); + } obj = ast_new_internal(ast, (NODE *)ast->body.root); diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 5a9bded19b..4696472965 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -150,4 +150,25 @@ class TestAst < Test::Unit::TestCase assert_equal(0, node.first_column) assert_equal(5, node.last_column) end + + def test_parse_raises_syntax_error + assert_raise(SyntaxError) { RubyVM::AST.parse("end") } + end + + def test_parse_file_raises_syntax_error + Tempfile.create(%w"test_ast .rb") do |f| + f.puts "end" + f.close + path = f.path + assert_in_out_err(%W[- #{path}], "#{<<-"begin;"}\n#{<<-"end;"}", /keyword_end/, [], success: true) + begin; + path = ARGV[0] + begin + RubyVM::AST.parse_file(path) + rescue SyntaxError => e + puts e.message + end + end; + end + end end