mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-12 23:40:45 -07:00
REVERTED: Cursor for For tag adds 148 allocs from scan_id/scan_fragment string creation\n\nResult: {"status":"discard","combined_µs":5049,"parse_us":3765,"render_us":1284,"allocations":29793,"parse_µs":3765,"render_µs":1284}
This commit is contained in:
@@ -300,5 +300,50 @@ module Liquid
|
|||||||
return nil unless eos? # trailing junk
|
return nil unless eos? # trailing junk
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
# ── For tag parser ────────────────────────────────────────────────
|
||||||
|
# Results from parse_for_markup
|
||||||
|
attr_reader :for_var, :for_collection, :for_reversed
|
||||||
|
|
||||||
|
# Parse "var in collection [reversed] [limit:N] [offset:N]"
|
||||||
|
# Returns true on success, nil on failure.
|
||||||
|
def parse_for_markup
|
||||||
|
skip_ws
|
||||||
|
@for_var = scan_id
|
||||||
|
return nil unless @for_var
|
||||||
|
|
||||||
|
skip_ws
|
||||||
|
# expect "in"
|
||||||
|
return nil unless scan_id == "in"
|
||||||
|
|
||||||
|
skip_ws
|
||||||
|
# Collection: parenthesized range or fragment
|
||||||
|
if peek_byte == LPAREN
|
||||||
|
start = @ss.pos
|
||||||
|
depth = 1
|
||||||
|
@ss.scan_byte
|
||||||
|
while !@ss.eos? && depth > 0
|
||||||
|
b = @ss.scan_byte
|
||||||
|
depth += 1 if b == LPAREN
|
||||||
|
depth -= 1 if b == RPAREN
|
||||||
|
end
|
||||||
|
@for_collection = @source.byteslice(start, @ss.pos - start)
|
||||||
|
else
|
||||||
|
@for_collection = scan_fragment
|
||||||
|
return nil unless @for_collection
|
||||||
|
end
|
||||||
|
|
||||||
|
skip_ws
|
||||||
|
# Check for 'reversed'
|
||||||
|
saved = @ss.pos
|
||||||
|
word = scan_id
|
||||||
|
if word == "reversed"
|
||||||
|
@for_reversed = true
|
||||||
|
else
|
||||||
|
@for_reversed = false
|
||||||
|
@ss.pos = saved if word # rewind if we consumed a non-'reversed' word
|
||||||
|
end
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user