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