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:
commit
b3f51e3b1c
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue