提交 b3f51e3b 编写于 作者: J José Valim

Merge pull request #1239 from alindeman/master

Use set data structure to speed up circular reference checks on large/deeply nested objects
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
require 'active_support/core_ext/time/conversions' require 'active_support/core_ext/time/conversions'
require 'active_support/core_ext/date_time/conversions' require 'active_support/core_ext/date_time/conversions'
require 'active_support/core_ext/date/conversions' require 'active_support/core_ext/date/conversions'
require 'set'
module ActiveSupport module ActiveSupport
class << self class << self
...@@ -39,7 +40,7 @@ class Encoder ...@@ -39,7 +40,7 @@ class Encoder
def initialize(options = nil) def initialize(options = nil)
@options = options @options = options
@seen = [] @seen = Set.new
end end
def encode(value, use_options = true) def encode(value, use_options = true)
...@@ -71,13 +72,12 @@ def escape(string) ...@@ -71,13 +72,12 @@ def escape(string)
private private
def check_for_circular_references(value) def check_for_circular_references(value)
if @seen.any? { |object| object.equal?(value) } unless @seen.add?(value.__id__)
raise CircularReferenceError, 'object references itself' raise CircularReferenceError, 'object references itself'
end end
@seen.unshift value
yield yield
ensure ensure
@seen.shift @seen.delete(value.__id__)
end end
end end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册