Avoid allocating arrays of key value pairs for hashes in assign_score_of

This commit is contained in:
Dylan Thacker-Smith
2020-10-21 10:09:02 -04:00
parent b872eac2b9
commit 001fde7694
2 changed files with 10 additions and 3 deletions

View File

@@ -45,11 +45,18 @@ module Liquid
def assign_score_of(val)
if val.instance_of?(String)
val.bytesize
elsif val.instance_of?(Array) || val.instance_of?(Hash)
elsif val.instance_of?(Array)
sum = 1
# Uses #each to avoid extra allocations.
val.each { |child| sum += assign_score_of(child) }
sum
elsif val.instance_of?(Hash)
sum = 1
val.each do |key, entry_value|
sum += assign_score_of(key)
sum += assign_score_of(entry_value)
end
sum
else
1
end

View File

@@ -88,8 +88,8 @@ class AssignTest < Minitest::Test
def test_assign_score_of_hash
assert_equal(1, assign_score_of({}))
assert_equal(6, assign_score_of('int' => 123))
assert_equal(14, assign_score_of('int' => 123, 'str' => 'abcd'))
assert_equal(5, assign_score_of('int' => 123))
assert_equal(12, assign_score_of('int' => 123, 'str' => 'abcd'))
end
private