From 2213479a12533e0f980843e1db37f0fd3dc68d03 Mon Sep 17 00:00:00 2001 From: Andy Lindeman Date: Mon, 23 May 2011 17:50:48 -0400 Subject: Use set data structure to speed up circular reference checks on large/deeply nested objects --- activesupport/lib/active_support/json/encoding.rb | 8 ++++---- 1 file 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 -- cgit v1.2.3