summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2013-02-07 15:52:42 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2013-02-07 15:52:42 -0800
commit4ed9ce4792090b63b43ae7b5f298f18c60954e43 (patch)
tree8f041ba029371fa105b2c0c09e7f3a1cb033d1bf
parent030cfe952abe1f3bf12df0fbfdafa6c10ff1dc18 (diff)
downloadpsych-4ed9ce4792090b63b43ae7b5f298f18c60954e43.tar.gz
* ext/psych/lib/psych/visitors/yaml_tree.rb: change output reference
ids to be sequential numbers.
-rw-r--r--CHANGELOG.rdoc5
-rw-r--r--lib/psych/visitors/yaml_tree.rb34
2 files changed, 34 insertions, 5 deletions
diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc
index bc35cd5..66d1dda 100644
--- a/CHANGELOG.rdoc
+++ b/CHANGELOG.rdoc
@@ -1,3 +1,8 @@
+Fri Feb 8 08:50:42 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: change output reference
+ ids to be sequential numbers.
+
Thu Jan 17 10:48:56 2013 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/psych/lib/psych/scalar_scanner.rb: use constants rather than
diff --git a/lib/psych/visitors/yaml_tree.rb b/lib/psych/visitors/yaml_tree.rb
index ce40a17..53cbad3 100644
--- a/lib/psych/visitors/yaml_tree.rb
+++ b/lib/psych/visitors/yaml_tree.rb
@@ -8,6 +8,30 @@ module Psych
# builder.tree # => #<Psych::Nodes::Stream .. }
#
class YAMLTree < Psych::Visitors::Visitor
+ class Registrar # :nodoc:
+ def initialize
+ @obj_to_id = {}
+ @obj_to_node = {}
+ @counter = 0
+ end
+
+ def register target, node
+ @obj_to_node[target.object_id] = node
+ end
+
+ def key? target
+ @obj_to_node.key? target.object_id
+ end
+
+ def id_for target
+ @obj_to_id[target.object_id] ||= (@counter += 1)
+ end
+
+ def node_for target
+ @obj_to_node[target.object_id]
+ end
+ end
+
attr_reader :started, :finished
alias :finished? :finished
alias :started? :started
@@ -17,7 +41,7 @@ module Psych
@started = false
@finished = false
@emitter = emitter
- @st = {}
+ @st = Registrar.new
@ss = ss
@options = options
@coders = []
@@ -72,9 +96,9 @@ module Psych
def accept target
# return any aliases we find
- if @st.key? target.object_id
- oid = target.object_id
- node = @st[oid]
+ if @st.key? target
+ oid = @st.id_for target
+ node = @st.node_for target
anchor = oid.to_s
node.anchor = anchor
return @emitter.alias anchor
@@ -410,7 +434,7 @@ module Psych
end
def register target, yaml_obj
- @st[target.object_id] = yaml_obj
+ @st.register target, yaml_obj
yaml_obj
end