diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2013-02-07 15:52:42 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2013-02-07 15:52:42 -0800 |
commit | 4ed9ce4792090b63b43ae7b5f298f18c60954e43 (patch) | |
tree | 8f041ba029371fa105b2c0c09e7f3a1cb033d1bf | |
parent | 030cfe952abe1f3bf12df0fbfdafa6c10ff1dc18 (diff) | |
download | psych-4ed9ce4792090b63b43ae7b5f298f18c60954e43.tar.gz |
* ext/psych/lib/psych/visitors/yaml_tree.rb: change output reference
ids to be sequential numbers.
-rw-r--r-- | CHANGELOG.rdoc | 5 | ||||
-rw-r--r-- | lib/psych/visitors/yaml_tree.rb | 34 |
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 |