diff options
-rw-r--r-- | ast.c | 14 | ||||
-rw-r--r-- | test/ruby/test_ast.rb | 21 |
2 files changed, 31 insertions, 4 deletions
@@ -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 |