31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
# File 'lib/appmap/hook/method.rb', line 31
def activate
if Hook::LOG
msg = if method_display_name
"#{method_display_name}"
else
"#{hook_method.name} (class resolution deferred)"
end
warn "AppMap: Hooking " + msg
end
defined_class = @defined_class
hook_package = self.hook_package
hook_method = self.hook_method
before_hook = self.method(:before_hook)
after_hook = self.method(:after_hook)
with_disabled_hook = self.method(:with_disabled_hook)
hook_method_def = nil
hook_class.instance_eval do
hook_method_def = Proc.new do |*args, &block|
instance_method = hook_method.bind(self).to_proc
call_instance_method = -> { instance_method.call(*args, &block) }
defined_class, = Hook.qualify_method_name(hook_method) unless defined_class
reentrant = Thread.current[HOOK_DISABLE_KEY]
disabled_by_shallow_flag = \
-> { hook_package&.shallow? && AppMap.tracing.last_package_for_current_thread == hook_package }
enabled = true if AppMap.tracing.enabled? && !reentrant && !disabled_by_shallow_flag.call
return call_instance_method.call unless enabled
call_event, start_time = with_disabled_hook.call do
before_hook.call(self, defined_class, args)
end
return_value = nil
exception = nil
begin
return_value = call_instance_method.call
rescue
exception = $ERROR_INFO
raise
ensure
with_disabled_hook.call do
after_hook.call(self, call_event, start_time, return_value, exception)
end
end
end
end
hook_class.define_method_with_arity(hook_method.name, hook_method.arity, hook_method_def)
end
|