annotate Lib/trace.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 7769c4d72806
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59522
fcfe324663a6 convert shebang lines: python -> python3
Benjamin Peterson <benjamin@python.org>
parents: 59034
diff changeset
1 #!/usr/bin/env python3
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
2
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 # portions copyright 2001, Autonomous Zones Industries, Inc., all rights...
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4 # err... reserved and offered to the public under the terms of the
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5 # Python 2.2 license.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
6 # Author: Zooko O'Whielacronx
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7 # http://zooko.com/
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8 # mailto:zooko@zooko.com
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9 #
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 # Copyright 2000, Mojam Media, Inc., all rights reserved.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11 # Author: Skip Montanaro
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 #
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
13 # Copyright 1999, Bioreason, Inc., all rights reserved.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
14 # Author: Andrew Dalke
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
15 #
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
16 # Copyright 1995-1997, Automatrix, Inc., all rights reserved.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
17 # Author: Skip Montanaro
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
18 #
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19 # Copyright 1991-1995, Stichting Mathematisch Centrum, all rights reserved.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20 #
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21 #
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22 # Permission to use, copy, modify, and distribute this Python software and
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
23 # its associated documentation for any purpose without fee is hereby
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24 # granted, provided that the above copyright notice appears in all copies,
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
25 # and that both that copyright notice and this permission notice appear in
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 # supporting documentation, and that the name of neither Automatrix,
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
27 # Bioreason or Mojam Media be used in advertising or publicity pertaining to
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28 # distribution of the software without specific, written prior permission.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
29 #
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30 """program/module to trace Python program or function execution
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
32 Sample use, command line:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
33 trace.py -c -f counts --ignore-dir '$prefix' spam.py eggs
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
34 trace.py -t --ignore-dir '$prefix' spam.py eggs
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
35 trace.py --trackcalls spam.py eggs
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
37 Sample use, programmatically
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
38 import sys
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
39
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
40 # create a Trace object, telling it what to ignore, and whether to
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
41 # do tracing or line-counting or both.
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 76232
diff changeset
42 tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,],
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 76232
diff changeset
43 trace=0, count=1)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
44 # run the new command using the given tracer
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
45 tracer.run('main()')
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
46 # make a report, placing output in /tmp
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
47 r = tracer.results()
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 35806
diff changeset
48 r.write_results(show_missing=True, coverdir="/tmp")
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 """
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
50 __all__ = ['Trace', 'CoverageResults']
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
51 import linecache
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
52 import os
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
53 import re
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
54 import sys
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
55 import token
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
56 import tokenize
64717
7dbfc7ef39f2 Merged revisions 84780-84781 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63438
diff changeset
57 import inspect
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
58 import gc
64925
235044b39a92 Merged revisions 84994 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64717
diff changeset
59 import dis
42322
3e33215c66ed Getting rid of cPickle. Mmm, feels good!
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
60 import pickle
82209
3f8b5fcbf07e #17143: fix a missing import in the trace module. Initial patch by Berker Peksag.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 77975
diff changeset
61 from warnings import warn as _warn
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
62 try:
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
63 from time import monotonic as _time
84442
7769c4d72806 Issue #18200: Back out usage of ModuleNotFoundError (8d28d44f3a9a)
Brett Cannon <brett@python.org>
parents: 84114
diff changeset
64 except ImportError:
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
65 from time import time as _time
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
66
66001
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
67 try:
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
68 import threading
84442
7769c4d72806 Issue #18200: Back out usage of ModuleNotFoundError (8d28d44f3a9a)
Brett Cannon <brett@python.org>
parents: 84114
diff changeset
69 except ImportError:
66001
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
70 _settrace = sys.settrace
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
71
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
72 def _unsettrace():
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
73 sys.settrace(None)
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
74 else:
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
75 def _settrace(func):
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
76 threading.settrace(func)
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
77 sys.settrace(func)
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
78
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
79 def _unsettrace():
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
80 sys.settrace(None)
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
81 threading.settrace(None)
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
82
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
83 def _usage(outfile):
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
84 outfile.write("""Usage: %s [OPTIONS] <file> [ARGS]
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
85
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
86 Meta-options:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
87 --help Display this help then exit.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
88 --version Output version information then exit.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
89
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
90 Otherwise, exactly one of the following three options must be given:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
91 -t, --trace Print each line to sys.stdout before it is executed.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
92 -c, --count Count the number of times each line is executed
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
93 and write the counts to <module>.cover for each
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
94 module executed, in the module's directory.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
95 See also `--coverdir', `--file', `--no-report' below.
29619
f8069f7edd4a add mention of -l, --listfuncs to usage() small part of 542562
Skip Montanaro <skip@pobox.com>
parents: 29595
diff changeset
96 -l, --listfuncs Keep track of which functions are executed at least
29620
77eda0fb0e14 fix typo
Fred Drake <fdrake@acm.org>
parents: 29619
diff changeset
97 once and write the results to sys.stdout after the
29619
f8069f7edd4a add mention of -l, --listfuncs to usage() small part of 542562
Skip Montanaro <skip@pobox.com>
parents: 29595
diff changeset
98 program exits.
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
99 -T, --trackcalls Keep track of caller/called pairs and write the
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
100 results to sys.stdout after the program exits.
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
101 -r, --report Generate a report from a counts file; do not execute
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
102 any code. `--file' must specify the results file to
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
103 read, which must have been created in a previous run
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
104 with `--count --file=FILE'.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
105
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
106 Modifiers:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
107 -f, --file=<file> File to accumulate counts over several runs.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
108 -R, --no-report Do not generate the coverage report files.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
109 Useful if you want to accumulate over several runs.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
110 -C, --coverdir=<dir> Directory where the report files. The coverage
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
111 report for <package>.<module> is written to file
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
112 <dir>/<package>/<module>.cover.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
113 -m, --missing Annotate executable lines that were not executed
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
114 with '>>>>>> '.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
115 -s, --summary Write a brief summary on stdout for each file.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
116 (Can only be used with --count or --report.)
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
117 -g, --timing Prefix each line with the time since the program started.
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
118 Only used while tracing.
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
119
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
120 Filters, may be repeated multiple times:
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44025
diff changeset
121 --ignore-module=<mod> Ignore the given module(s) and its submodules
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44025
diff changeset
122 (if it is a package). Accepts comma separated
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44025
diff changeset
123 list of module names
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
124 --ignore-dir=<dir> Ignore files in the given directory (multiple
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
125 directories can be joined by os.pathsep).
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
126 """ % sys.argv[0])
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
127
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
128 PRAGMA_NOCOVER = "#pragma NO COVER"
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
129
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
130 # Simple rx to find lines with no code.
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
131 rx_blank = re.compile(r'^\s*(#.*)?$')
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
132
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
133 class _Ignore:
66088
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
134 def __init__(self, modules=None, dirs=None):
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
135 self._mods = set() if not modules else set(modules)
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
136 self._dirs = [] if not dirs else [os.path.normpath(d)
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
137 for d in dirs]
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
138 self._ignore = { '<string>': 1 }
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
139
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
140 def names(self, filename, modulename):
39575
63237fcefd99 Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
141 if modulename in self._ignore:
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
142 return self._ignore[modulename]
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
143
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
144 # haven't seen this one before, so see if the module name is
66088
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
145 # on the ignore list.
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
146 if modulename in self._mods: # Identical names, so ignore
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
147 self._ignore[modulename] = 1
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
148 return 1
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
149
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
150 # check if the module is a proper submodule of something on
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
151 # the ignore list
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
152 for mod in self._mods:
66088
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
153 # Need to take some care since ignoring
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
154 # "cmp" mustn't mean ignoring "cmpcache" but ignoring
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
155 # "Spam" must also mean ignoring "Spam.Eggs".
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
156 if modulename.startswith(mod + '.'):
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
157 self._ignore[modulename] = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
158 return 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
159
66088
8ab1de0813b3 Streamlined code in trace.Ignore and added unit tests.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66068
diff changeset
160 # Now check that filename isn't in one of the directories
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
161 if filename is None:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
162 # must be a built-in, so we must ignore
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
163 self._ignore[modulename] = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
164 return 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
165
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
166 # Ignore a file when it contains one of the ignorable paths
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
167 for d in self._dirs:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
168 # The '+ os.sep' is to ensure that d is a parent directory,
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
169 # as compared to cases like:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
170 # d = "/usr/local"
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
171 # filename = "/usr/local.py"
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
172 # or
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
173 # d = "/usr/local.py"
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
174 # filename = "/usr/local.py"
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
175 if filename.startswith(d + os.sep):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
176 self._ignore[modulename] = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
177 return 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
178
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
179 # Tried the different ways, so we don't ignore this module
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
180 self._ignore[modulename] = 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
181 return 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
182
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
183 def _modname(path):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
184 """Return a plausible module name for the patch."""
28713
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
185
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
186 base = os.path.basename(path)
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
187 filename, ext = os.path.splitext(base)
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
188 return filename
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
189
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
190 def _fullmodname(path):
28727
051a4f12cc46 Only produce a dotted module name when writing output to a separate
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28713
diff changeset
191 """Return a plausible module name for the path."""
28713
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
192
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
193 # If the file 'path' is part of a package, then the filename isn't
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
194 # enough to uniquely identify it. Try to do the right thing by
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
195 # looking in sys.path for the longest matching prefix. We'll
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
196 # assume that the rest is the package name.
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
197
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
198 comparepath = os.path.normcase(path)
28713
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
199 longest = ""
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
200 for dir in sys.path:
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
201 dir = os.path.normcase(dir)
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
202 if comparepath.startswith(dir) and comparepath[len(dir)] == os.sep:
28713
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
203 if len(dir) > len(longest):
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
204 longest = dir
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
205
30667
400674958025 The fullmodname() function chopped off the first character if the
Guido van Rossum <guido@python.org>
parents: 29864
diff changeset
206 if longest:
400674958025 The fullmodname() function chopped off the first character if the
Guido van Rossum <guido@python.org>
parents: 29864
diff changeset
207 base = path[len(longest) + 1:]
400674958025 The fullmodname() function chopped off the first character if the
Guido van Rossum <guido@python.org>
parents: 29864
diff changeset
208 else:
400674958025 The fullmodname() function chopped off the first character if the
Guido van Rossum <guido@python.org>
parents: 29864
diff changeset
209 base = path
63438
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
210 # the drive letter is never part of the module name
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
211 drive, base = os.path.splitdrive(base)
31551
a157cc20f1b7 Fix two small bugs: (1) on Windows, pathname munging didn't work
Guido van Rossum <guido@python.org>
parents: 31515
diff changeset
212 base = base.replace(os.sep, ".")
a157cc20f1b7 Fix two small bugs: (1) on Windows, pathname munging didn't work
Guido van Rossum <guido@python.org>
parents: 31515
diff changeset
213 if os.altsep:
a157cc20f1b7 Fix two small bugs: (1) on Windows, pathname munging didn't work
Guido van Rossum <guido@python.org>
parents: 31515
diff changeset
214 base = base.replace(os.altsep, ".")
28713
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
215 filename, ext = os.path.splitext(base)
63438
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
216 return filename.lstrip(".")
28713
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
217
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
218 class CoverageResults:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
219 def __init__(self, counts=None, calledfuncs=None, infile=None,
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
220 callers=None, outfile=None):
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
221 self.counts = counts
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
222 if self.counts is None:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
223 self.counts = {}
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
224 self.counter = self.counts.copy() # map (filename, lineno) to count
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
225 self.calledfuncs = calledfuncs
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
226 if self.calledfuncs is None:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
227 self.calledfuncs = {}
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
228 self.calledfuncs = self.calledfuncs.copy()
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
229 self.callers = callers
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
230 if self.callers is None:
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
231 self.callers = {}
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
232 self.callers = self.callers.copy()
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
233 self.infile = infile
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
234 self.outfile = outfile
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
235 if self.infile:
29767
7770b7881346 Patch from Zooko to remove an experimental feature.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29620
diff changeset
236 # Try to merge existing counts file.
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
237 try:
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
238 counts, calledfuncs, callers = \
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
239 pickle.load(open(self.infile, 'rb'))
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
240 self.update(self.__class__(counts, calledfuncs, callers))
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77975
diff changeset
241 except (OSError, EOFError, ValueError) as err:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
242 print(("Skipping counts file %r: %s"
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
243 % (self.infile, err)), file=sys.stderr)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
244
52690
b43f14c103bb #5656: detect correct encoding of files when reporting coverage in trace.py, and ignore files in the temporary directory when reporting.
Georg Brandl <georg@python.org>
parents: 54437
diff changeset
245 def is_ignored_filename(self, filename):
b43f14c103bb #5656: detect correct encoding of files when reporting coverage in trace.py, and ignore files in the temporary directory when reporting.
Georg Brandl <georg@python.org>
parents: 54437
diff changeset
246 """Return True if the filename does not refer to a file
b43f14c103bb #5656: detect correct encoding of files when reporting coverage in trace.py, and ignore files in the temporary directory when reporting.
Georg Brandl <georg@python.org>
parents: 54437
diff changeset
247 we want to have reported.
b43f14c103bb #5656: detect correct encoding of files when reporting coverage in trace.py, and ignore files in the temporary directory when reporting.
Georg Brandl <georg@python.org>
parents: 54437
diff changeset
248 """
76232
8a47d2322df0 Make the trace module ignore modules whose names start with "<" and
Brett Cannon <brett@python.org>
parents: 69604
diff changeset
249 return filename.startswith('<') and filename.endswith('>')
52690
b43f14c103bb #5656: detect correct encoding of files when reporting coverage in trace.py, and ignore files in the temporary directory when reporting.
Georg Brandl <georg@python.org>
parents: 54437
diff changeset
250
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
251 def update(self, other):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
252 """Merge in the data from another CoverageResults"""
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
253 counts = self.counts
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
254 calledfuncs = self.calledfuncs
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
255 callers = self.callers
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
256 other_counts = other.counts
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
257 other_calledfuncs = other.calledfuncs
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
258 other_callers = other.callers
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
259
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
260 for key in other_counts:
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
261 counts[key] = counts.get(key, 0) + other_counts[key]
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
262
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
263 for key in other_calledfuncs:
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
264 calledfuncs[key] = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
265
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
266 for key in other_callers:
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
267 callers[key] = 1
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
268
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
269 def write_results(self, show_missing=True, summary=False, coverdir=None):
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
270 """
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
271 @param coverdir
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
272 """
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
273 if self.calledfuncs:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
274 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
275 print("functions called:")
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
276 calls = self.calledfuncs
63110
1e261cce4116 Merged revisions 82997 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 59034
diff changeset
277 for filename, modulename, funcname in sorted(calls):
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
278 print(("filename: %s, modulename: %s, funcname: %s"
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
279 % (filename, modulename, funcname)))
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
280
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
281 if self.callers:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
282 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
283 print("calling relationships:")
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
284 lastfile = lastcfile = ""
52690
b43f14c103bb #5656: detect correct encoding of files when reporting coverage in trace.py, and ignore files in the temporary directory when reporting.
Georg Brandl <georg@python.org>
parents: 54437
diff changeset
285 for ((pfile, pmod, pfunc), (cfile, cmod, cfunc)) \
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
286 in sorted(self.callers):
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
287 if pfile != lastfile:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
288 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
289 print("***", pfile, "***")
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
290 lastfile = pfile
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
291 lastcfile = ""
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
292 if cfile != pfile and lastcfile != cfile:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
293 print(" -->", cfile)
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
294 lastcfile = cfile
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
295 print(" %s.%s -> %s.%s" % (pmod, pfunc, cmod, cfunc))
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
296
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
297 # turn the counts data ("(filename, lineno) = count") into something
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
298 # accessible on a per-file basis
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
299 per_file = {}
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
300 for filename, lineno in self.counts:
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
301 lines_hit = per_file[filename] = per_file.get(filename, {})
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
302 lines_hit[lineno] = self.counts[(filename, lineno)]
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
303
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
304 # accumulate summary info, if needed
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
305 sums = {}
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
306
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
307 for filename, count in per_file.items():
52690
b43f14c103bb #5656: detect correct encoding of files when reporting coverage in trace.py, and ignore files in the temporary directory when reporting.
Georg Brandl <georg@python.org>
parents: 54437
diff changeset
308 if self.is_ignored_filename(filename):
44025
ebc7389297d6 Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42552
diff changeset
309 continue
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
310
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
311 if filename.endswith((".pyc", ".pyo")):
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
312 filename = filename[:-1]
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
313
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
314 if coverdir is None:
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
315 dir = os.path.dirname(os.path.abspath(filename))
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
316 modulename = _modname(filename)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
317 else:
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
318 dir = coverdir
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
319 if not os.path.exists(dir):
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
320 os.makedirs(dir)
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
321 modulename = _fullmodname(filename)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
322
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
323 # If desired, get a list of the line numbers which represent
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
324 # executable content (returned as a dict for better lookup speed)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
325 if show_missing:
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
326 lnotab = _find_executable_linenos(filename)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
327 else:
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
328 lnotab = {}
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
329
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
330 source = linecache.getlines(filename)
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
331 coverpath = os.path.join(dir, modulename + ".cover")
66068
80473ad697ac Issue #10329: The trace module writes reports using the input Python script
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65999
diff changeset
332 with open(filename, 'rb') as fp:
80473ad697ac Issue #10329: The trace module writes reports using the input Python script
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65999
diff changeset
333 encoding, _ = tokenize.detect_encoding(fp.readline)
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
334 n_hits, n_lines = self.write_results_file(coverpath, source,
66068
80473ad697ac Issue #10329: The trace module writes reports using the input Python script
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65999
diff changeset
335 lnotab, count, encoding)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
336 if summary and n_lines:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
337 percent = int(100 * n_hits / n_lines)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
338 sums[modulename] = n_lines, percent, modulename, filename
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
339
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
340 if summary and sums:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
341 print("lines cov% module (path)")
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
342 for m in sorted(sums):
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
343 n_lines, percent, modulename, filename = sums[m]
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
344 print("%5d %3d%% %s (%s)" % sums[m])
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
345
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
346 if self.outfile:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
347 # try and store counts and module info into self.outfile
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
348 try:
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
349 pickle.dump((self.counts, self.calledfuncs, self.callers),
30692
a3e86665f245 Open results files, which contain binary pickles, in binary mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 30668
diff changeset
350 open(self.outfile, 'wb'), 1)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77975
diff changeset
351 except OSError as err:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
352 print("Can't save counts files because %s" % err, file=sys.stderr)
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
353
66068
80473ad697ac Issue #10329: The trace module writes reports using the input Python script
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65999
diff changeset
354 def write_results_file(self, path, lines, lnotab, lines_hit, encoding=None):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
355 """Return a coverage results file in path."""
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
356
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
357 try:
66068
80473ad697ac Issue #10329: The trace module writes reports using the input Python script
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65999
diff changeset
358 outfile = open(path, "w", encoding=encoding)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77975
diff changeset
359 except OSError as err:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
360 print(("trace: Could not open %r for writing: %s"
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
361 "- skipping" % (path, err)), file=sys.stderr)
31551
a157cc20f1b7 Fix two small bugs: (1) on Windows, pathname munging didn't work
Guido van Rossum <guido@python.org>
parents: 31515
diff changeset
362 return 0, 0
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
363
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
364 n_lines = 0
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
365 n_hits = 0
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
366 for lineno, line in enumerate(lines, 1):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
367 # do the blank/comment match to try to mark more lines
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
368 # (help the reader find stuff that hasn't been covered)
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
369 if lineno in lines_hit:
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
370 outfile.write("%5d: " % lines_hit[lineno])
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
371 n_hits += 1
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
372 n_lines += 1
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
373 elif rx_blank.match(line):
29864
84bccbeab5fa Make the prefix 7 spaces long, so the lines are properly aligned.
Walter Dörwald <walter@livinglogic.de>
parents: 29767
diff changeset
374 outfile.write(" ")
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
375 else:
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
376 # lines preceded by no marks weren't hit
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
377 # Highlight them if so indicated, unless the line contains
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
378 # #pragma: NO COVER
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
379 if lineno in lnotab and not PRAGMA_NOCOVER in line:
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
380 outfile.write(">>>>>> ")
29595
8911ca88981a Enable tracing of multi-threaded applications.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28774
diff changeset
381 n_lines += 1
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
382 else:
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
383 outfile.write(" ")
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
384 outfile.write(line.expandtabs(8))
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
385 outfile.close()
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
386
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
387 return n_hits, n_lines
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
388
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
389 def _find_lines_from_code(code, strs):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
390 """Return dict where keys are lines in the line number table."""
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
391 linenos = {}
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
392
64925
235044b39a92 Merged revisions 84994 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64717
diff changeset
393 for _, lineno in dis.findlinestarts(code):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
394 if lineno not in strs:
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
395 linenos[lineno] = 1
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
396
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
397 return linenos
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
398
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
399 def _find_lines(code, strs):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
400 """Return lineno dict for all code objects reachable from code."""
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
401 # get all of the lineno information from the code of this scope level
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
402 linenos = _find_lines_from_code(code, strs)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
403
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
404 # and check the constants for references to other code objects
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
405 for c in code.co_consts:
64717
7dbfc7ef39f2 Merged revisions 84780-84781 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63438
diff changeset
406 if inspect.iscode(c):
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
407 # find another code object, so recurse into it
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
408 linenos.update(_find_lines(c, strs))
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
409 return linenos
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
410
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
411 def _find_strings(filename, encoding=None):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
412 """Return a dict of possible docstring positions.
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
413
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
414 The dict maps line numbers to strings. There is an entry for
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
415 line that contains only a string or a part of a triple-quoted
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
416 string.
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
417 """
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
418 d = {}
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
419 # If the first token is a string, then it's the module docstring.
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
420 # Add this special case so that the test in the loop passes.
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
421 prev_ttype = token.INDENT
65781
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
422 with open(filename, encoding=encoding) as f:
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
423 tok = tokenize.generate_tokens(f.readline)
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
424 for ttype, tstr, start, end, line in tok:
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
425 if ttype == token.STRING:
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
426 if prev_ttype == token.INDENT:
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
427 sline, scol = start
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
428 eline, ecol = end
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
429 for i in range(sline, eline + 1):
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
430 d[i] = 1
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
431 prev_ttype = ttype
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
432 return d
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
433
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
434 def _find_executable_linenos(filename):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
435 """Return dict where keys are line numbers in the line number table."""
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
436 try:
66097
306339c31758 Issue #10335: Add tokenize.open(), detect the file encoding using
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66088
diff changeset
437 with tokenize.open(filename) as f:
65781
1954c8e31cb3 close files correctly
Benjamin Peterson <benjamin@python.org>
parents: 65526
diff changeset
438 prog = f.read()
66097
306339c31758 Issue #10335: Add tokenize.open(), detect the file encoding using
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66088
diff changeset
439 encoding = f.encoding
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77975
diff changeset
440 except OSError as err:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
441 print(("Not printing coverage data for %r: %s"
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
442 % (filename, err)), file=sys.stderr)
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
443 return {}
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
444 code = compile(prog, filename, "exec")
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
445 strs = _find_strings(filename, encoding)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
446 return _find_lines(code, strs)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
447
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
448 class Trace:
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
449 def __init__(self, count=1, trace=1, countfuncs=0, countcallers=0,
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
450 ignoremods=(), ignoredirs=(), infile=None, outfile=None,
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
451 timing=False):
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
452 """
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
453 @param count true iff it should count number of times each
27963
226463445697 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27933
diff changeset
454 line is executed
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
455 @param trace true iff it should print out each line that is
27963
226463445697 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27933
diff changeset
456 being counted
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
457 @param countfuncs true iff it should just output a list of
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
458 (filename, modulename, funcname,) for functions
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
459 that were called at least once; This overrides
27963
226463445697 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27933
diff changeset
460 `count' and `trace'
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
461 @param ignoremods a list of the names of modules to ignore
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
462 @param ignoredirs a list of the names of directories to ignore
27963
226463445697 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27933
diff changeset
463 all of the (recursive) contents of
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
464 @param infile file from which to read stored counts to be
27963
226463445697 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27933
diff changeset
465 added into the results
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
466 @param outfile file in which to write the results
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
467 @param timing true iff timing information be displayed
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
468 """
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
469 self.infile = infile
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
470 self.outfile = outfile
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
471 self.ignore = _Ignore(ignoremods, ignoredirs)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
472 self.counts = {} # keys are (filename, linenumber)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
473 self.pathtobasename = {} # for memoizing os.path.basename
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
474 self.donothing = 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
475 self.trace = trace
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
476 self._calledfuncs = {}
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
477 self._callers = {}
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
478 self._caller_cache = {}
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
479 self.start_time = None
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
480 if timing:
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
481 self.start_time = _time()
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
482 if countcallers:
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
483 self.globaltrace = self.globaltrace_trackcallers
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
484 elif countfuncs:
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
485 self.globaltrace = self.globaltrace_countfuncs
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
486 elif trace and count:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
487 self.globaltrace = self.globaltrace_lt
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
488 self.localtrace = self.localtrace_trace_and_count
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
489 elif trace:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
490 self.globaltrace = self.globaltrace_lt
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
491 self.localtrace = self.localtrace_trace
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
492 elif count:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
493 self.globaltrace = self.globaltrace_lt
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
494 self.localtrace = self.localtrace_count
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
495 else:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
496 # Ahem -- do nothing? Okay.
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
497 self.donothing = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
498
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
499 def run(self, cmd):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
500 import __main__
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
501 dict = __main__.__dict__
64958
ff5d3e5c4bb5 Issue 9941: Minor code cleanup before implementing the context manager feature:
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64924
diff changeset
502 self.runctx(cmd, dict, dict)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
503
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
504 def runctx(self, cmd, globals=None, locals=None):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
505 if globals is None: globals = {}
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
506 if locals is None: locals = {}
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
507 if not self.donothing:
66001
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
508 _settrace(self.globaltrace)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
509 try:
39782
c94f37054f19 Patch #1550800: make exec a function.
Georg Brandl <georg@python.org>
parents: 39610
diff changeset
510 exec(cmd, globals, locals)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
511 finally:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
512 if not self.donothing:
66001
8911f475ad3d Merged revisions 86229 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65115
diff changeset
513 _unsettrace()
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
514
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
515 def runfunc(self, func, *args, **kw):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
516 result = None
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
517 if not self.donothing:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
518 sys.settrace(self.globaltrace)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
519 try:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27963
diff changeset
520 result = func(*args, **kw)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
521 finally:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
522 if not self.donothing:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
523 sys.settrace(None)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
524 return result
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
525
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
526 def file_module_function_of(self, frame):
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
527 code = frame.f_code
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
528 filename = code.co_filename
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
529 if filename:
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
530 modulename = _modname(filename)
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
531 else:
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
532 modulename = None
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
533
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
534 funcname = code.co_name
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
535 clsname = None
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
536 if code in self._caller_cache:
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
537 if self._caller_cache[code] is not None:
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
538 clsname = self._caller_cache[code]
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
539 else:
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
540 self._caller_cache[code] = None
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
541 ## use of gc.get_referrers() was suggested by Michael Hudson
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
542 # all functions which refer to this code object
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
543 funcs = [f for f in gc.get_referrers(code)
64717
7dbfc7ef39f2 Merged revisions 84780-84781 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63438
diff changeset
544 if inspect.isfunction(f)]
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
545 # require len(func) == 1 to avoid ambiguity caused by calls to
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
546 # new.function(): "In the face of ambiguity, refuse the
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
547 # temptation to guess."
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
548 if len(funcs) == 1:
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
549 dicts = [d for d in gc.get_referrers(funcs[0])
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
550 if isinstance(d, dict)]
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
551 if len(dicts) == 1:
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
552 classes = [c for c in gc.get_referrers(dicts[0])
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
553 if hasattr(c, "__bases__")]
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
554 if len(classes) == 1:
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
555 # ditto for new.classobj()
64717
7dbfc7ef39f2 Merged revisions 84780-84781 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63438
diff changeset
556 clsname = classes[0].__name__
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
557 # cache the result - assumption is that new.* is
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
558 # not called later to disturb this relationship
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
559 # _caller_cache could be flushed if functions in
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
560 # the new module get called.
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
561 self._caller_cache[code] = clsname
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
562 if clsname is not None:
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
563 funcname = "%s.%s" % (clsname, funcname)
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
564
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
565 return filename, modulename, funcname
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
566
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
567 def globaltrace_trackcallers(self, frame, why, arg):
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
568 """Handler for call events.
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
569
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
570 Adds information about who called who to the self._callers dict.
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
571 """
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
572 if why == 'call':
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
573 # XXX Should do a better job of identifying methods
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
574 this_func = self.file_module_function_of(frame)
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
575 parent_func = self.file_module_function_of(frame.f_back)
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
576 self._callers[(parent_func, this_func)] = 1
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
577
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
578 def globaltrace_countfuncs(self, frame, why, arg):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
579 """Handler for call events.
28774
c9bee11eaa8b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28727
diff changeset
580
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
581 Adds (filename, modulename, funcname) to the self._calledfuncs dict.
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
582 """
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
583 if why == 'call':
31892
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
584 this_func = self.file_module_function_of(frame)
081972ae2f84 Refactor common code out of globaltrace_trackcallers() and
Skip Montanaro <skip@pobox.com>
parents: 31881
diff changeset
585 self._calledfuncs[this_func] = 1
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
586
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
587 def globaltrace_lt(self, frame, why, arg):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
588 """Handler for call events.
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
589
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
590 If the code block being entered is to be ignored, returns `None',
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
591 else returns self.localtrace.
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
592 """
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
593 if why == 'call':
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
594 code = frame.f_code
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40809
diff changeset
595 filename = frame.f_globals.get('__file__', None)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
596 if filename:
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
597 # XXX _modname() doesn't work right for packages, so
28713
d08d15a70295 Add helper function to get module name taking packages into account.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28712
diff changeset
598 # the ignore support won't work right for packages
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
599 modulename = _modname(filename)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
600 if modulename is not None:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
601 ignore_it = self.ignore.names(filename, modulename)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
602 if not ignore_it:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
603 if self.trace:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
604 print((" --- modulename: %s, funcname: %s"
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
605 % (modulename, code.co_name)))
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
606 return self.localtrace
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
607 else:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
608 return None
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
609
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
610 def localtrace_trace_and_count(self, frame, why, arg):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
611 if why == "line":
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
612 # record the file name and line number of every trace
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
613 filename = frame.f_code.co_filename
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
614 lineno = frame.f_lineno
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
615 key = filename, lineno
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
616 self.counts[key] = self.counts.get(key, 0) + 1
27963
226463445697 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27933
diff changeset
617
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
618 if self.start_time:
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
619 print('%.2f' % (_time() - self.start_time), end=' ')
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
620 bname = os.path.basename(filename)
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
621 print("%s(%d): %s" % (bname, lineno,
65115
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 64925
diff changeset
622 linecache.getline(filename, lineno)), end='')
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
623 return self.localtrace
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
624
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
625 def localtrace_trace(self, frame, why, arg):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
626 if why == "line":
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
627 # record the file name and line number of every trace
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
628 filename = frame.f_code.co_filename
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
629 lineno = frame.f_lineno
27963
226463445697 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27933
diff changeset
630
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
631 if self.start_time:
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
632 print('%.2f' % (_time() - self.start_time), end=' ')
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
633 bname = os.path.basename(filename)
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
634 print("%s(%d): %s" % (bname, lineno,
65115
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 64925
diff changeset
635 linecache.getline(filename, lineno)), end='')
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
636 return self.localtrace
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
637
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
638 def localtrace_count(self, frame, why, arg):
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
639 if why == "line":
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
640 filename = frame.f_code.co_filename
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
641 lineno = frame.f_lineno
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
642 key = filename, lineno
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
643 self.counts[key] = self.counts.get(key, 0) + 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
644 return self.localtrace
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
645
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
646 def results(self):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
647 return CoverageResults(self.counts, infile=self.infile,
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
648 outfile=self.outfile,
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
649 calledfuncs=self._calledfuncs,
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
650 callers=self._callers)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
651
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
652 def _err_exit(msg):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
653 sys.stderr.write("%s: %s\n" % (sys.argv[0], msg))
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
654 sys.exit(1)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
655
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
656 def main(argv=None):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
657 import getopt
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
658
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
659 if argv is None:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
660 argv = sys.argv
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
661 try:
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
662 opts, prog_argv = getopt.getopt(argv[1:], "tcrRf:d:msC:lTg",
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
663 ["help", "version", "trace", "count",
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
664 "report", "no-report", "summary",
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
665 "file=", "missing",
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
666 "ignore-module=", "ignore-dir=",
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
667 "coverdir=", "listfuncs",
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
668 "trackcalls", "timing"])
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
669
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 39782
diff changeset
670 except getopt.error as msg:
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
671 sys.stderr.write("%s: %s\n" % (sys.argv[0], msg))
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
672 sys.stderr.write("Try `%s --help' for more information\n"
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
673 % sys.argv[0])
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
674 sys.exit(1)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
675
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
676 trace = 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
677 count = 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
678 report = 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
679 no_report = 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
680 counts_file = None
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
681 missing = 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
682 ignore_modules = []
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
683 ignore_dirs = []
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
684 coverdir = None
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
685 summary = 0
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
686 listfuncs = False
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
687 countcallers = False
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
688 timing = False
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
689
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
690 for opt, val in opts:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
691 if opt == "--help":
69604
c9792d3166eb Prevent deprecation warning
Éric Araujo <merwok@netwok.org>
parents: 68257
diff changeset
692 _usage(sys.stdout)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
693 sys.exit(0)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
694
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
695 if opt == "--version":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
696 sys.stdout.write("trace 2.0\n")
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
697 sys.exit(0)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
698
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
699 if opt == "-T" or opt == "--trackcalls":
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
700 countcallers = True
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
701 continue
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
702
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
703 if opt == "-l" or opt == "--listfuncs":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
704 listfuncs = True
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
705 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
706
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
707 if opt == "-g" or opt == "--timing":
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
708 timing = True
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
709 continue
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
710
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
711 if opt == "-t" or opt == "--trace":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
712 trace = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
713 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
714
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
715 if opt == "-c" or opt == "--count":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
716 count = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
717 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
718
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
719 if opt == "-r" or opt == "--report":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
720 report = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
721 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
722
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
723 if opt == "-R" or opt == "--no-report":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
724 no_report = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
725 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
726
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
727 if opt == "-f" or opt == "--file":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
728 counts_file = val
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
729 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
730
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
731 if opt == "-m" or opt == "--missing":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
732 missing = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
733 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
734
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
735 if opt == "-C" or opt == "--coverdir":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
736 coverdir = val
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
737 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
738
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
739 if opt == "-s" or opt == "--summary":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
740 summary = 1
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
741 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
742
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
743 if opt == "--ignore-module":
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44025
diff changeset
744 for mod in val.split(","):
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44025
diff changeset
745 ignore_modules.append(mod.strip())
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
746 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
747
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
748 if opt == "--ignore-dir":
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
749 for s in val.split(os.pathsep):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
750 s = os.path.expandvars(s)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
751 # should I also call expanduser? (after all, could use $HOME)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
752
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
753 s = s.replace("$prefix",
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 76232
diff changeset
754 os.path.join(sys.base_prefix, "lib",
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
755 "python" + sys.version[:3]))
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
756 s = s.replace("$exec_prefix",
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 76232
diff changeset
757 os.path.join(sys.base_exec_prefix, "lib",
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
758 "python" + sys.version[:3]))
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
759 s = os.path.normpath(s)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
760 ignore_dirs.append(s)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
761 continue
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
762
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
763 assert 0, "Should never get here"
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
764
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
765 if listfuncs and (count or trace):
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
766 _err_exit("cannot specify both --listfuncs and (--trace or --count)")
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
767
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
768 if not (count or trace or report or listfuncs or countcallers):
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
769 _err_exit("must specify one of --trace, --count, --report, "
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
770 "--listfuncs, or --trackcalls")
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
771
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
772 if report and no_report:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
773 _err_exit("cannot specify both --report and --no-report")
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
774
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
775 if report and not counts_file:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
776 _err_exit("--report requires a --file")
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
777
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
778 if no_report and len(prog_argv) == 0:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
779 _err_exit("missing name of file to run")
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
780
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
781 # everything is ready
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
782 if report:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
783 results = CoverageResults(infile=counts_file, outfile=counts_file)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
784 results.write_results(missing, summary=summary, coverdir=coverdir)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
785 else:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
786 sys.argv = prog_argv
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
787 progname = prog_argv[0]
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
788 sys.path[0] = os.path.split(progname)[0]
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
789
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
790 t = Trace(count, trace, countfuncs=listfuncs,
31881
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
791 countcallers=countcallers, ignoremods=ignore_modules,
f35b4acc594f Added --trackcalls command line arg to display crude caller/callee
Skip Montanaro <skip@pobox.com>
parents: 31551
diff changeset
792 ignoredirs=ignore_dirs, infile=counts_file,
45548
8c3c5b4eef55 Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
793 outfile=counts_file, timing=timing)
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
794 try:
63133
9dbbe6e7b668 Merged revisions 83035 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63110
diff changeset
795 with open(progname) as fp:
9dbbe6e7b668 Merged revisions 83035 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63110
diff changeset
796 code = compile(fp.read(), progname, 'exec')
63438
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
797 # try to emulate __main__ namespace as much as possible
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
798 globs = {
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
799 '__file__': progname,
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
800 '__name__': '__main__',
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
801 '__package__': None,
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
802 '__cached__': None,
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
803 }
9ee196a7f9a2 Merged revisions 83393,83396,83398,83404-83405,83408 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63133
diff changeset
804 t.runctx(code, globs, globs)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77975
diff changeset
805 except OSError as err:
28712
d3127b671d36 Holistic refactoring.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28089
diff changeset
806 _err_exit("Cannot run file %r because: %s" % (sys.argv[0], err))
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
807 except SystemExit:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
808 pass
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
809
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
810 results = t.results()
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
811
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
812 if not no_report:
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
813 results.write_results(missing, summary=summary, coverdir=coverdir)
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
814
66308
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
815 # Deprecated API
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
816 def usage(outfile):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
817 _warn("The trace.usage() function is deprecated",
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
818 DeprecationWarning, 2)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
819 _usage(outfile)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
820
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
821 class Ignore(_Ignore):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
822 def __init__(self, modules=None, dirs=None):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
823 _warn("The class trace.Ignore is deprecated",
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
824 DeprecationWarning, 2)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
825 _Ignore.__init__(self, modules, dirs)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
826
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
827 def modname(path):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
828 _warn("The trace.modname() function is deprecated",
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
829 DeprecationWarning, 2)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
830 return _modname(path)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
831
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
832 def fullmodname(path):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
833 _warn("The trace.fullmodname() function is deprecated",
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
834 DeprecationWarning, 2)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
835 return _fullmodname(path)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
836
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
837 def find_lines_from_code(code, strs):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
838 _warn("The trace.find_lines_from_code() function is deprecated",
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
839 DeprecationWarning, 2)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
840 return _find_lines_from_code(code, strs)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
841
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
842 def find_lines(code, strs):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
843 _warn("The trace.find_lines() function is deprecated",
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
844 DeprecationWarning, 2)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
845 return _find_lines(code, strs)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
846
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
847 def find_strings(filename, encoding=None):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
848 _warn("The trace.find_strings() function is deprecated",
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
849 DeprecationWarning, 2)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
850 return _find_strings(filename, encoding=None)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
851
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
852 def find_executable_linenos(filename):
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
853 _warn("The trace.find_executable_linenos() function is deprecated",
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
854 DeprecationWarning, 2)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
855 return _find_executable_linenos(filename)
4f29aa8f9f54 Issue #10371: Deprecated undocumented functions in the trace module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66097
diff changeset
856
27933
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
857 if __name__=='__main__':
44f3e315929b Copy the trace module here from Tools/scripts.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
858 main()