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