@@ -5,15 +5,19 @@ class Hook
5
5
# Delegation methods for Ruby 3.
6
6
class Method
7
7
def call ( receiver , *args , **kwargs , &block )
8
- call_event = trace? && with_disabled_hook { before_hook receiver , *args , **kwargs }
8
+ call_event = false
9
+ if trace?
10
+ call_event , elapsed_before = with_disabled_hook { before_hook receiver , *args , **kwargs }
11
+ end
9
12
# note we can't short-circuit directly to do_call because then the call stack
10
13
# depth changes and eval handler doesn't work correctly
11
- trace_call call_event , receiver , *args , **kwargs , &block
14
+ trace_call call_event , elapsed_before , receiver , *args , **kwargs , &block
12
15
end
13
16
14
17
protected
15
18
16
19
def before_hook ( receiver , *args , **kwargs )
20
+ before_hook_start_time = gettime
17
21
args = [ *args , kwargs ] if !kwargs . empty? || keyrest?
18
22
call_event = handle_call ( receiver , args )
19
23
if call_event
@@ -23,7 +27,7 @@ def before_hook(receiver, *args, **kwargs)
23
27
defined_class : defined_class ,
24
28
method : hook_method
25
29
end
26
- call_event
30
+ [ call_event , gettime - before_hook_start_time ]
27
31
end
28
32
29
33
def keyrest?
@@ -35,7 +39,7 @@ def do_call(receiver, *args, **kwargs, &block)
35
39
end
36
40
37
41
# rubocop:disable Metrics/MethodLength
38
- def trace_call ( call_event , receiver , *args , **kwargs , &block )
42
+ def trace_call ( call_event , elapsed_before , receiver , *args , **kwargs , &block )
39
43
return do_call ( receiver , *args , **kwargs , &block ) unless call_event
40
44
41
45
start_time = gettime
@@ -45,7 +49,8 @@ def trace_call(call_event, receiver, *args, **kwargs, &block)
45
49
exception = $ERROR_INFO
46
50
raise
47
51
ensure
48
- with_disabled_hook { after_hook receiver , call_event , gettime - start_time , return_value , exception } \
52
+ after_start_time = gettime
53
+ with_disabled_hook { after_hook receiver , call_event , elapsed_before , after_start_time - start_time , after_start_time , return_value , exception } \
49
54
if call_event
50
55
end
51
56
end
0 commit comments