Freeze block body after parsing completes

This commit is contained in:
Peter Zhu
2020-10-23 10:53:16 -04:00
parent 784db053f2
commit fe66edb825
7 changed files with 20 additions and 2 deletions

View File

@@ -13,6 +13,7 @@ module Liquid
@body = new_body
while parse_body(@body, tokens)
end
@body.freeze(parse_context)
end
# For backwards compatibility

View File

@@ -16,9 +16,12 @@ module Liquid
def initialize
@nodelist = []
@blank = true
@frozen = false
end
def parse(tokenizer, parse_context, &block)
raise FrozenError, "can't modify frozen Liquid::BlockBody" if @frozen
parse_context.line_number = tokenizer.line_number
if tokenizer.for_liquid_tag
@@ -28,6 +31,10 @@ module Liquid
end
end
def freeze(_context)
@frozen = true
end
private def parse_for_liquid_tag(tokenizer, parse_context)
while (token = tokenizer.shift)
unless token.empty? || token =~ WhitespaceOrNothing
@@ -192,6 +199,8 @@ module Liquid
end
def render_to_output_buffer(context, output)
raise "Can only render when frozen" unless @frozen
context.resource_limits.increment_render_score(@nodelist.length)
idx = 0

View File

@@ -22,6 +22,7 @@ module Liquid
def parse(tokenizer, parse_context)
while parse_body(tokenizer)
end
@body.freeze(parse_context)
rescue SyntaxError => e
e.line_number ||= parse_context.line_number
raise

View File

@@ -20,7 +20,11 @@ module Liquid
def parse(tokens)
body = new_body
body = @blocks.last.attachment while parse_body(body, tokens)
while parse_body(body, tokens)
body.freeze(parse_context)
body = @blocks.last.attachment
end
body.freeze(parse_context)
if blank?
@blocks.each { |condition| condition.attachment.remove_blank_strings }
end

View File

@@ -61,7 +61,9 @@ module Liquid
def parse(tokens)
if parse_body(@for_block, tokens)
parse_body(@else_block, tokens)
@else_block.freeze(parse_context)
end
@for_block.freeze(parse_context)
if blank?
@for_block.remove_blank_strings
@else_block&.remove_blank_strings

View File

@@ -31,6 +31,7 @@ module Liquid
def parse(tokens)
while parse_body(@blocks.last.attachment, tokens)
end
@blocks.each { |block| block.attachment.freeze(parse_context) }
if blank?
@blocks.each { |condition| condition.attachment.remove_blank_strings }
end