From fe7a2f5aa8e951ea10e0eeacccbd7bfcdf0d755b Mon Sep 17 00:00:00 2001 From: Tobi Lutke Date: Wed, 11 Mar 2026 07:31:26 -0400 Subject: [PATCH] fast-path simple if conditions: skip ExpressionsAndOperators scan for single conditions --- lib/liquid/tags/if.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/liquid/tags/if.rb b/lib/liquid/tags/if.rb index c423c1e8..b896a1c0 100644 --- a/lib/liquid/tags/if.rb +++ b/lib/liquid/tags/if.rb @@ -85,7 +85,19 @@ module Liquid Condition.parse_expression(parse_context, markup, safe: safe) end + # Fast path regex for simple conditions: "expr", "expr op expr" (no and/or) + SIMPLE_CONDITION = /\A\s*(#{QuotedFragment})\s*(?:([=!<>a-z_]+)\s*(#{QuotedFragment}))?\s*\z/o + def lax_parse(markup) + # Fast path: simple condition without and/or + if !markup.include?(' and ') && !markup.include?(' or ') && markup =~ SIMPLE_CONDITION + return Condition.new( + parse_expression(Regexp.last_match(1)), + Regexp.last_match(2), + Regexp.last_match(3) ? parse_expression(Regexp.last_match(3)) : nil, + ) + end + expressions = markup.scan(ExpressionsAndOperators) raise SyntaxError, options[:locale].t("errors.syntax.if") unless expressions.pop =~ Syntax