Extract rescue code from BlockBody#render_node for re-use in liquid-c

This commit is contained in:
Dylan Thacker-Smith
2020-09-16 09:31:36 -04:00
parent 9917924adb
commit cddd8ea4ff
+15 -7
View File
@@ -71,17 +71,25 @@ module Liquid
# @api private # @api private
def self.render_node(context, output, node) def self.render_node(context, output, node)
node.render_to_output_buffer(context, output) node.render_to_output_buffer(context, output)
rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e rescue => exc
context.handle_error(e, node.line_number) blank_tag = !node.instance_of?(Variable) && node.blank?
rescue MemoryError rescue_render_node(context, output, node.line_number, exc, blank_tag)
end
# @api private
def self.rescue_render_node(context, output, line_number, exc, blank_tag)
case exc
when MemoryError
raise raise
rescue ::StandardError => e when UndefinedVariable, UndefinedDropMethod, UndefinedFilter
line_number = node.is_a?(String) ? nil : node.line_number context.handle_error(exc, line_number)
error_message = context.handle_error(e, line_number) else
if node.instance_of?(Variable) || !node.blank? # conditional for backwards compatibility error_message = context.handle_error(exc, line_number)
unless blank_tag # conditional for backwards compatibility
output << error_message output << error_message
end end
end end
end
private def parse_liquid_tag(markup, parse_context) private def parse_liquid_tag(markup, parse_context)
liquid_tag_tokenizer = Tokenizer.new(markup, line_number: parse_context.line_number, for_liquid_tag: true) liquid_tag_tokenizer = Tokenizer.new(markup, line_number: parse_context.line_number, for_liquid_tag: true)