Fixed memory leak with Active Record classes when Dependencies.mechanism =...

Fixed memory leak with Active Record classes when Dependencies.mechanism = :load #1704 [c.r.mcgrath@gmail.com]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2276 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
上级 8a35865b
*SVN*
* Fixed memory leak with Active Record classes when Dependencies.mechanism = :load #1704 [c.r.mcgrath@gmail.com]
* Fixed Inflector.underscore for use with acronyms, so HTML becomes html instead of htm_l #2173 [k@v2studio.com]
* Fixed dependencies related infinite recursion bug when a controller file does not contain a controller class. Closes #1760. [rcolli2@tampabay.rr.com]
......
class Object #:nodoc:
def remove_subclasses_of(*superclasses)
subclasses_of(*superclasses).each do |subclass|
subclass.instance_variables.each { |v| subclass.send(:remove_instance_variable, v) }
Object.send(:remove_const, subclass.to_s) rescue nil
end
end
def remove_instance_variables_of(klass)
ObjectSpace.each_object(Class) do |k|
if k.to_s == klass
k.instance_variables.each { |v| k.send(:remove_instance_variable, v) }
end
end
end
def subclasses_of(*superclasses)
subclasses = []
ObjectSpace.each_object(Class) do |k|
......
......@@ -5,27 +5,6 @@ class ClassA; end
class ClassB < ClassA; end
class ClassC < ClassB; end
class ClassD < ClassA; end
class RemoveSubsTestClass; end
class RemoveSubsBaseClass
def self.add_ivar
@ivar = RemoveSubsTestClass.new
end
end
class RemoveSubsSubClass < RemoveSubsBaseClass; end
class RemoveSubsTestClass2; end
class RemoveSubsBaseClass2
def self.add_ivar
@ivar = RemoveSubsTestClass2.new
end
end
class RemoveSubsSubClass2 < RemoveSubsBaseClass2; end
class RemoveSubsTestClass3; end
class RemoveSubsBaseClass3
def self.add_ivar
@ivar = RemoveSubsTestClass3.new
end
end
class RemoveSubsSubClass3 < RemoveSubsBaseClass3; end
class ClassExtTest < Test::Unit::TestCase
def test_methods
......@@ -51,29 +30,4 @@ def test_suppress_supresses
suppress(LoadError, ArgumentError) { raise LoadError }
suppress(LoadError, ArgumentError) { raise ArgumentError }
end
def test_remove_subclasses_of_unsets_ivars
r = RemoveSubsSubClass.new
RemoveSubsSubClass.add_ivar
RemoveSubsBaseClass.remove_subclasses
GC.start
ObjectSpace.each_object do |o|
flunk("ObjectSpace still contains RemoveSubsTestClass") if o.class == RemoveSubsTestClass
end
end
def test_remove_subclasses_of_multiple_classes_unsets_ivars
r2 = RemoveSubsSubClass2.new
RemoveSubsSubClass2.add_ivar
r3 = RemoveSubsSubClass3.new
RemoveSubsSubClass3.add_ivar
Object.remove_subclasses_of(RemoveSubsBaseClass2, RemoveSubsBaseClass3)
GC.start
ObjectSpace.each_object do |o|
flunk("ObjectSpace still contains RemoveSubsTestClass") if o.class == RemoveSubsTestClass
end
end
end
......@@ -38,6 +38,7 @@ def dispatch(cgi = CGI.new, session_options = ActionController::CgiRequest::DEFA
def reset_application!
Controllers.clear!
Dependencies.clear
ActiveRecord::Base.reset_subclasses
Dependencies.remove_subclasses_for(ActiveRecord::Base, ActiveRecord::Observer, ActionController::Base)
Dependencies.remove_subclasses_for(ActionMailer::Base) if defined?(ActionMailer::Base)
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册