@@ -58,7 +58,7 @@ def start_trace(self, tracefunc):
58
58
E = sys .monitoring .events
59
59
all_events = 0
60
60
for event , cb_name in self .EVENT_CALLBACK_MAP .items ():
61
- callback = getattr (self , f'{ cb_name } _callback' )
61
+ callback = self . callback_wrapper ( getattr (self , f'{ cb_name } _callback' ), event )
62
62
sys .monitoring .register_callback (self ._tool_id , event , callback )
63
63
if event != E .INSTRUCTION :
64
64
all_events |= event
@@ -82,19 +82,22 @@ def restart_events(self):
82
82
if sys .monitoring .get_tool (self ._tool_id ) == self ._name :
83
83
sys .monitoring .restart_events ()
84
84
85
- def callback_wrapper (func ):
85
+ def callback_wrapper (self , func , event ):
86
86
import functools
87
87
88
88
@functools .wraps (func )
89
- def wrapper (self , * args ):
89
+ def wrapper (* args ):
90
90
if self ._tracing_thread != threading .current_thread ():
91
91
return
92
92
try :
93
93
frame = sys ._getframe ().f_back
94
- ret = func (self , frame , * args )
94
+ ret = func (frame , * args )
95
95
if self ._enabled and frame .f_trace :
96
96
self .update_local_events ()
97
- if self ._disable_current_event :
97
+ if (
98
+ self ._disable_current_event
99
+ and event not in (E .PY_THROW , E .PY_UNWIND , E .RAISE )
100
+ ):
98
101
return sys .monitoring .DISABLE
99
102
else :
100
103
return ret
@@ -107,30 +110,25 @@ def wrapper(self, *args):
107
110
108
111
return wrapper
109
112
110
- @callback_wrapper
111
113
def call_callback (self , frame , code , * args ):
112
114
local_tracefunc = self ._tracefunc (frame , 'call' , None )
113
115
if local_tracefunc is not None :
114
116
frame .f_trace = local_tracefunc
115
117
if self ._enabled :
116
118
sys .monitoring .set_local_events (self ._tool_id , code , self .LOCAL_EVENTS )
117
119
118
- @callback_wrapper
119
120
def return_callback (self , frame , code , offset , retval ):
120
121
if frame .f_trace :
121
122
frame .f_trace (frame , 'return' , retval )
122
123
123
- @callback_wrapper
124
124
def unwind_callback (self , frame , code , * args ):
125
125
if frame .f_trace :
126
126
frame .f_trace (frame , 'return' , None )
127
127
128
- @callback_wrapper
129
128
def line_callback (self , frame , code , * args ):
130
129
if frame .f_trace and frame .f_trace_lines :
131
130
frame .f_trace (frame , 'line' , None )
132
131
133
- @callback_wrapper
134
132
def jump_callback (self , frame , code , inst_offset , dest_offset ):
135
133
if dest_offset > inst_offset :
136
134
return sys .monitoring .DISABLE
@@ -141,7 +139,6 @@ def jump_callback(self, frame, code, inst_offset, dest_offset):
141
139
if frame .f_trace and frame .f_trace_lines :
142
140
frame .f_trace (frame , 'line' , None )
143
141
144
- @callback_wrapper
145
142
def exception_callback (self , frame , code , offset , exc ):
146
143
if frame .f_trace :
147
144
if exc .__traceback__ and hasattr (exc .__traceback__ , 'tb_frame' ):
@@ -152,7 +149,6 @@ def exception_callback(self, frame, code, offset, exc):
152
149
tb = tb .tb_next
153
150
frame .f_trace (frame , 'exception' , (type (exc ), exc , exc .__traceback__ ))
154
151
155
- @callback_wrapper
156
152
def opcode_callback (self , frame , code , offset ):
157
153
if frame .f_trace and frame .f_trace_opcodes :
158
154
frame .f_trace (frame , 'opcode' , None )
0 commit comments