From: William Morgan Date: Mon, 24 Aug 2009 22:32:39 +0000 (-0400) Subject: fix proc locals, which must use the old method trick X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;ds=sidebyside;h=dcd7a7e4c33778d38dd8b1c4059d4b6c99add3fe;p=sup fix proc locals, which must use the old method trick For hook locals that are specified as procs (usually for performance reasons), use methods instead of local variables. Sadly you don't get all the regular variable semantics, but it is the only option for delayed evaluation AFAICT. --- diff --git a/lib/sup/hook.rb b/lib/sup/hook.rb index 0fa4169..d3d2ba8 100644 --- a/lib/sup/hook.rb +++ b/lib/sup/hook.rb @@ -5,6 +5,7 @@ class HookManager def initialize name @__say_id = nil @__name = name + @__cache = {} end def say s @@ -39,7 +40,18 @@ class HookManager def __run __hook, __filename, __locals __binding = binding - eval __locals.map { |k, v| "#{k} = __locals[#{k.inspect}];" }.join, __binding + __lprocs, __lvars = __locals.partition { |k, v| v.is_a?(Proc) } + eval __lvars.map { |k, v| "#{k} = __locals[#{k.inspect}];" }.join, __binding + ## we also support closures for delays evaluation. unfortunately + ## we have to do this via method calls, so you don't get all the + ## semantics of a regular variable. not ideal. + __lprocs.each do |k, v| + self.class.instance_eval do + define_method k do + @__cache[k] ||= v.call + end + end + end ret = eval __hook, __binding, __filename BufferManager.clear @__say_id if @__say_id ret