Commit 02c019e4 authored by Stefan Behnel's avatar Stefan Behnel Committed by GitHub

Merge pull request #2871 from cython/gh1461_cover_sig_line

GH-1461: Include the signature line of cdef functions in the import-time line tracing and coverage report.
parents 060e9090 83737ed9
...@@ -2,6 +2,16 @@ ...@@ -2,6 +2,16 @@
Cython Changelog Cython Changelog
================ ================
0.29.7 (2019-0?-??)
===================
Bugs fixed
----------
* Coverage reporting did not include the signature line of ``cdef`` functions.
(Github issue #1461)
0.29.6 (2019-02-27) 0.29.6 (2019-02-27)
=================== ===================
......
...@@ -2653,6 +2653,9 @@ class CFuncDefNode(FuncDefNode): ...@@ -2653,6 +2653,9 @@ class CFuncDefNode(FuncDefNode):
self.generate_arg_none_check(arg, code) self.generate_arg_none_check(arg, code)
def generate_execution_code(self, 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) super(CFuncDefNode, self).generate_execution_code(code)
if self.py_func_stat: if self.py_func_stat:
self.py_func_stat.generate_execution_code(code) self.py_func_stat.generate_execution_code(code)
......
...@@ -25,19 +25,19 @@ plugins = Cython.Coverage ...@@ -25,19 +25,19 @@ plugins = Cython.Coverage
# cython: linetrace=True # cython: linetrace=True
# distutils: define_macros=CYTHON_TRACE=1 CYTHON_TRACE_NOGIL=1 # distutils: define_macros=CYTHON_TRACE=1 CYTHON_TRACE_NOGIL=1
cdef int func1(int a, int b) nogil: cdef int func1(int a, int b) nogil: # 4
cdef int x # 5 cdef int x # 5
with gil: # 6 with gil: # 6
x = 1 # 7 x = 1 # 7
cdef int c = func2(a) + b # 8 cdef int c = func2(a) + b # 8
return x + c # 9 return x + c # 9
cdef int func2(int a) with gil: cdef int func2(int a) with gil: # 12
return a * 2 # 13 return a * 2 # 13
def call(int a, int b): def call(int a, int b): # 16
a, b = b, a # 17 a, b = b, a # 17
with nogil: # 18 with nogil: # 18
result = func1(b, a) # 19 result = func1(b, a) # 19
...@@ -56,20 +56,18 @@ except ImportError: ...@@ -56,20 +56,18 @@ except ImportError:
from coverage import coverage from coverage import coverage
import coverage_test_nogil def run_coverage():
cov = coverage()
assert not any(coverage_test_nogil.__file__.endswith(ext) cov.start()
for ext in '.py .pyc .pyo .pyw .pyx .pxi'.split()), \
coverage_test_nogil.__file__
def run_coverage(module): import coverage_test_nogil as module
module_name = module.__name__ module_name = module.__name__
module_path = module_name + '.pyx' module_path = module_name + '.pyx'
assert not any(module.__file__.endswith(ext)
cov = coverage() for ext in '.py .pyc .pyo .pyw .pyx .pxi'.split()), \
cov.start() module.__file__
assert module.call(1, 2) == (1 * 2) + 2 + 1 assert module.call(1, 2) == (1 * 2) + 2 + 1
cov.stop() cov.stop()
out = StringIO() out = StringIO()
...@@ -84,10 +82,10 @@ def run_coverage(module): ...@@ -84,10 +82,10 @@ def run_coverage(module):
executed = set(exec_lines) - set(missing_lines) executed = set(exec_lines) - set(missing_lines)
# check that everything that runs with the gil owned was executed # 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 # 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__': if __name__ == '__main__':
run_coverage(coverage_test_nogil) run_coverage()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment