summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-11 22:24:47 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-12 15:58:18 +0900
commit844a0edbae6e74293e3d0cb1ceeeb66a4371d06d (patch)
tree7e1652945a9a290633476d2dd8b09e5e8fa69025
parent803a07263001e5466bba0f53fcc85784f4b5c686 (diff)
downloadruby-844a0edbae6e74293e3d0cb1ceeeb66a4371d06d.tar.gz
[Bug #18962] Do not read again once reached EOF
`Ripper::Lexer#parse` re-parses the source code with syntax errors when `raise_errors: false`. Co-Authored-By: tompng <tomoyapenguin@gmail.com>
-rw-r--r--parse.y1
-rw-r--r--test/ripper/test_lexer.rb14
2 files changed, 15 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index b4c3106b8c..d0f37a18cc 100644
--- a/parse.y
+++ b/parse.y
@@ -9299,6 +9299,7 @@ parser_yylex(struct parser_params *p)
case '\004': /* ^D */
case '\032': /* ^Z */
case -1: /* end of script. */
+ p->eofp = 1;
return 0;
/* white spaces */
diff --git a/test/ripper/test_lexer.rb b/test/ripper/test_lexer.rb
index 83130668be..4f3f4657ef 100644
--- a/test/ripper/test_lexer.rb
+++ b/test/ripper/test_lexer.rb
@@ -100,6 +100,20 @@ class TestRipper::Lexer < Test::Unit::TestCase
assert_equal expect, Ripper.lex(src).map {|e| e[1]}
end
+ def test_end_of_script_char
+ all_assertions do |all|
+ ["a", %w"[a ]", %w"{, }", "if"].each do |src, append|
+ expected = Ripper.lex(src).map {|e| e[1]}
+ ["\0b", "\4b", "\32b"].each do |eof|
+ c = "#{src}#{eof}#{append}"
+ all.for(c) do
+ assert_equal expected, Ripper.lex(c).map {|e| e[1]}
+ end
+ end
+ end
+ end
+ end
+
def test_slice
assert_equal "string\#{nil}\n",
Ripper.slice(%(<<HERE\nstring\#{nil}\nHERE), "heredoc_beg .*? nl $(.*?) heredoc_end", 1)