1# test sys.settrace with generators
2
3import sys
4
5try:
6    sys.settrace
7except AttributeError:
8    print("SKIP")
9    raise SystemExit
10
11
12def print_stacktrace(frame, level=0):
13    print(
14        "%2d: %s@%s:%s => %s:%d"
15        % (
16            level,
17            "  ",
18            frame.f_globals["__name__"],
19            frame.f_code.co_name,
20            # Keep just the filename.
21            "sys_settrace_" + frame.f_code.co_filename.split("sys_settrace_")[-1],
22            frame.f_lineno,
23        )
24    )
25
26    if frame.f_back:
27        print_stacktrace(frame.f_back, level + 1)
28
29
30trace_count = 0
31
32
33def trace_tick_handler(frame, event, arg):
34    global trace_count
35    print("### trace_handler::main event:", event)
36    trace_count += 1
37    print_stacktrace(frame)
38    return trace_tick_handler
39
40
41def test_generator():
42    def make_gen():
43        yield 1 << 0
44        yield 1 << 1
45        yield 1 << 2
46        return 1 << 3
47
48    gen = make_gen()
49    r = 0
50    try:
51
52        r += gen.send(None)
53
54        while True:
55
56            r += gen.send(None)
57
58    except StopIteration as e:
59        print("test_generator", r, e)
60
61    gen = make_gen()
62    r = 0
63    for i in gen:
64        r += i
65    print(r)
66
67
68sys.settrace(trace_tick_handler)
69test_generator()
70sys.settrace(None)
71print("Total traces executed: ", trace_count)
72