lib/nanoc/base/memoization.rb in nanoc-4.7.0 vs lib/nanoc/base/memoization.rb in nanoc-4.7.1
- old
+ new
@@ -3,27 +3,10 @@
module Nanoc::Int
# Adds support for memoizing functions.
#
# @api private
module Memoization
- class Wrapper
- attr_reader :ref
-
- def initialize(ref)
- @ref = ref
- end
-
- def inspect
- obj = @ref.object
- if obj
- obj.inspect
- else
- '<garbage collected>'
- end
- end
- end
-
class Value
attr_reader :value
def initialize(value)
@value = value
@@ -67,23 +50,23 @@
# @return [void]
def memoize(method_name)
original_method_name = '__nonmemoized_' + method_name.to_s
alias_method original_method_name, method_name
+ instance_cache = Hash.new { |hash, key| hash[key] = {} }
+
define_method(method_name) do |*args|
- @__memoization_cache ||= {}
- @__memoization_cache[method_name] ||= {}
- method_cache = @__memoization_cache[method_name]
+ instance_method_cache = instance_cache[self]
value = NONE
- if method_cache.key?(args)
- object = method_cache[args].ref.object
+ if instance_method_cache.key?(args)
+ object = instance_method_cache[args].object
value = object ? object.value : NONE
end
if value.equal?(NONE)
send(original_method_name, *args).tap do |r|
- method_cache[args] = Wrapper.new(Ref::SoftReference.new(Value.new(r)))
+ instance_method_cache[args] = Ref::SoftReference.new(Value.new(r))
end
else
value
end
end