@@ -6,12 +6,12 @@ use std::sync::Mutex;
66use crate :: code_object:: { CodeObjectRegistry , CodeObjectWrapper } ;
77use crate :: ffi;
88use crate :: policy:: { self , OnRecorderError } ;
9+ use log:: { error, warn} ;
910use pyo3:: {
1011 prelude:: * ,
1112 types:: { PyAny , PyCode , PyModule } ,
1213} ;
1314use recorder_errors:: { usage, ErrorCode } ;
14- use log:: { error, warn} ;
1515
1616use super :: {
1717 acquire_tool_id, free_tool_id, monitoring_events, register_callback, set_events,
@@ -270,12 +270,10 @@ fn handle_callback_result(
270270) -> PyResult < Py < PyAny > > {
271271 match result {
272272 Ok ( CallbackOutcome :: Continue ) => Ok ( py. None ( ) ) ,
273- Ok ( CallbackOutcome :: DisableLocation ) => Ok (
274- guard
275- . as_ref ( )
276- . map ( |global| global. disable_sentinel . clone_ref ( py) )
277- . unwrap_or_else ( || py. None ( ) ) ,
278- ) ,
273+ Ok ( CallbackOutcome :: DisableLocation ) => Ok ( guard
274+ . as_ref ( )
275+ . map ( |global| global. disable_sentinel . clone_ref ( py) )
276+ . unwrap_or_else ( || py. None ( ) ) ) ,
279277 Err ( err) => handle_callback_error ( py, guard, err) ,
280278 }
281279}
@@ -310,62 +308,78 @@ fn handle_callback_error(
310308
311309fn uninstall_locked ( py : Python < ' _ > , guard : & mut Option < Global > ) -> PyResult < ( ) > {
312310 if let Some ( mut global) = guard. take ( ) {
313- let _ = global. tracer . finish ( py) ;
314- let events = monitoring_events ( py) ?;
315- if global. mask . contains ( & events. CALL ) {
316- register_callback ( py, & global. tool , & events. CALL , None ) ?;
317- }
318- if global. mask . contains ( & events. LINE ) {
319- register_callback ( py, & global. tool , & events. LINE , None ) ?;
320- }
321- if global. mask . contains ( & events. INSTRUCTION ) {
322- register_callback ( py, & global. tool , & events. INSTRUCTION , None ) ?;
323- }
324- if global. mask . contains ( & events. JUMP ) {
325- register_callback ( py, & global. tool , & events. JUMP , None ) ?;
326- }
327- if global. mask . contains ( & events. BRANCH ) {
328- register_callback ( py, & global. tool , & events. BRANCH , None ) ?;
329- }
330- if global. mask . contains ( & events. PY_START ) {
331- register_callback ( py, & global. tool , & events. PY_START , None ) ?;
332- }
333- if global. mask . contains ( & events. PY_RESUME ) {
334- register_callback ( py, & global. tool , & events. PY_RESUME , None ) ?;
335- }
336- if global. mask . contains ( & events. PY_RETURN ) {
337- register_callback ( py, & global. tool , & events. PY_RETURN , None ) ?;
338- }
339- if global. mask . contains ( & events. PY_YIELD ) {
340- register_callback ( py, & global. tool , & events. PY_YIELD , None ) ?;
341- }
342- if global. mask . contains ( & events. PY_THROW ) {
343- register_callback ( py, & global. tool , & events. PY_THROW , None ) ?;
344- }
345- if global. mask . contains ( & events. PY_UNWIND ) {
346- register_callback ( py, & global. tool , & events. PY_UNWIND , None ) ?;
347- }
348- if global. mask . contains ( & events. RAISE ) {
349- register_callback ( py, & global. tool , & events. RAISE , None ) ?;
350- }
351- if global. mask . contains ( & events. RERAISE ) {
352- register_callback ( py, & global. tool , & events. RERAISE , None ) ?;
353- }
354- if global. mask . contains ( & events. EXCEPTION_HANDLED ) {
355- register_callback ( py, & global. tool , & events. EXCEPTION_HANDLED , None ) ?;
356- }
357- // if global.mask.contains(&events.STOP_ITERATION) {
358- // register_callback(py, &global.tool, &events.STOP_ITERATION, None)?;
359- // }
360- if global. mask . contains ( & events. C_RETURN ) {
361- register_callback ( py, & global. tool , & events. C_RETURN , None ) ?;
362- }
363- if global. mask . contains ( & events. C_RAISE ) {
364- register_callback ( py, & global. tool , & events. C_RAISE , None ) ?;
311+ let finish_result = global. tracer . finish ( py) ;
312+
313+ let cleanup_result = ( || -> PyResult < ( ) > {
314+ let events = monitoring_events ( py) ?;
315+ if global. mask . contains ( & events. CALL ) {
316+ register_callback ( py, & global. tool , & events. CALL , None ) ?;
317+ }
318+ if global. mask . contains ( & events. LINE ) {
319+ register_callback ( py, & global. tool , & events. LINE , None ) ?;
320+ }
321+ if global. mask . contains ( & events. INSTRUCTION ) {
322+ register_callback ( py, & global. tool , & events. INSTRUCTION , None ) ?;
323+ }
324+ if global. mask . contains ( & events. JUMP ) {
325+ register_callback ( py, & global. tool , & events. JUMP , None ) ?;
326+ }
327+ if global. mask . contains ( & events. BRANCH ) {
328+ register_callback ( py, & global. tool , & events. BRANCH , None ) ?;
329+ }
330+ if global. mask . contains ( & events. PY_START ) {
331+ register_callback ( py, & global. tool , & events. PY_START , None ) ?;
332+ }
333+ if global. mask . contains ( & events. PY_RESUME ) {
334+ register_callback ( py, & global. tool , & events. PY_RESUME , None ) ?;
335+ }
336+ if global. mask . contains ( & events. PY_RETURN ) {
337+ register_callback ( py, & global. tool , & events. PY_RETURN , None ) ?;
338+ }
339+ if global. mask . contains ( & events. PY_YIELD ) {
340+ register_callback ( py, & global. tool , & events. PY_YIELD , None ) ?;
341+ }
342+ if global. mask . contains ( & events. PY_THROW ) {
343+ register_callback ( py, & global. tool , & events. PY_THROW , None ) ?;
344+ }
345+ if global. mask . contains ( & events. PY_UNWIND ) {
346+ register_callback ( py, & global. tool , & events. PY_UNWIND , None ) ?;
347+ }
348+ if global. mask . contains ( & events. RAISE ) {
349+ register_callback ( py, & global. tool , & events. RAISE , None ) ?;
350+ }
351+ if global. mask . contains ( & events. RERAISE ) {
352+ register_callback ( py, & global. tool , & events. RERAISE , None ) ?;
353+ }
354+ if global. mask . contains ( & events. EXCEPTION_HANDLED ) {
355+ register_callback ( py, & global. tool , & events. EXCEPTION_HANDLED , None ) ?;
356+ }
357+ // if global.mask.contains(&events.STOP_ITERATION) {
358+ // register_callback(py, &global.tool, &events.STOP_ITERATION, None)?;
359+ // }
360+ if global. mask . contains ( & events. C_RETURN ) {
361+ register_callback ( py, & global. tool , & events. C_RETURN , None ) ?;
362+ }
363+ if global. mask . contains ( & events. C_RAISE ) {
364+ register_callback ( py, & global. tool , & events. C_RAISE , None ) ?;
365+ }
366+
367+ set_events ( py, & global. tool , NO_EVENTS ) ?;
368+ free_tool_id ( py, & global. tool ) ?;
369+ Ok ( ( ) )
370+ } ) ( ) ;
371+
372+ if let Err ( err) = finish_result {
373+ if let Err ( cleanup_err) = cleanup_result {
374+ warn ! (
375+ "failed to reset monitoring callbacks after finish error: {}" ,
376+ cleanup_err
377+ ) ;
378+ }
379+ return Err ( err) ;
365380 }
366381
367- set_events ( py, & global. tool , NO_EVENTS ) ?;
368- free_tool_id ( py, & global. tool ) ?;
382+ cleanup_result?;
369383 }
370384 Ok ( ( ) )
371385}
0 commit comments