@@ -1425,12 +1425,13 @@ def line_from_offset(code, offset):
14251425 return line - code .co_firstlineno
14261426 return - 1
14271427
1428+
14281429class JumpRecorder :
14291430
14301431 event_type = E .JUMP
14311432 name = "jump"
14321433
1433- def __init__ (self , events ):
1434+ def __init__ (self , events , offsets = False ):
14341435 self .events = events
14351436
14361437 def __call__ (self , code , from_ , to ):
@@ -1444,11 +1445,44 @@ class BranchRecorder(JumpRecorder):
14441445 event_type = E .BRANCH
14451446 name = "branch"
14461447
1448+ class BranchTakenRecorder (JumpRecorder ):
1449+
1450+ event_type = E .BRANCH_TAKEN
1451+ name = "branch taken"
1452+
1453+ class BranchNotTakenRecorder (JumpRecorder ):
1454+
1455+ event_type = E .BRANCH_NOT_TAKEN
1456+ name = "branch not taken"
1457+
1458+
1459+ class JumpOffsetRecorder :
1460+
1461+ event_type = E .JUMP
1462+ name = "jump"
1463+
1464+ def __init__ (self , events , offsets = False ):
1465+ self .events = events
1466+
1467+ def __call__ (self , code , from_ , to ):
1468+ self .events .append ((self .name , code .co_name , from_ , to ))
1469+
1470+ class BranchTakenOffsetRecorder (JumpOffsetRecorder ):
1471+
1472+ event_type = E .BRANCH_TAKEN
1473+ name = "branch taken"
1474+
1475+ class BranchNotTakenOffsetRecorder (JumpOffsetRecorder ):
1476+
1477+ event_type = E .BRANCH_NOT_TAKEN
1478+ name = "branch not taken"
14471479
14481480
14491481JUMP_AND_BRANCH_RECORDERS = JumpRecorder , BranchRecorder
14501482JUMP_BRANCH_AND_LINE_RECORDERS = JumpRecorder , BranchRecorder , LineRecorder
14511483FLOW_AND_LINE_RECORDERS = JumpRecorder , BranchRecorder , LineRecorder , ExceptionRecorder , ReturnRecorder
1484+ BRANCHES_RECORDERS = BranchTakenRecorder , BranchNotTakenRecorder
1485+ BRANCH_OFFSET_RECORDERS = BranchTakenOffsetRecorder , BranchNotTakenOffsetRecorder
14521486
14531487class TestBranchAndJumpEvents (CheckEvents ):
14541488 maxDiff = None
@@ -1493,6 +1527,20 @@ def func():
14931527 ('line' , 'func' , 7 ),
14941528 ('line' , 'get_events' , 11 )])
14951529
1530+ self .check_events (func , recorders = BRANCHES_RECORDERS , expected = [
1531+ ('branch not taken' , 'func' , 2 , 2 ),
1532+ ('branch taken' , 'func' , 3 , 6 ),
1533+ ('branch not taken' , 'func' , 2 , 2 ),
1534+ ('branch not taken' , 'func' , 3 , 4 ),
1535+ ('branch taken' , 'func' , 2 , 7 )])
1536+
1537+ self .check_events (func , recorders = BRANCH_OFFSET_RECORDERS , expected = [
1538+ ('branch not taken' , 'func' , 28 , 34 ),
1539+ ('branch taken' , 'func' , 46 , 60 ),
1540+ ('branch not taken' , 'func' , 28 , 34 ),
1541+ ('branch not taken' , 'func' , 46 , 52 ),
1542+ ('branch taken' , 'func' , 28 , 72 )])
1543+
14961544 def test_except_star (self ):
14971545
14981546 class Foo :
0 commit comments