summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2019-03-01 18:08:29 +0100
committerStefan Behnel <stefan_ml@behnel.de>2019-03-01 18:21:10 +0100
commitffa807aea1487e58ce59ba2812e3b8027b2d05b5 (patch)
tree53ec059d7ccb8524c4aab363ced8f4e1921795a0
parenta80d9ce55d1d1f014f5d9aa5aed5e3a1010dd3b7 (diff)
downloadcython-gh1461_cover_sig_line_master.tar.gz
GH-1461: Include the signature line of cdef functions in the import-time line tracing and coverage report.gh1461_cover_sig_line_master
-rw-r--r--CHANGES.rst3
-rw-r--r--Cython/Compiler/Nodes.py3
-rw-r--r--tests/run/coverage_nogil.srctree40
3 files changed, 25 insertions, 21 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index 4005c66cd..42d1cd3bc 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -47,6 +47,9 @@ Features added
Bugs fixed
----------
+* Coverage reporting did not include the signature line of ``cdef`` functions.
+ (Github issue #1461)
+
* The unicode methods ``.upper()``, ``.lower()`` and ``.title()`` were
incorrectly optimised for single character input values and only returned
the first character if multiple characters should have been returned.
diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py
index 89ef8a192..d8747a934 100644
--- a/Cython/Compiler/Nodes.py
+++ b/Cython/Compiler/Nodes.py
@@ -2687,6 +2687,9 @@ class CFuncDefNode(FuncDefNode):
self.generate_arg_none_check(arg, code)
def generate_execution_code(self, code):
+ if code.globalstate.directives['linetrace']:
+ code.mark_pos(self.pos)
+ code.putln("") # generate line tracing code
super(CFuncDefNode, self).generate_execution_code(code)
if self.py_func_stat:
self.py_func_stat.generate_execution_code(code)
diff --git a/tests/run/coverage_nogil.srctree b/tests/run/coverage_nogil.srctree
index 07da14a1f..053008cc2 100644
--- a/tests/run/coverage_nogil.srctree
+++ b/tests/run/coverage_nogil.srctree
@@ -25,19 +25,19 @@ plugins = Cython.Coverage
# cython: linetrace=True
# distutils: define_macros=CYTHON_TRACE=1 CYTHON_TRACE_NOGIL=1
-cdef int func1(int a, int b) nogil:
- cdef int x # 5
- with gil: # 6
- x = 1 # 7
- cdef int c = func2(a) + b # 8
- return x + c # 9
+cdef int func1(int a, int b) nogil: # 4
+ cdef int x # 5
+ with gil: # 6
+ x = 1 # 7
+ cdef int c = func2(a) + b # 8
+ return x + c # 9
-cdef int func2(int a) with gil:
+cdef int func2(int a) with gil: # 12
return a * 2 # 13
-def call(int a, int b):
+def call(int a, int b): # 16
a, b = b, a # 17
with nogil: # 18
result = func1(b, a) # 19
@@ -56,20 +56,18 @@ except ImportError:
from coverage import coverage
-import coverage_test_nogil
-
-assert not any(coverage_test_nogil.__file__.endswith(ext)
- for ext in '.py .pyc .pyo .pyw .pyx .pxi'.split()), \
- coverage_test_nogil.__file__
-
+def run_coverage():
+ cov = coverage()
+ cov.start()
-def run_coverage(module):
+ import coverage_test_nogil as module
module_name = module.__name__
module_path = module_name + '.pyx'
-
- cov = coverage()
- cov.start()
+ assert not any(module.__file__.endswith(ext)
+ for ext in '.py .pyc .pyo .pyw .pyx .pxi'.split()), \
+ module.__file__
assert module.call(1, 2) == (1 * 2) + 2 + 1
+
cov.stop()
out = StringIO()
@@ -84,10 +82,10 @@ def run_coverage(module):
executed = set(exec_lines) - set(missing_lines)
# check that everything that runs with the gil owned was executed
- assert all(line in executed for line in [13, 17, 18, 20]), '%s / %s' % (exec_lines, missing_lines)
+ assert all(line in executed for line in [12, 13, 16, 17, 18, 20]), '%s / %s' % (exec_lines, missing_lines)
# check that everything that runs in nogil sections was executed
- assert all(line in executed for line in [6, 7, 8, 9]), '%s / %s' % (exec_lines, missing_lines)
+ assert all(line in executed for line in [4, 6, 7, 8, 9]), '%s / %s' % (exec_lines, missing_lines)
if __name__ == '__main__':
- run_coverage(coverage_test_nogil)
+ run_coverage()