Some performance tweaks to ActiveSupport::Memoizable

Signed-off-by: Joshua Peek <josh@joshpeek.com>
This commit is contained in:
Tarmo Tänav
2008-07-14 20:23:23 -05:00
committed by Joshua Peek
parent 001c8beb4d
commit 911c2c3813
2 changed files with 8 additions and 2 deletions

View File

@@ -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

View File

@@ -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