aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/lib/action_view/digestor.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2016-02-18 11:09:15 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2016-02-18 11:10:43 -0800
commit8bb52f929f36994fd5b42295d24b627f132fe318 (patch)
tree8f31e749813bc247d9f4f24e064bd47ced3f9d5e /actionview/lib/action_view/digestor.rb
parentfb8d01f1ef7da0a3c8c0173d6c3da59afe9d1ca5 (diff)
downloadrails-8bb52f929f36994fd5b42295d24b627f132fe318.tar.gz
rails-8bb52f929f36994fd5b42295d24b627f132fe318.tar.bz2
rails-8bb52f929f36994fd5b42295d24b627f132fe318.zip
cache all subnodes in the digest cache
this is for backwards compatibility. We should remove this after 5-0-stable is created because digest calculation should be amortized. Caching digests of subtrees will speed up digests for other trees that share the same children. However, this will also increase memory, and after the app warms up, then those subtrees will never be reused which means that memory is wasted.
Diffstat (limited to 'actionview/lib/action_view/digestor.rb')
-rw-r--r--actionview/lib/action_view/digestor.rb18
1 files changed, 10 insertions, 8 deletions
diff --git a/actionview/lib/action_view/digestor.rb b/actionview/lib/action_view/digestor.rb
index 07600f2092..518f0da16c 100644
--- a/actionview/lib/action_view/digestor.rb
+++ b/actionview/lib/action_view/digestor.rb
@@ -28,7 +28,7 @@ module ActionView
# (Concurrent::Map's lookups have volatile semantics)
finder.digest_cache[cache_key] || @@digest_mutex.synchronize do
finder.digest_cache.fetch(cache_key) do # re-check under lock
- finder.digest_cache[cache_key] = tree(name, finder, dependencies).digest
+ finder.digest_cache[cache_key] = tree(name, finder, dependencies).digest(finder)
end
end
end
@@ -83,17 +83,19 @@ module ActionView
@children = children
end
- def digest(stack = [])
- Digest::MD5.hexdigest("#{template.source}-#{dependency_digest(stack)}")
+ def digest(finder, stack = [])
+ Digest::MD5.hexdigest("#{template.source}-#{dependency_digest(finder, stack)}")
end
- def dependency_digest(stack)
+ def dependency_digest(finder, stack)
children.map do |node|
if stack.include?(node)
false
else
- stack.push node
- node.digest(stack).tap { stack.pop }
+ finder.digest_cache[node.name] ||= begin
+ stack.push node
+ node.digest(finder, stack).tap { stack.pop }
+ end
end
end.join("-")
end
@@ -106,11 +108,11 @@ module ActionView
class Partial < Node; end
class Missing < Node
- def digest(_ = []) '' end
+ def digest(finder, _ = []) '' end
end
class Injected < Node
- def digest(_ = []) name end
+ def digest(finder, _ = []) name end
end
class NullLogger