Merge pull request #9555 from tmm1/optimize-erb

Optimize generated ERB to reduce method calls
This commit is contained in:
Rafael Mendonça França 2013-04-05 13:56:29 -07:00
commit 08926bd06c
2 changed files with 35 additions and 3 deletions

@ -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