diff options
author | Andy Lindeman <andy@highgroove.com> | 2011-05-23 17:50:48 -0400 |
---|---|---|
committer | Andy Lindeman <andy@highgroove.com> | 2011-05-23 17:50:48 -0400 |
commit | 2213479a12533e0f980843e1db37f0fd3dc68d03 (patch) | |
tree | 961f8b379cc049734798d0e4dc94c4cbe52bf07f | |
parent | 1170cceaaec8c0c8aef173913405be1456e4b2be (diff) | |
download | rails-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
-rw-r--r-- | activesupport/lib/active_support/json/encoding.rb | 8 |
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 |