summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authork0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-22 03:56:16 +0000
committerk0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-22 03:56:16 +0000
commit72fb1e1690d71f9ec9e33bc3bc282689c7afe2b4 (patch)
tree8ad15660faa67d2d5d93fe77ccaba59f699a120f /lib
parent7a14ffbf5d38a1697936d08ef7782c355049b028 (diff)
erb.rb: Skip creating regexp
if stags and etags are not changed from default. :putobject insn (of regexp) will be used instead of :toregexp insn. This means that the regexp won't be compiled for every `SimpleScanner#scan` call. It may not be a good idea to apply this kind of optimization for all cases. But I applied this because it is default scanner and used frequently and has relatively large impact for benchmark like this: * Before app_erb 1.023 * After app_erb 0.781 This commit fixes only the bottleneck of performance regression introduced in r53412. For maintainability, I won't fix other small regressions like additional overhead of method calls. [ruby-core:73820] [Bug #12074] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58842 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/erb.rb10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/erb.rb b/lib/erb.rb
index 182a42437f..4c29553a53 100644
--- a/lib/erb.rb
+++ b/lib/erb.rb
@@ -371,11 +371,13 @@ class ERB
klass.new(src, trim_mode, percent)
end
+ DEFAULT_STAGS = %w(<%% <%= <%# <%).freeze
+ DEFAULT_ETAGS = %w(%%> %>).freeze
def initialize(src, trim_mode, percent)
@src = src
@stag = nil
- @stags = %w(<%% <%= <%# <%).freeze
- @etags = %w(%%> %>).freeze
+ @stags = DEFAULT_STAGS
+ @etags = DEFAULT_ETAGS
end
attr_accessor :stag
attr_reader :stags, :etags
@@ -505,8 +507,8 @@ class ERB
else
class SimpleScanner < Scanner # :nodoc:
def scan
- stag_reg = /(.*?)(#{stags.join('|')}|\z)/m
- etag_reg = /(.*?)(#{etags.join('|')}|\z)/m
+ stag_reg = (stags == DEFAULT_STAGS) ? /(.*?)(<%[%=#]?|\z)/m : /(.*?)(#{stags.join('|')}|\z)/m
+ etag_reg = (etags == DEFAULT_ETAGS) ? /(.*?)(%%?>|\z)/m : /(.*?)(#{etags.join('|')}|\z)/m
scanner = StringScanner.new(@src)
while ! scanner.eos?
scanner.scan(@stag ? etag_reg : stag_reg)