From ba9f7fc08de13ab602cfd698295879853fdba0a8 Mon Sep 17 00:00:00 2001 From: NAITOH Jun Date: Sun, 14 Jan 2024 21:48:27 +0900 Subject: [PATCH] Change `@scanner.match` to respond `nil`/`@scanner` in order to improve processing speed. --- lib/rexml/parsers/baseparser.rb | 3 +-- lib/rexml/source.rb | 17 ++++++++--------- test/test_document.rb | 12 ++++++++++++ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb index 5ce7b8d9..65bad260 100644 --- a/lib/rexml/parsers/baseparser.rb +++ b/lib/rexml/parsers/baseparser.rb @@ -274,8 +274,7 @@ def pull_event return [ :elementdecl, @source.match( ELEMENTDECL_PATTERN, true )[1] ] when ENTITY_START - match = @source.match( ENTITYDECL, true ).compact - match[0] = :entitydecl + match = [:entitydecl, *@source.match( ENTITYDECL, true ).captures.compact] ref = false if match[1] == '%' ref = true diff --git a/lib/rexml/source.rb b/lib/rexml/source.rb index fafe270b..b9b94c7e 100644 --- a/lib/rexml/source.rb +++ b/lib/rexml/source.rb @@ -70,11 +70,10 @@ def read def match(pattern, cons=false) if cons - @scanner.scan(pattern) + @scanner.scan(pattern).nil? ? nil : @scanner else - @scanner.check(pattern) + @scanner.check(pattern).nil? ? nil : @scanner end - @scanner.matched? ? [@scanner.matched, *@scanner.captures] : nil end # @return true if the Source is exhausted @@ -158,24 +157,24 @@ def read def match( pattern, cons=false ) if cons - @scanner.scan(pattern) + md = @scanner.scan(pattern) else - @scanner.check(pattern) + md = @scanner.check(pattern) end - while !@scanner.matched? and @source + while md.nil? and @source begin @scanner << readline if cons - @scanner.scan(pattern) + md = @scanner.scan(pattern) else - @scanner.check(pattern) + md = @scanner.check(pattern) end rescue @source = nil end end - @scanner.matched? ? [@scanner.matched, *@scanner.captures] : nil + md.nil? ? nil : @scanner end def empty? diff --git a/test/test_document.rb b/test/test_document.rb index cca67df2..785b493b 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -173,6 +173,18 @@ def test_empty_value REXML::Document.new(xml) end end + + def test_empty_entity + xml = < +]> +EOF + + assert_raise(REXML::ParseException) do + REXML::Document.new(xml) + end + end end end