summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>2010-09-24 18:03:12 (GMT)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>2010-09-24 18:03:12 (GMT)
commitff09ce211f8390bbcbb9d9bb2863ca97f63864c5 (patch)
tree483eb1c1722e5f63b31bfe1dc6784027dff0165c /Lib
parent5e83da3d0867c36b3cf5d63b1c72ae0615652f99 (diff)
downloadcpython-ff09ce211f8390bbcbb9d9bb2863ca97f63864c5.zip
cpython-ff09ce211f8390bbcbb9d9bb2863ca97f63864c5.tar.gz
cpython-ff09ce211f8390bbcbb9d9bb2863ca97f63864c5.tar.bz2
Issue #9936: Fixed executable lines' search in the trace module.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_trace.py25
-rw-r--r--Lib/test/tracedmodules/testmod.py6
-rw-r--r--Lib/trace.py10
3 files changed, 30 insertions, 11 deletions
diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py
index 6c483f8..48fc0ab 100644
--- a/Lib/test/test_trace.py
+++ b/Lib/test/test_trace.py
@@ -188,7 +188,6 @@ class TestLineCounts(unittest.TestCase):
}
self.assertEqual(tracer.results().counts, expected)
-
class TestRunExecCounts(unittest.TestCase):
"""A simple sanity test of line-counting, via runctx (exec)"""
def setUp(self):
@@ -285,8 +284,9 @@ class TestCoverage(unittest.TestCase):
rmtree(TESTFN)
unlink(TESTFN)
- def _coverage(self, tracer):
- tracer.run('from test import test_pprint; test_pprint.test_main()')
+ def _coverage(self, tracer,
+ cmd='from test import test_pprint; test_pprint.test_main()'):
+ tracer.run(cmd)
r = tracer.results()
r.write_results(show_missing=True, summary=True, coverdir=TESTFN)
@@ -313,6 +313,25 @@ class TestCoverage(unittest.TestCase):
files = os.listdir(TESTFN)
self.assertEquals(files, [])
+ def test_issue9936(self):
+ tracer = trace.Trace(trace=0, count=1)
+ modname = 'test.tracedmodules.testmod'
+ # Ensure that the module is executed in import
+ if modname in sys.modules:
+ del sys.modules[modname]
+ cmd = ("import test.tracedmodules.testmod as t;"
+ "t.func(0); t.func2();")
+ with captured_stdout() as stdout:
+ self._coverage(tracer, cmd)
+ stdout.seek(0)
+ stdout.readline()
+ coverage = {}
+ for line in stdout:
+ lines, cov, module = line.split()[:3]
+ coverage[module] = (int(lines), int(cov[:-1]))
+ self.assertIn(modname, coverage)
+ self.assertEqual(coverage[modname], (5, 100))
+
def test_main():
run_unittest(__name__)
diff --git a/Lib/test/tracedmodules/testmod.py b/Lib/test/tracedmodules/testmod.py
index a4c25e4..642776e 100644
--- a/Lib/test/tracedmodules/testmod.py
+++ b/Lib/test/tracedmodules/testmod.py
@@ -1,3 +1,9 @@
def func(x):
b = x + 1
return b + 2
+
+def func2():
+ """Test function for issue 9936 """
+ return (1,
+ 2,
+ 3)
diff --git a/Lib/trace.py b/Lib/trace.py
index 969b396..bed983e 100644
--- a/Lib/trace.py
+++ b/Lib/trace.py
@@ -59,7 +59,7 @@ import token
import tokenize
import inspect
import gc
-
+import dis
import pickle
def usage(outfile):
@@ -376,13 +376,7 @@ def find_lines_from_code(code, strs):
"""Return dict where keys are lines in the line number table."""
linenos = {}
- line_increments = code.co_lnotab[1::2]
- table_length = len(line_increments)
- docstring = False
-
- lineno = code.co_firstlineno
- for li in line_increments:
- lineno += li
+ for _, lineno in dis.findlinestarts(code):
if lineno not in strs:
linenos[lineno] = 1