summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/psych/lib/psych/visitors/to_ruby.rb14
-rw-r--r--test/psych/test_merge_keys.rb18
3 files changed, 30 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index faf3fe9c024..beb65845ef6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Nov 6 04:14:25 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * 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 <akr@fsij.org>
* 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 8695fd475e5..1bfffb952f1 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 d8baba485f5..ba8d2e77b33 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