From 9ae2651d1929891a443eb6a208fb1038c23b86e0 Mon Sep 17 00:00:00 2001 From: tenderlove Date: Tue, 5 Nov 2013 19:15:40 +0000 Subject: [PATCH] * ext/psych/lib/psych/visitors/to_ruby.rb: process merge keys before reviving objects. Fixes GH psych #168 * test/psych/test_merge_keys.rb: test for change https://github.com/tenderlove/psych/issues/168 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43541 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ ext/psych/lib/psych/visitors/to_ruby.rb | 14 +++++--------- test/psych/test_merge_keys.rb | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index faf3fe9c02..beb65845ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Nov 6 04:14:25 2013 Aaron Patterson + + * ext/psych/lib/psych/visitors/to_ruby.rb: process merge keys before + reviving objects. Fixes GH psych #168 + * test/psych/test_merge_keys.rb: test for change + https://github.com/tenderlove/psych/issues/168 + Tue Nov 5 21:21:47 2013 Tanaka Akira * test/ruby/test_thread.rb (test_thread_join_in_trap): diff --git a/ext/psych/lib/psych/visitors/to_ruby.rb b/ext/psych/lib/psych/visitors/to_ruby.rb index 8695fd475e..1bfffb952f 100644 --- a/ext/psych/lib/psych/visitors/to_ruby.rb +++ b/ext/psych/lib/psych/visitors/to_ruby.rb @@ -156,7 +156,7 @@ module Psych if Psych.load_tags[o.tag] return revive(resolve_class(Psych.load_tags[o.tag]), o) end - return revive_hash({}, o) unless o.tag + return revive_hash(register(o, {}), o) unless o.tag case o.tag when /^!ruby\/struct:?(.*)?$/ @@ -256,7 +256,7 @@ module Psych set when /^!map:(.*)$/, /^!ruby\/hash:(.*)$/ - revive_hash resolve_class($1).new, o + revive_hash register(o, resolve_class($1).new), o when '!omap', 'tag:yaml.org,2002:omap' map = register(o, class_loader.psych_omap.new) @@ -266,7 +266,7 @@ module Psych map else - revive_hash({}, o) + revive_hash(register(o, {}), o) end end @@ -295,8 +295,6 @@ module Psych end def revive_hash hash, o - @st[o.anchor] = hash if o.anchor - o.children.each_slice(2) { |k,v| key = accept(k) val = accept(v) @@ -334,10 +332,8 @@ module Psych end def revive klass, node - s = klass.allocate - @st[node.anchor] = s if node.anchor - h = Hash[*node.children.map { |c| accept c }] - init_with(s, h, node) + s = register(node, klass.allocate) + init_with(s, revive_hash({}, node), node) end def init_with o, h, node diff --git a/test/psych/test_merge_keys.rb b/test/psych/test_merge_keys.rb index d8baba485f..ba8d2e77b3 100644 --- a/test/psych/test_merge_keys.rb +++ b/test/psych/test_merge_keys.rb @@ -2,6 +2,24 @@ require_relative 'helper' module Psych class TestMergeKeys < TestCase + class Product + attr_reader :bar + end + + def test_mergekey_with_object + s = <<-eoyml +foo: &foo + bar: 10 +product: + !ruby/object:#{Product.name} + <<: *foo + eoyml + hash = Psych.load s + assert_equal({"bar" => 10}, hash["foo"]) + product = hash["product"] + assert_equal 10, product.bar + end + def test_merge_nil yaml = <<-eoyml defaults: &defaults