diff --git a/lib/liquid/block.rb b/lib/liquid/block.rb index 47d5f25..dc22a47 100644 --- a/lib/liquid/block.rb +++ b/lib/liquid/block.rb @@ -13,6 +13,7 @@ module Liquid @body = new_body while parse_body(@body, tokens) end + @body.freeze end # For backwards compatibility diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index 67d5d63..af62a14 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -19,6 +19,8 @@ module Liquid 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 +30,11 @@ module Liquid end end + def freeze + @nodelist.freeze + super + 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) + freeze unless frozen? + context.resource_limits.increment_render_score(@nodelist.length) idx = 0 diff --git a/lib/liquid/document.rb b/lib/liquid/document.rb index 2e47ffb..9bf13b4 100644 --- a/lib/liquid/document.rb +++ b/lib/liquid/document.rb @@ -22,6 +22,7 @@ module Liquid def parse(tokenizer, parse_context) while parse_body(tokenizer) end + @body.freeze rescue SyntaxError => e e.line_number ||= parse_context.line_number raise diff --git a/lib/liquid/tags/case.rb b/lib/liquid/tags/case.rb index 5dc3cb3..879fcb7 100644 --- a/lib/liquid/tags/case.rb +++ b/lib/liquid/tags/case.rb @@ -21,8 +21,9 @@ module Liquid def parse(tokens) body = new_body body = @blocks.last.attachment while parse_body(body, tokens) - if blank? - @blocks.each { |condition| condition.attachment.remove_blank_strings } + @blocks.each do |condition| + condition.attachment.remove_blank_strings if blank? + condition.attachment.freeze end end diff --git a/lib/liquid/tags/for.rb b/lib/liquid/tags/for.rb index d92fa68..e04d820 100644 --- a/lib/liquid/tags/for.rb +++ b/lib/liquid/tags/for.rb @@ -66,6 +66,8 @@ module Liquid @for_block.remove_blank_strings @else_block&.remove_blank_strings end + @for_block.freeze + @else_block&.freeze end def nodelist diff --git a/lib/liquid/tags/if.rb b/lib/liquid/tags/if.rb index 90692fd..b4a680a 100644 --- a/lib/liquid/tags/if.rb +++ b/lib/liquid/tags/if.rb @@ -31,8 +31,9 @@ module Liquid def parse(tokens) while parse_body(@blocks.last.attachment, tokens) end - if blank? - @blocks.each { |condition| condition.attachment.remove_blank_strings } + @blocks.each do |block| + block.attachment.remove_blank_strings if blank? + block.attachment.freeze end end