diff --git a/activesupport/lib/active_support/core_ext/object/deep_dup.rb b/activesupport/lib/active_support/core_ext/object/deep_dup.rb index c66c5eb2d9..5c903917f5 100644 --- a/activesupport/lib/active_support/core_ext/object/deep_dup.rb +++ b/activesupport/lib/active_support/core_ext/object/deep_dup.rb @@ -43,7 +43,7 @@ class Hash def deep_dup hash = dup each_pair do |key, value| - if key.frozen? && ::String === key + if (::String === key && key.frozen?) || ::Symbol === key hash[key] = value.deep_dup else hash.delete(key) diff --git a/activesupport/test/core_ext/object/deep_dup_test.rb b/activesupport/test/core_ext/object/deep_dup_test.rb index 1fef3129c6..a4fa00f5f2 100644 --- a/activesupport/test/core_ext/object/deep_dup_test.rb +++ b/activesupport/test/core_ext/object/deep_dup_test.rb @@ -56,4 +56,14 @@ class DeepDupTest < ActiveSupport::TestCase dup = hash.deep_dup assert_equal 1, dup.keys.length end + + def test_deep_dup_with_mutable_frozen_key + key = { array: [] }.freeze + hash = { key => :value } + + dup = hash.deep_dup + dup.transform_keys { |k| k[:array] << :array_element } + + assert_not_equal hash.keys, dup.keys + end end