Merge pull request #1239 from alindeman/master

Use set data structure to speed up circular reference checks on large/deeply nested objects
This commit is contained in:
José Valim 2011-05-24 12:59:06 -07:00
commit b3f51e3b1c
1 changed files with 4 additions and 4 deletions

View File

@ -14,6 +14,7 @@ require 'time'
require 'active_support/core_ext/time/conversions'
require 'active_support/core_ext/date_time/conversions'
require 'active_support/core_ext/date/conversions'
require 'set'
module ActiveSupport
class << self
@ -39,7 +40,7 @@ module ActiveSupport
def initialize(options = nil)
@options = options
@seen = []
@seen = Set.new
end
def encode(value, use_options = true)
@ -71,13 +72,12 @@ module ActiveSupport
private
def check_for_circular_references(value)
if @seen.any? { |object| object.equal?(value) }
unless @seen.add?(value.__id__)
raise CircularReferenceError, 'object references itself'
end
@seen.unshift value
yield
ensure
@seen.shift
@seen.delete(value.__id__)
end
end