10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Testing the line trace facility. 20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support 40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest 50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport sys 60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport difflib 70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport gc 80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# A very basic example. If this fails, we're in deep trouble. 100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef basic(): 110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 1 120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yibasic.events = [(0, 'call'), 140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'return')] 160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Many of the tests below are tricky because they involve pass statements. 180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# If there is implicit control flow around a pass statement (in an except 190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# clause or else caluse) under what conditions do you set a line number 200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# following that clause? 210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# The entire "while 0:" statement is optimized away. No code 240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# exists for it, so the line numbers skip directly from "del x" 250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# to "x = 1". 260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef arigo_example(): 270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del x 290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while 0: 300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiarigo_example.events = [(0, 'call'), 340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (5, 'line'), 370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (5, 'return')] 380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# check that lines consisting of just one instruction get traced: 400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef one_instr_line(): 410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del x 430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yione_instr_line.events = [(0, 'call'), 460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'return')] 500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_pop_tops(): # 0 520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 # 1 530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for a in range(2): # 2 540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if a: # 3 550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 # 4 560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: # 5 570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 # 6 580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_pop_tops.events = [(0, 'call'), 600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (6, 'line'), 640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'return')] 690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_pop_blocks(): 710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = 1 720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while not y: 730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bla 740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_pop_blocks.events = [(0, 'call'), 770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'return')] 810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef called(): # line -3 830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef call(): # line 0 860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi called() 870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yicall.events = [(0, 'call'), 890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-3, 'call'), 910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-2, 'line'), 920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-2, 'return'), 930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'return')] 940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef raises(): 960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise Exception 970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_raise(): 990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raises() 1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except Exception, exc: 1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_raise.events = [(0, 'call'), 1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-3, 'call'), 1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-2, 'line'), 1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-2, 'exception'), 1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-2, 'return'), 1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'exception'), 1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'return')] 1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _settrace_and_return(tracefunc): 1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(tracefunc) 1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys._getframe().f_back.f_trace = tracefunc 1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef settrace_and_return(tracefunc): 1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _settrace_and_return(tracefunc) 1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yisettrace_and_return.events = [(1, 'return')] 1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _settrace_and_raise(tracefunc): 1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(tracefunc) 1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys._getframe().f_back.f_trace = tracefunc 1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise RuntimeError 1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef settrace_and_raise(tracefunc): 1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _settrace_and_raise(tracefunc) 1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except RuntimeError, exc: 1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yisettrace_and_raise.events = [(2, 'exception'), 1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'return')] 1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# implicit return example 1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# This test is interesting because of the else: pass 1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# part of the code. The code generate for the true 1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# part of the if contains a jump past the else branch. 1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# The compiler then generates an implicit "return None" 1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Internally, the compiler visits the pass statement 1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# and stores its line number for use on the next instruction. 1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# The next instruction is the implicit return None. 1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef ireturn_example(): 1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = 5 1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = 5 1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if a == b: 1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = a+1 1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiireturn_example.events = [(0, 'call'), 1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (6, 'line'), 1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (6, 'return')] 1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Tight loop with while(1) example (SF #765624) 1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef tightloop_example(): 1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi items = range(0, 3) 1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi i = 0 1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while 1: 1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = items[i]; i+=1 1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except IndexError: 1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitightloop_example.events = [(0, 'call'), 1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (5, 'line'), 1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (5, 'line'), 1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (5, 'line'), 1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (5, 'line'), 1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (5, 'exception'), 1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (6, 'line'), 1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (7, 'line'), 1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (7, 'return')] 1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef tighterloop_example(): 1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi items = range(1, 4) 1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi i = 0 1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while 1: i = items[i] 1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except IndexError: 1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitighterloop_example.events = [(0, 'call'), 1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'exception'), 2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (5, 'line'), 2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (6, 'line'), 2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (6, 'return')] 2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef generator_function(): 2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi yield True 2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "continued" 2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "finally" 2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef generator_example(): 2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # any() will leave the generator before its end 2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = any(generator_function()) 2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # the following lines were not traced 2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for x in range(10): 2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = x 2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yigenerator_example.events = ([(0, 'call'), 2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-6, 'call'), 2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-5, 'line'), 2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-4, 'line'), 2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-4, 'return'), 2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-4, 'call'), 2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-4, 'exception'), 2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-1, 'line'), 2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (-1, 'return')] + 2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi [(5, 'line'), (6, 'line')] * 10 + 2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi [(5, 'line'), (5, 'return')]) 2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass Tracer: 2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.events = [] 2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def trace(self, frame, event, arg): 2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.events.append((frame.f_lineno, event)) 2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.trace 2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def traceWithGenexp(self, frame, event, arg): 2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (o for o in [1]) 2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.events.append((frame.f_lineno, event)) 2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.trace 2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TraceTestCase(unittest.TestCase): 2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Disable gc collection when tracing, otherwise the 2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # deallocators may be traced as well. 2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setUp(self): 2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.using_gc = gc.isenabled() 2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi gc.disable() 2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def tearDown(self): 2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self.using_gc: 2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi gc.enable() 2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def compare_events(self, line_offset, events, expected_events): 2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi events = [(l - line_offset, e) for (l, e) in events] 2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if events != expected_events: 2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail( 2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "events did not match expectation:\n" + 2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "\n".join(difflib.ndiff([str(x) for x in expected_events], 2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi [str(x) for x in events]))) 2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def run_and_compare(self, func, events): 2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tracer = Tracer() 2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(tracer.trace) 2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi func() 2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(None) 2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.compare_events(func.func_code.co_firstlineno, 2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tracer.events, events) 2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def run_test(self, func): 2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_and_compare(func, func.events) 2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def run_test2(self, func): 2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tracer = Tracer() 2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi func(tracer.trace) 2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(None) 2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.compare_events(func.func_code.co_firstlineno, 2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tracer.events, func.events) 2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_set_and_retrieve_none(self): 2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(None) 2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi assert sys.gettrace() is None 2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_set_and_retrieve_func(self): 2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def fn(*args): 2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(fn) 2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi assert sys.gettrace() is fn 2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(None) 2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_01_basic(self): 3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(basic) 3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_02_arigo(self): 3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(arigo_example) 3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_03_one_instr(self): 3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(one_instr_line) 3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_04_no_pop_blocks(self): 3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_pop_blocks) 3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_05_no_pop_tops(self): 3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_pop_tops) 3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_06_call(self): 3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(call) 3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_07_raise(self): 3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(test_raise) 3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_08_settrace_and_return(self): 3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test2(settrace_and_return) 3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_09_settrace_and_raise(self): 3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test2(settrace_and_raise) 3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_10_ireturn(self): 3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(ireturn_example) 3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_11_tightloop(self): 3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(tightloop_example) 3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_12_tighterloop(self): 3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(tighterloop_example) 3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_13_genexp(self): 3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(generator_example) 3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # issue1265: if the trace function contains a generator, 3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # and if the traced function contains another generator 3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # that is not completely exhausted, the trace stopped. 3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Worse: the 'finally' clause was not invoked. 3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tracer = Tracer() 3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(tracer.traceWithGenexp) 3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi generator_example() 3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(None) 3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.compare_events(generator_example.__code__.co_firstlineno, 3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tracer.events, generator_example.events) 3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_14_onliner_if(self): 3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def onliners(): 3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if True: False 3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: True 3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 0 3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_and_compare( 3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi onliners, 3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi [(0, 'call'), 3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'return')]) 3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_15_loops(self): 3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # issue1750076: "while" expression is skipped by debugger 3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def for_example(): 3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for x in range(2): 3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_and_compare( 3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for_example, 3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi [(0, 'call'), 3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'line'), 3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (1, 'return')]) 3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def while_example(): 3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # While expression should be traced on every loop 3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 2 3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while x > 0: 3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x -= 1 3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_and_compare( 3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while_example, 3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi [(0, 'call'), 3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (2, 'line'), 3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (4, 'line'), 3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'line'), 3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (3, 'return')]) 3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_16_blank_lines(self): 3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi exec("def f():\n" + "\n" * 256 + " pass") 3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_and_compare( 3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f, 3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi [(0, 'call'), 3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (257, 'line'), 3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (257, 'return')]) 3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass RaisingTraceFuncTestCase(unittest.TestCase): 3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def trace(self, frame, event, arg): 3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """A trace function that raises an exception in response to a 3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi specific trace event.""" 3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if event == self.raiseOnEvent: 3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise ValueError # just something that isn't RuntimeError 3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.trace 3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def f(self): 4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """The function to trace; raises an exception if that's the case 4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi we're testing, so that the 'exception' trace event fires.""" 4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self.raiseOnEvent == 'exception': 4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 0 4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = 1 // x 4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 1 4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def run_test_for_event(self, event): 4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Tests that an exception raised in response to the given event is 4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi handled OK.""" 4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.raiseOnEvent = event 4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in xrange(sys.getrecursionlimit() + 1): 4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(self.trace) 4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.f() 4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: 4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("exception not raised!") 4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except RuntimeError: 4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("recursion counter not reset") 4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test the handling of exceptions raised by each kind of trace event. 4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_call(self): 4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test_for_event('call') 4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_line(self): 4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test_for_event('line') 4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_return(self): 4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test_for_event('return') 4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_exception(self): 4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test_for_event('exception') 4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_trash_stack(self): 4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def f(): 4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(5): 4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi print i # line tracing will raise an exception at this line 4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def g(frame, why, extra): 4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if (why == 'line' and 4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi frame.f_lineno == f.func_code.co_firstlineno + 2): 4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise RuntimeError, "i am crashing" 4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return g 4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(g) 4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f() 4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except RuntimeError: 4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # the test is really that this doesn't segfault: 4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import gc 4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi gc.collect() 4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("exception not propagated") 4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# 'Jump' tests: assigning to frame.f_lineno within a trace function 4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# moves the execution position - it's how debuggers implement a Jump 4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# command (aka. "Set next statement"). 4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass JumpTracer: 4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Defines a trace function that jumps from one place to another, 4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with the source and destination lines of the jump being defined by 4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi the 'jump' property of the function under test.""" 4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, function): 4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.function = function 4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.jumpFrom = function.jump[0] 4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.jumpTo = function.jump[1] 4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.done = False 4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def trace(self, frame, event, arg): 4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not self.done and frame.f_code == self.function.func_code: 4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi firstLine = frame.f_code.co_firstlineno 4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if event == 'line' and frame.f_lineno == firstLine + self.jumpFrom: 4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Cope with non-integer self.jumpTo (because of 4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # no_jump_to_non_integers below). 4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi frame.f_lineno = firstLine + self.jumpTo 4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi frame.f_lineno = self.jumpTo 4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.done = True 4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.trace 4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# The first set of 'jump' tests are for things that are allowed: 4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef jump_simple_forwards(output): 4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(1) 4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_simple_forwards.jump = (1, 3) 4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_simple_forwards.output = [3] 4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef jump_simple_backwards(output): 4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(1) 4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_simple_backwards.jump = (2, 1) 4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_simple_backwards.output = [1, 1, 2] 5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef jump_out_of_block_forwards(output): 5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in 1, 2: 5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for j in [3]: # Also tests jumping over a block 5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(4) 5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(5) 5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_out_of_block_forwards.jump = (3, 5) 5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_out_of_block_forwards.output = [2, 5] 5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef jump_out_of_block_backwards(output): 5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(1) 5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in [1]: 5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for j in [2]: # Also tests jumping over a block 5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(5) 5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(6) 5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(7) 5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_out_of_block_backwards.jump = (6, 1) 5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_out_of_block_backwards.output = [1, 3, 5, 1, 3, 5, 6, 7] 5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef jump_to_codeless_line(output): 5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(1) 5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Jumping to this line should skip to the next one. 5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_to_codeless_line.jump = (1, 2) 5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_to_codeless_line.output = [3] 5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef jump_to_same_line(output): 5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(1) 5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_to_same_line.jump = (2, 2) 5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_to_same_line.output = [1, 2, 3] 5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Tests jumping within a finally block, and over one. 5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef jump_in_nested_finally(output): 5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(4) 5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(6) 5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(8) 5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(9) 5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_in_nested_finally.jump = (4, 9) 5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_in_nested_finally.output = [2, 9] 5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# The second set of 'jump' tests are for things that are not allowed: 5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_too_far_forwards(output): 5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('after' in str(e)) 5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_too_far_forwards.jump = (3, 6) 5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_too_far_forwards.output = [2, True] 5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_too_far_backwards(output): 5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('before' in str(e)) 5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_too_far_backwards.jump = (3, -1) 5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_too_far_backwards.output = [2, True] 5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Test each kind of 'except' line. 5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_to_except_1(output): 5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi e = sys.exc_info()[1] 5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('except' in str(e)) 5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_except_1.jump = (2, 3) 5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_except_1.output = [True] 5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_to_except_2(output): 5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: 5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi e = sys.exc_info()[1] 5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('except' in str(e)) 5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_except_2.jump = (2, 3) 5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_except_2.output = [True] 5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_to_except_3(output): 5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('except' in str(e)) 6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_except_3.jump = (2, 3) 6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_except_3.output = [True] 6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_to_except_4(output): 6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (ValueError, RuntimeError), e: 6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('except' in str(e)) 6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_except_4.jump = (2, 3) 6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_except_4.output = [True] 6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_forwards_into_block(output): 6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in 1, 2: 6190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(4) 6200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 6210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('into' in str(e)) 6220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_forwards_into_block.jump = (2, 4) 6240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_forwards_into_block.output = [True] 6250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_backwards_into_block(output): 6270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in 1, 2: 6290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 6300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(4) 6310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 6320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('into' in str(e)) 6330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_backwards_into_block.jump = (4, 3) 6350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_backwards_into_block.output = [3, 3, True] 6360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_into_finally_block(output): 6380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 6410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 6420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 6430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(6) 6440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 6450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('finally' in str(e)) 6460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_into_finally_block.jump = (4, 6) 6480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_into_finally_block.output = [3, 6, True] # The 'finally' still runs 6490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_out_of_finally_block(output): 6510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(3) 6540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 6550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(5) 6560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(6) 6570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 6580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('finally' in str(e)) 6590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_out_of_finally_block.jump = (5, 1) 6610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_out_of_finally_block.output = [3, True] 6620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# This verifies the line-numbers-must-be-integers rule. 6640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_to_non_integers(output): 6650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(2) 6670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 6680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append('integer' in str(e)) 6690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_non_integers.jump = (2, "Spam") 6710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yino_jump_to_non_integers.output = [True] 6720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef jump_across_with(output): 6740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with open(test_support.TESTFN, "wb") as fp: 6750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 6760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with open(test_support.TESTFN, "wb") as fp: 6770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 6780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_across_with.jump = (1, 3) 6790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yijump_across_with.output = [] 6800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# This verifies that you can't set f_lineno via _getframe or similar 6820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# trickery. 6830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef no_jump_without_trace_function(): 6840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi previous_frame = sys._getframe().f_back 6860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi previous_frame.f_lineno = previous_frame.f_lineno 6870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError, e: 6880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This is the exception we wanted; make sure the error message 6890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # talks about trace functions. 6900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if 'trace' not in str(e): 6910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise 6920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 6930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Something's wrong - the expected exception wasn't raised. 6940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise RuntimeError, "Trace-function-less jump failed to fail" 6950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass JumpTestCase(unittest.TestCase): 6980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def compare_jump_output(self, expected, received): 6990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if received != expected: 7000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail( "Outputs don't match:\n" + 7010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "Expected: " + repr(expected) + "\n" + 7020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "Received: " + repr(received)) 7030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def run_test(self, func): 7050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tracer = JumpTracer(func) 7060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(tracer.trace) 7070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output = [] 7080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi func(output) 7090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(None) 7100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.compare_jump_output(func.output, output) 7110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_01_jump_simple_forwards(self): 7130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(jump_simple_forwards) 7140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_02_jump_simple_backwards(self): 7150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(jump_simple_backwards) 7160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_03_jump_out_of_block_forwards(self): 7170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(jump_out_of_block_forwards) 7180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_04_jump_out_of_block_backwards(self): 7190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(jump_out_of_block_backwards) 7200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_05_jump_to_codeless_line(self): 7210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(jump_to_codeless_line) 7220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_06_jump_to_same_line(self): 7230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(jump_to_same_line) 7240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_07_jump_in_nested_finally(self): 7250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(jump_in_nested_finally) 7260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_08_no_jump_too_far_forwards(self): 7270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_too_far_forwards) 7280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_09_no_jump_too_far_backwards(self): 7290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_too_far_backwards) 7300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_10_no_jump_to_except_1(self): 7310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_to_except_1) 7320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_11_no_jump_to_except_2(self): 7330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_to_except_2) 7340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_12_no_jump_to_except_3(self): 7350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_to_except_3) 7360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_13_no_jump_to_except_4(self): 7370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_to_except_4) 7380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_14_no_jump_forwards_into_block(self): 7390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_forwards_into_block) 7400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_15_no_jump_backwards_into_block(self): 7410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_backwards_into_block) 7420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_16_no_jump_into_finally_block(self): 7430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_into_finally_block) 7440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_17_no_jump_out_of_finally_block(self): 7450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_out_of_finally_block) 7460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_18_no_jump_to_non_integers(self): 7470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(no_jump_to_non_integers) 7480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_19_no_jump_without_trace_function(self): 7490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi no_jump_without_trace_function() 7500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_jump_across_with(self): 7510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.addCleanup(test_support.unlink, test_support.TESTFN) 7520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(jump_across_with) 7530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_20_large_function(self): 7550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {} 7560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi exec("""def f(output): # line 0 7570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 0 # line 1 7580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = 1 # line 2 7590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ''' # line 3 7600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi %s # lines 4-1004 7610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ''' # line 1005 7620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x += 1 # line 1006 7630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi output.append(x) # line 1007 7640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return""" % ('\n' * 1000,), d) 7650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = d['f'] 7660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.jump = (2, 1007) 7680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.output = [0] 7690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.run_test(f) 7700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_jump_to_firstlineno(self): 7720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This tests that PDB can jump back to the first line in a 7730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # file. See issue #1689458. It can only be triggered in a 7740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # function call if the function is defined on a single line. 7750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi code = compile(""" 7760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Comments don't count. 7770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yioutput.append(2) # firstlineno is here. 7780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yioutput.append(3) 7790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yioutput.append(4) 7800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi""", "<fake module>", "exec") 7810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class fake_function: 7820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi func_code = code 7830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi jump = (2, 0) 7840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tracer = JumpTracer(fake_function) 7850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(tracer.trace) 7860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi namespace = {"output": []} 7870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi exec code in namespace 7880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.settrace(None) 7890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.compare_jump_output([2, 3, 2, 3, 4], namespace["output"]) 7900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main(): 7930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.run_unittest( 7940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi TraceTestCase, 7950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi RaisingTraceFuncTestCase, 7960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi JumpTestCase 7970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ) 7980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__": 8000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_main() 801