diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index 1ef272d4..83aab805 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "lru_redux" + module Liquid # Context keeps the variable stack and resolves variables, as well as keywords # @@ -39,6 +41,7 @@ module Liquid @filters = [] @global_filter = nil @disabled_tags = {} + @expression_cache = LruRedux::ThreadSafeCache.new(1000) # Instead of constructing new StringScanner objects for each Expression parse, # we recycle the same one. @@ -180,7 +183,7 @@ module Liquid # Example: # products == empty #=> products.empty? def [](expression) - evaluate(Expression.parse(expression, @string_scanner)) + evaluate(Expression.parse(expression, @string_scanner, @expression_cache)) end def key?(key)