Merge pull request #9555 from tmm1/optimize-erb
Optimize generated ERB to reduce method calls
This commit is contained in:
commit
08926bd06c
@ -8,9 +8,15 @@ def initialize(*)
|
||||
end
|
||||
|
||||
def <<(value)
|
||||
return self if value.nil?
|
||||
super(value.to_s)
|
||||
end
|
||||
alias :append= :<<
|
||||
|
||||
def safe_concat(value)
|
||||
return self if value.nil?
|
||||
super(value.to_s)
|
||||
end
|
||||
alias :safe_append= :safe_concat
|
||||
end
|
||||
|
||||
|
@ -6,12 +6,23 @@ class Template
|
||||
module Handlers
|
||||
class Erubis < ::Erubis::Eruby
|
||||
def add_preamble(src)
|
||||
@newline_pending = 0
|
||||
src << "@output_buffer = output_buffer || ActionView::OutputBuffer.new;"
|
||||
end
|
||||
|
||||
def add_text(src, text)
|
||||
return if text.empty?
|
||||
src << "@output_buffer.safe_concat('" << escape_text(text) << "');"
|
||||
|
||||
if text == "\n"
|
||||
@newline_pending += 1
|
||||
else
|
||||
src << "@output_buffer.safe_append='"
|
||||
src << "\n" * @newline_pending if @newline_pending > 0
|
||||
src << escape_text(text)
|
||||
src << "';"
|
||||
|
||||
@newline_pending = 0
|
||||
end
|
||||
end
|
||||
|
||||
# Erubis toggles <%= and <%== behavior when escaping is enabled.
|
||||
@ -28,24 +39,39 @@ def add_expr(src, code, indicator)
|
||||
BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/
|
||||
|
||||
def add_expr_literal(src, code)
|
||||
flush_newline_if_pending(src)
|
||||
if code =~ BLOCK_EXPR
|
||||
src << '@output_buffer.append= ' << code
|
||||
else
|
||||
src << '@output_buffer.append= (' << code << ');'
|
||||
src << '@output_buffer.append=(' << code << ');'
|
||||
end
|
||||
end
|
||||
|
||||
def add_expr_escaped(src, code)
|
||||
flush_newline_if_pending(src)
|
||||
if code =~ BLOCK_EXPR
|
||||
src << "@output_buffer.safe_append= " << code
|
||||
else
|
||||
src << "@output_buffer.safe_concat((" << code << ").to_s);"
|
||||
src << "@output_buffer.safe_append=(" << code << ");"
|
||||
end
|
||||
end
|
||||
|
||||
def add_stmt(src, code)
|
||||
flush_newline_if_pending(src)
|
||||
super
|
||||
end
|
||||
|
||||
def add_postamble(src)
|
||||
flush_newline_if_pending(src)
|
||||
src << '@output_buffer.to_s'
|
||||
end
|
||||
|
||||
def flush_newline_if_pending(src)
|
||||
if @newline_pending > 0
|
||||
src << "@output_buffer.safe_append='#{"\n" * @newline_pending}';"
|
||||
@newline_pending = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class ERB
|
||||
|
Loading…
Reference in New Issue
Block a user