aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/lib/action_view/template/inline.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2019-02-22 17:23:54 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2019-02-22 17:59:55 -0800
commit52eafbd7495367aa48192100a922181d097e5b22 (patch)
treeb5a1ebd68101b6cd97b42f762da8e5b1d0ef8498 /actionview/lib/action_view/template/inline.rb
parenta796de1bd644b54e2c27577319c262af0de56e8f (diff)
downloadrails-52eafbd7495367aa48192100a922181d097e5b22.tar.gz
rails-52eafbd7495367aa48192100a922181d097e5b22.tar.bz2
rails-52eafbd7495367aa48192100a922181d097e5b22.zip
Add a finalizer to inline templates
This commit adds a finalizer just to inline templates. We can't cache compilation of inline templates because it's possible that people could have render calls that look like this: ```ruby loop do render inline: "#{rand}" end ``` and we would cache every one of these different inline templates. That would cause a memory leak. OTOH, we don't need finalizers on regular templates because we can cache, control, and detect changes to the template source. Fixes: #35372
Diffstat (limited to 'actionview/lib/action_view/template/inline.rb')
-rw-r--r--actionview/lib/action_view/template/inline.rb22
1 files changed, 22 insertions, 0 deletions
diff --git a/actionview/lib/action_view/template/inline.rb b/actionview/lib/action_view/template/inline.rb
new file mode 100644
index 0000000000..44658487ea
--- /dev/null
+++ b/actionview/lib/action_view/template/inline.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module ActionView #:nodoc:
+ class Template #:nodoc:
+ class Inline < Template #:nodoc:
+ # This finalizer is needed (and exactly with a proc inside another proc)
+ # otherwise templates leak in development.
+ Finalizer = proc do |method_name, mod| # :nodoc:
+ proc do
+ mod.module_eval do
+ remove_possible_method method_name
+ end
+ end
+ end
+
+ def compile(mod)
+ super
+ ObjectSpace.define_finalizer(self, Finalizer[method_name, mod])
+ end
+ end
+ end
+end