From f388c873de82eb689b155bea3b9aa8828f766601 Mon Sep 17 00:00:00 2001 From: Tobi Lutke Date: Wed, 11 Mar 2026 07:38:16 -0400 Subject: [PATCH] expose expression_cache/string_scanner via attr_reader, skip regex in filter args without colon --- lib/liquid/parse_context.rb | 2 +- lib/liquid/variable.rb | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/liquid/parse_context.rb b/lib/liquid/parse_context.rb index 855acc64..4bec4c87 100644 --- a/lib/liquid/parse_context.rb +++ b/lib/liquid/parse_context.rb @@ -3,7 +3,7 @@ module Liquid class ParseContext attr_accessor :locale, :line_number, :trim_whitespace, :depth - attr_reader :partial, :warnings, :error_mode, :environment + attr_reader :partial, :warnings, :error_mode, :environment, :expression_cache, :string_scanner def initialize(options = Const::EMPTY_HASH) @environment = options.fetch(:environment, Environment.default) diff --git a/lib/liquid/variable.rb b/lib/liquid/variable.rb index db7d4a6b..f807d417 100644 --- a/lib/liquid/variable.rb +++ b/lib/liquid/variable.rb @@ -143,8 +143,8 @@ module Liquid # Resolve the name expression expr_markup = markup.byteslice(name_start, name_end - name_start) - cache = parse_context.instance_variable_get(:@expression_cache) - ss = parse_context.instance_variable_get(:@string_scanner) + cache = parse_context.expression_cache + ss = parse_context.string_scanner if Expression::LITERALS.key?(expr_markup) @name = Expression::LITERALS[expr_markup] @@ -300,7 +300,8 @@ module Liquid filter_args = [] keyword_args = nil unparsed_args.each do |a| - if (matches = a.match(JustTagAttributes)) + # Fast check: keyword args must contain ':' + if a.include?(':') && (matches = a.match(JustTagAttributes)) keyword_args ||= {} keyword_args[matches[1]] = parse_context.parse_expression(matches[2]) else