aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorAndy Lindeman <andy@highgroove.com>2011-05-23 17:50:48 -0400
committerAndy Lindeman <andy@highgroove.com>2011-05-23 17:50:48 -0400
commit2213479a12533e0f980843e1db37f0fd3dc68d03 (patch)
tree961f8b379cc049734798d0e4dc94c4cbe52bf07f /activesupport
parent1170cceaaec8c0c8aef173913405be1456e4b2be (diff)
downloadrails-2213479a12533e0f980843e1db37f0fd3dc68d03.tar.gz
rails-2213479a12533e0f980843e1db37f0fd3dc68d03.tar.bz2
rails-2213479a12533e0f980843e1db37f0fd3dc68d03.zip
Use set data structure to speed up circular reference checks on large/deeply nested objects
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/lib/active_support/json/encoding.rb8
1 files changed, 4 insertions, 4 deletions
diff --git a/activesupport/lib/active_support/json/encoding.rb b/activesupport/lib/active_support/json/encoding.rb
index d22fe14b33..c2c45e9f9d 100644
--- a/activesupport/lib/active_support/json/encoding.rb
+++ b/activesupport/lib/active_support/json/encoding.rb
@@ -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