mirror of
https://github.com/github/rails.git
synced 2026-01-28 15:58:03 -05:00
Some performance tweaks to ActiveSupport::Memoizable
Signed-off-by: Joshua Peek <josh@joshpeek.com>
This commit is contained in:
@@ -7,10 +7,12 @@ module ActiveSupport
|
||||
module ClassMethods
|
||||
def memoize(symbol)
|
||||
original_method = "_unmemoized_#{symbol}"
|
||||
raise "Already memoized #{symbol}" if instance_methods.map(&:to_s).include?(original_method)
|
||||
|
||||
alias_method original_method, symbol
|
||||
class_eval <<-EOS, __FILE__, __LINE__
|
||||
def #{symbol}
|
||||
if instance_variable_defined?(:@#{symbol})
|
||||
if defined? @#{symbol}
|
||||
@#{symbol}
|
||||
else
|
||||
@#{symbol} = #{original_method}
|
||||
@@ -22,7 +24,7 @@ module ActiveSupport
|
||||
|
||||
def freeze
|
||||
methods.each do |method|
|
||||
if m = method.to_s.match(/^_unmemoized_(.*)/)
|
||||
if m = method.to_s.match(/\A_unmemoized_(.*)/)
|
||||
send(m[1]).freeze
|
||||
end
|
||||
end
|
||||
|
||||
@@ -41,5 +41,9 @@ uses_mocha 'Memoizable' do
|
||||
person.freeze
|
||||
assert_equal nil, person.age
|
||||
end
|
||||
|
||||
def test_double_memoization
|
||||
assert_raise(RuntimeError) { Person.memoize :name }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user