Compare commits

...
Author SHA1 Message Date
Ian Ker-Seymer f5964b7511 Refactor limit tracking using render_score flag
Remove reached_limit field; use render_score == -1 to indicate limits reached. Update related methods accordingly for clarity and consistency.
2025-05-16 15:15:03 -04:00
Ian Ker-Seymer 8511d1b1c9 Refactor ResourceLimits to use a struct
Switch ResourceLimits to a Struct for more compact
data representation and cleaner initialization logic.
2025-05-16 15:12:07 -04:00
2 changed files with 18 additions and 27 deletions
+1 -1
View File
@@ -1 +1 @@
3.4.1
3.4.3
+17 -26
View File
@@ -1,61 +1,52 @@
# frozen_string_literal: true
module Liquid
class ResourceLimits
attr_accessor :render_length_limit, :render_score_limit, :assign_score_limit
attr_reader :render_score, :assign_score
def initialize(limits)
@render_length_limit = limits[:render_length_limit]
@render_score_limit = limits[:render_score_limit]
@assign_score_limit = limits[:assign_score_limit]
reset
end
class ResourceLimits < Struct.new(:render_length_limit, :render_score_limit, :assign_score_limit, :render_score, :assign_score, :last_capture_length, keyword_init: true)
def increment_render_score(amount)
@render_score += amount
raise_limits_reached if @render_score_limit && @render_score > @render_score_limit
self.render_score ||= 0
self.render_score += amount
raise_limits_reached if render_score_limit && render_score > render_score_limit
end
def increment_assign_score(amount)
@assign_score += amount
raise_limits_reached if @assign_score_limit && @assign_score > @assign_score_limit
self.assign_score ||= 0
self.assign_score += amount
raise_limits_reached if assign_score_limit && assign_score > assign_score_limit
end
# update either render_length or assign_score based on whether or not the writes are captured
def increment_write_score(output)
if (last_captured = @last_capture_length)
if (last_captured = last_capture_length)
captured = output.bytesize
increment = captured - last_captured
@last_capture_length = captured
self.last_capture_length = captured
increment_assign_score(increment)
elsif @render_length_limit && output.bytesize > @render_length_limit
elsif render_length_limit && output.bytesize > render_length_limit
raise_limits_reached
end
end
def raise_limits_reached
@reached_limit = true
self.render_score = -1
raise MemoryError, "Memory limits exceeded"
end
def reached?
@reached_limit
self.render_score == -1
end
def reset
@reached_limit = false
@last_capture_length = nil
@render_score = @assign_score = 0
self.last_capture_length = nil
self.render_score = self.assign_score = 0
end
def with_capture
old_capture_length = @last_capture_length
old_capture_length = last_capture_length
begin
@last_capture_length = 0
self.last_capture_length = 0
yield
ensure
@last_capture_length = old_capture_length
self.last_capture_length = old_capture_length
end
end
end