commit dcd7a7e4c33778d38dd8b1c4059d4b6c99add3fe
parent e459fc846862a1499f3acb2f8a2eb098344ee7ac
Author: William Morgan <wmorgan-sup@masanjin.net>
Date: Mon, 24 Aug 2009 18:32:39 -0400
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.
Diffstat:
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git 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