Permalink
Browse files

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.
  • Loading branch information...
tenderlove committed Jun 2, 2014
1 parent 29a1b77 commit 8899503f62a556a918c45b3e7b5c2effaaa943f4
@@ -139,7 +139,7 @@ def escape_once(html)
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 @@ def boolean_tag_option(key)
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 @@ module Util
# puts html_escape('is a > 0 & a < 10?')
# # => is a &gt; 0 &amp; a &lt; 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 @@ def html_escape(s)
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 &amp; 3')

13 comments on commit 8899503

@TALlama

This comment has been minimized.

Show comment
Hide comment
@TALlama

TALlama Jun 3, 2014

👏

👏

@hlegius

This comment has been minimized.

Show comment
Hide comment
@hlegius

hlegius Jun 3, 2014

👏

👏

@celeduc

This comment has been minimized.

Show comment
Hide comment
@celeduc

celeduc Jun 3, 2014

🐎 ⌚️ 🐇

🐎 ⌚️ 🐇

@tenderlove

This comment has been minimized.

Show comment
Hide comment
@tenderlove

tenderlove Jun 3, 2014

Member

Oops, meant to say 1527 / req to 500 / req. orz.

Member

tenderlove replied Jun 3, 2014

Oops, meant to say 1527 / req to 500 / req. orz.

@ernie

This comment has been minimized.

Show comment
Hide comment
@ernie

ernie Jun 3, 2014

Contributor

Nice!! ❤️❤️❤️❤️❤️❤️❤️❤️

Contributor

ernie replied Jun 3, 2014

Nice!! ❤️❤️❤️❤️❤️❤️❤️❤️

@BrianTheCoder

This comment has been minimized.

Show comment
Hide comment
@BrianTheCoder

BrianTheCoder Jun 3, 2014

🎬

🎬

@rizwanreza

This comment has been minimized.

Show comment
Hide comment
@rizwanreza

rizwanreza Jun 3, 2014

Contributor

👏

Contributor

rizwanreza replied Jun 3, 2014

👏

@sgrif

This comment has been minimized.

Show comment
Hide comment
@sgrif

sgrif Jun 3, 2014

Member

Nicely done, sir!

Member

sgrif replied Jun 3, 2014

Nicely done, sir!

@shireeshj

This comment has been minimized.

Show comment
Hide comment
@shireeshj

shireeshj Jun 3, 2014

👏

👏

@jewilmeer

This comment has been minimized.

Show comment
Hide comment
@jewilmeer

jewilmeer Jun 3, 2014

👏

👏

@Davidslv

This comment has been minimized.

Show comment
Hide comment
@Davidslv

Davidslv Jun 3, 2014

💯

💯

@Dorian

This comment has been minimized.

Show comment
Hide comment
@Dorian

Dorian Jun 3, 2014

Contributor

❤️ ❤️ ❤️

Contributor

Dorian replied Jun 3, 2014

❤️ ❤️ ❤️

@ytrezq

This comment has been minimized.

Show comment
Hide comment
@ytrezq

ytrezq Aug 18, 2015

@tenderlove : Sorry but typically, what string could have tags not escaped if passed tounwrapped_html_escapedirectly (“# This method is not for public consumption”) ?

@tenderlove : Sorry but typically, what string could have tags not escaped if passed tounwrapped_html_escapedirectly (“# This method is not for public consumption”) ?

Please sign in to comment.