diff options
Diffstat (limited to 'activerecord')
-rwxr-xr-x | activerecord/lib/active_record/base.rb | 4 | ||||
-rwxr-xr-x | activerecord/test/base_test.rb | 19 |
2 files changed, 23 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 81683b7dae..b5d2129fba 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -258,6 +258,10 @@ module ActiveRecord #:nodoc: end def self.reset_subclasses + subclasses.each do |klass| + klass.instance_variables.each { |var| klass.send(:remove_instance_variable, var) } + klass.instance_methods(false).each { |m| klass.send :undef_method, m } + end @@subclasses.clear end diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb index 9b5ce8a8ce..ae443c5329 100755 --- a/activerecord/test/base_test.rb +++ b/activerecord/test/base_test.rb @@ -1024,6 +1024,25 @@ class BasicsTest < Test::Unit::TestCase assert_nothing_raised { Category.new.send(:interpolate_sql, 'foo bar} baz') } end + def test_dev_mode_memory_leak + counts = [] + 2.times do + require_dependency 'fixtures/company' + Firm.find(:first) + Dependencies.clear + ActiveRecord::Base.reset_subclasses + Dependencies.remove_subclasses_for(ActiveRecord::Base) + + GC.start + + count = 0 + ObjectSpace.each_object(Proc) { count += 1 } + counts << count + end + assert counts.last <= counts.first, + "expected last count (#{counts.last}) to be <= first count (#{counts.first})" + end + private def assert_readers(model, exceptions) |