From 001fde7694b52cb8a577c3294d0d6152522477fe Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Wed, 21 Oct 2020 10:09:02 -0400 Subject: [PATCH] Avoid allocating arrays of key value pairs for hashes in assign_score_of --- lib/liquid/tags/assign.rb | 9 ++++++++- test/integration/assign_test.rb | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/liquid/tags/assign.rb b/lib/liquid/tags/assign.rb index ff4ab40..6d4f7d8 100644 --- a/lib/liquid/tags/assign.rb +++ b/lib/liquid/tags/assign.rb @@ -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 diff --git a/test/integration/assign_test.rb b/test/integration/assign_test.rb index 01f355c..b956fd1 100644 --- a/test/integration/assign_test.rb +++ b/test/integration/assign_test.rb @@ -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