mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
drastically reduce object allocations
before this change, we were allocating AS::SafeBuffer objects that were being interpolated in to a string, so the safe buffer object was being thrown away. This change only allocates a string (vs a string *and* a safebuffer) and interpolates the string. On my test application, this reduced the AS::SafeBuffer objects from 1527k per request to about 500 per request.
This commit is contained in:
parent
29a1b77c6b
commit
8899503f62
2 changed files with 15 additions and 8 deletions
|
@ -139,7 +139,7 @@ module ActionView
|
|||
|
||||
def content_tag_string(name, content, options, escape = true)
|
||||
tag_options = tag_options(options, escape) if options
|
||||
content = ERB::Util.h(content) if escape
|
||||
content = ERB::Util.unwrapped_html_escape(content) if escape
|
||||
"<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name.to_sym]}#{content}</#{name}>".html_safe
|
||||
end
|
||||
|
||||
|
@ -174,7 +174,7 @@ module ActionView
|
|||
|
||||
def tag_option(key, value, escape)
|
||||
value = value.join(" ") if value.is_a?(Array)
|
||||
value = ERB::Util.h(value) if escape
|
||||
value = ERB::Util.unwrapped_html_escape(value) if escape
|
||||
%(#{key}="#{value}")
|
||||
end
|
||||
end
|
||||
|
|
|
@ -19,12 +19,7 @@ class ERB
|
|||
# puts html_escape('is a > 0 & a < 10?')
|
||||
# # => is a > 0 & a < 10?
|
||||
def html_escape(s)
|
||||
s = s.to_s
|
||||
if s.html_safe?
|
||||
s
|
||||
else
|
||||
s.gsub(HTML_ESCAPE_REGEXP, HTML_ESCAPE).html_safe
|
||||
end
|
||||
unwrapped_html_escape(s).html_safe
|
||||
end
|
||||
|
||||
# Aliasing twice issues a warning "discarding old...". Remove first to avoid it.
|
||||
|
@ -36,6 +31,18 @@ class ERB
|
|||
singleton_class.send(:remove_method, :html_escape)
|
||||
module_function :html_escape
|
||||
|
||||
# HTML escapes strings but doesn't wrap them with an ActiveSupport::SafeBuffer.
|
||||
# This method is not for public consumption! Seriously!
|
||||
def unwrapped_html_escape(s) # :nodoc:
|
||||
s = s.to_s
|
||||
if s.html_safe?
|
||||
s
|
||||
else
|
||||
s.gsub(HTML_ESCAPE_REGEXP, HTML_ESCAPE)
|
||||
end
|
||||
end
|
||||
module_function :unwrapped_html_escape
|
||||
|
||||
# A utility method for escaping HTML without affecting existing escaped entities.
|
||||
#
|
||||
# html_escape_once('1 < 2 & 3')
|
||||
|
|
Loading…
Reference in a new issue