Simplify context and scopes

This commit is contained in:
Mike Angell
2019-08-28 18:00:37 +10:00
parent 0ce8aef229
commit 56c667d8f9
+13 -48
View File
@@ -20,21 +20,17 @@ module Liquid
@scopes = [(outer_scope || {})] @scopes = [(outer_scope || {})]
@registers = registers @registers = registers
@errors = [] @errors = []
@interrupts = []
@filters = []
@global_filter = nil
@partial = false @partial = false
@strict_variables = false @strict_variables = false
@resource_limits = resource_limits || ResourceLimits.new(Template.default_resource_limits) @resource_limits = resource_limits || ResourceLimits.new(Template.default_resource_limits)
squash_instance_assigns_with_environments
@this_stack_used = false
self.exception_renderer = Template.default_exception_renderer self.exception_renderer = Template.default_exception_renderer
if rethrow_errors self.exception_renderer = ->(e) { raise } if rethrow_errors
self.exception_renderer = ->(e) { raise }
end
@interrupts = [] squash_instance_assigns_with_environments
@filters = []
@global_filter = nil
end end
def warnings def warnings
@@ -87,9 +83,9 @@ module Liquid
end end
# Push new local scope on the stack. use <tt>Context#stack</tt> instead # Push new local scope on the stack. use <tt>Context#stack</tt> instead
def push(new_scope = {}) def push
@scopes.unshift(new_scope) @scopes.unshift({})
raise StackLevelError, "Nesting too deep".freeze if @scopes.length > Block::MAX_DEPTH raise StackLevelError, "Nesting too deep".freeze if @scopes.length > (Block::MAX_DEPTH + 1)
end end
# Merge a hash of variables in the current local scope # Merge a hash of variables in the current local scope
@@ -111,31 +107,15 @@ module Liquid
# end # end
# #
# context['var] #=> nil # context['var] #=> nil
def stack(new_scope = nil) def stack
old_stack_used = @this_stack_used push
if new_scope
push(new_scope)
@this_stack_used = true
else
@this_stack_used = false
end
yield yield
ensure ensure
pop if @this_stack_used pop
@this_stack_used = old_stack_used
end
def clear_instance_assigns
@scopes[0] = {}
end end
# Only allow String, Numeric, Hash, Array, Proc, Boolean or <tt>Liquid::Drop</tt> # Only allow String, Numeric, Hash, Array, Proc, Boolean or <tt>Liquid::Drop</tt>
def []=(key, value) def []=(key, value)
unless @this_stack_used
@this_stack_used = true
push({})
end
@scopes[0][key] = value @scopes[0][key] = value
end end
@@ -166,24 +146,9 @@ module Liquid
index = @scopes.find_index { |s| s.key?(key) } index = @scopes.find_index { |s| s.key?(key) }
scope = @scopes[index] if index scope = @scopes[index] if index
variable = nil scope ||= @environments.find { |e| !e[key].nil? || @strict_variables && raise_on_not_found } || {}
if scope.nil? variable = lookup_and_evaluate(scope, key, raise_on_not_found: raise_on_not_found).to_liquid
@environments.each do |e|
variable = lookup_and_evaluate(e, key, raise_on_not_found: raise_on_not_found)
# When lookup returned a value OR there is no value but the lookup also did not raise
# then it is the value we are looking for.
if !variable.nil? || @strict_variables && raise_on_not_found
scope = e
break
end
end
end
scope ||= @environments.last || @scopes.last
variable ||= lookup_and_evaluate(scope, key, raise_on_not_found: raise_on_not_found)
variable = variable.to_liquid
variable.context = self if variable.respond_to?(:context=) variable.context = self if variable.respond_to?(:context=)
variable variable