@@ -750,7 +750,7 @@ class UnwindRecorder(ExceptionRecorder):
750750 event_type = E .PY_UNWIND
751751
752752 def __call__ (self , code , offset , exc ):
753- self .events .append (("unwind" , type (exc )))
753+ self .events .append (("unwind" , type (exc ), code . co_name ))
754754
755755class ExceptionHandledRecorder (ExceptionRecorder ):
756756
@@ -766,8 +766,27 @@ class ThrowRecorder(ExceptionRecorder):
766766 def __call__ (self , code , offset , exc ):
767767 self .events .append (("throw" , type (exc )))
768768
769- class ExceptionMonitoringTest (CheckEvents ):
769+ class CallRecorder :
770+
771+ event_type = E .CALL
772+
773+ def __init__ (self , events ):
774+ self .events = events
775+
776+ def __call__ (self , code , offset , func , arg ):
777+ self .events .append (("call" , func .__name__ , arg ))
778+
779+ class ReturnRecorder :
780+
781+ event_type = E .PY_RETURN
782+
783+ def __init__ (self , events ):
784+ self .events = events
770785
786+ def __call__ (self , code , offset , val ):
787+ self .events .append (("return" , code .co_name , val ))
788+
789+ class ExceptionMonitoringTest (CheckEvents ):
771790
772791 exception_recorders = (
773792 ExceptionRecorder ,
@@ -936,26 +955,48 @@ def func():
936955 )
937956 self .assertEqual (events [0 ], ("throw" , IndexError ))
938957
939- class LineRecorder :
958+ def test_no_unwind_for_shim_frame ( self ) :
940959
941- event_type = E .LINE
960+ class B :
961+ def __init__ (self ):
962+ raise ValueError ()
963+
964+ def f ():
965+ try :
966+ return B ()
967+ except ValueError :
968+ pass
942969
970+ for _ in range (100 ):
971+ f ()
972+ recorders = (
973+ ReturnRecorder ,
974+ UnwindRecorder
975+ )
976+ events = self .get_events (f , TEST_TOOL , recorders )
977+ adaptive_insts = dis .get_instructions (f , adaptive = True )
978+ self .assertIn (
979+ "CALL_ALLOC_AND_ENTER_INIT" ,
980+ [i .opname for i in adaptive_insts ]
981+ )
982+ #There should be only one unwind event
983+ expected = [
984+ ('unwind' , ValueError , '__init__' ),
985+ ('return' , 'f' , None ),
986+ ]
943987
944- def __init__ (self , events ):
945- self .events = events
988+ self .assertEqual (events , expected )
946989
947- def __call__ (self , code , line ):
948- self .events .append (("line" , code .co_name , line - code .co_firstlineno ))
990+ class LineRecorder :
949991
950- class CallRecorder :
992+ event_type = E . LINE
951993
952- event_type = E .CALL
953994
954995 def __init__ (self , events ):
955996 self .events = events
956997
957- def __call__ (self , code , offset , func , arg ):
958- self .events .append (("call " , func . __name__ , arg ))
998+ def __call__ (self , code , line ):
999+ self .events .append (("line " , code . co_name , line - code . co_firstlineno ))
9591000
9601001class CEventRecorder :
9611002
@@ -1351,15 +1392,6 @@ class BranchRecorder(JumpRecorder):
13511392 event_type = E .BRANCH
13521393 name = "branch"
13531394
1354- class ReturnRecorder :
1355-
1356- event_type = E .PY_RETURN
1357-
1358- def __init__ (self , events ):
1359- self .events = events
1360-
1361- def __call__ (self , code , offset , val ):
1362- self .events .append (("return" , val ))
13631395
13641396
13651397JUMP_AND_BRANCH_RECORDERS = JumpRecorder , BranchRecorder
@@ -1449,11 +1481,11 @@ def func():
14491481 ('branch' , 'func' , 4 , 4 ),
14501482 ('line' , 'func' , 5 ),
14511483 ('line' , 'meth' , 1 ),
1452- ('return' , None ),
1484+ ('return' , 'meth' , None ),
14531485 ('jump' , 'func' , 5 , 5 ),
14541486 ('jump' , 'func' , 5 , '[offset=114]' ),
14551487 ('branch' , 'func' , '[offset=120]' , '[offset=124]' ),
1456- ('return' , None ),
1488+ ('return' , 'func' , None ),
14571489 ('line' , 'get_events' , 11 )])
14581490
14591491class TestLoadSuperAttr (CheckEvents ):
0 commit comments