summaryrefslogtreecommitdiff
path: root/coverage
diff options
context:
space:
mode:
Diffstat (limited to 'coverage')
-rw-r--r--coverage/ctracer/tracer.c2
-rw-r--r--coverage/ctracer/util.h8
-rw-r--r--coverage/env.py33
-rw-r--r--coverage/execfile.py10
-rw-r--r--coverage/files.py5
-rw-r--r--[-rwxr-xr-x]coverage/htmlfiles/keybd_closed.pngbin112 -> 112 bytes
-rw-r--r--[-rwxr-xr-x]coverage/htmlfiles/keybd_open.pngbin112 -> 112 bytes
-rw-r--r--coverage/parser.py2
-rw-r--r--coverage/sqldata.py4
-rw-r--r--coverage/xmlreport.py13
10 files changed, 43 insertions, 34 deletions
diff --git a/coverage/ctracer/tracer.c b/coverage/ctracer/tracer.c
index 7d639112..d497a94d 100644
--- a/coverage/ctracer/tracer.c
+++ b/coverage/ctracer/tracer.c
@@ -541,7 +541,7 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame)
/* Make the frame right in case settrace(gettrace()) happens. */
Py_INCREF(self);
- My_XSETREF(frame->f_trace, (PyObject*)self);
+ Py_XSETREF(frame->f_trace, (PyObject*)self);
/* A call event is really a "start frame" event, and can happen for
* re-entering a generator also. f_lasti is -1 for a true call, and a
diff --git a/coverage/ctracer/util.h b/coverage/ctracer/util.h
index 96d2e51c..cb8aceb9 100644
--- a/coverage/ctracer/util.h
+++ b/coverage/ctracer/util.h
@@ -44,14 +44,6 @@
#endif /* Py3k */
-// Undocumented, and not in 2.6, so our own copy of it.
-#define My_XSETREF(op, op2) \
- do { \
- PyObject *_py_tmp = (PyObject *)(op); \
- (op) = (op2); \
- Py_XDECREF(_py_tmp); \
- } while (0)
-
/* The values returned to indicate ok or error. */
#define RET_OK 0
#define RET_ERROR -1
diff --git a/coverage/env.py b/coverage/env.py
index d97b193c..83b4be65 100644
--- a/coverage/env.py
+++ b/coverage/env.py
@@ -28,6 +28,39 @@ PY3 = PYVERSION >= (3, 0)
class PYBEHAVIOR(object):
"""Flags indicating this Python's behavior."""
+ # Is "if __debug__" optimized away?
+ optimize_if_debug = (not PYPY)
+
+ # If "if not __debug__" optimized away?
+ optimize_if_not_debug = (not PYPY) and (PYVERSION >= (3, 7, 0, 'alpha', 4))
+
+ # Do we have yield-from?
+ yield_from = (PYVERSION >= (3, 3))
+
+ # Do we have PEP 420 namespace packages?
+ namespaces_pep420 = (PYVERSION >= (3, 3))
+
+ # Do .pyc files have the source file size recorded in them?
+ size_in_pyc = (PYVERSION >= (3, 3))
+
+ # Do we have async and await syntax?
+ async_syntax = (PYVERSION >= (3, 5))
+
+ # PEP 448 defined additional unpacking generalizations
+ unpackings_pep448 = (PYVERSION >= (3, 5))
+
+ # Can co_lnotab have negative deltas?
+ negative_lnotab = (PYVERSION >= (3, 6))
+
+ # Do .pyc files conform to PEP 552? Hash-based pyc's.
+ hashed_pyc_pep552 = (PYVERSION >= (3, 7, 0, 'alpha', 4))
+
+ # Python 3.7.0b3 changed the behavior of the sys.path[0] entry for -m. It
+ # used to be an empty string (meaning the current directory). It changed
+ # to be the actual path to the current directory, so that os.chdir wouldn't
+ # affect the outcome.
+ actual_syspath0_dash_m = (PYVERSION >= (3, 7, 0, 'beta', 3))
+
# When a break/continue/return statement in a try block jumps to a finally
# block, does the finally block do the break/continue/return (pre-3.8), or
# does the finally jump back to the break/continue/return (3.8) to do the
diff --git a/coverage/execfile.py b/coverage/execfile.py
index 4fc6a85f..97997b06 100644
--- a/coverage/execfile.py
+++ b/coverage/execfile.py
@@ -124,11 +124,7 @@ class PyRunner(object):
should_update_sys_path = True
if self.as_module:
- # Python 3.7.0b3 changed the behavior of the sys.path[0] entry for -m. It
- # used to be an empty string (meaning the current directory). It changed
- # to be the actual path to the current directory, so that os.chdir wouldn't
- # affect the outcome.
- if env.PYVERSION >= (3, 7, 0, 'beta', 3):
+ if env.PYBEHAVIOR.actual_syspath0_dash_m:
path0 = os.getcwd()
else:
path0 = ""
@@ -290,7 +286,7 @@ def make_code_from_pyc(filename):
raise NoCode("Bad magic number in .pyc file")
date_based = True
- if env.PYVERSION >= (3, 7, 0, 'alpha', 4):
+ if env.PYBEHAVIOR.hashed_pyc_pep552:
flags = struct.unpack('<L', fpyc.read(4))[0]
hash_based = flags & 0x01
if hash_based:
@@ -299,7 +295,7 @@ def make_code_from_pyc(filename):
if date_based:
# Skip the junk in the header that we don't need.
fpyc.read(4) # Skip the moddate.
- if env.PYVERSION >= (3, 3):
+ if env.PYBEHAVIOR.size_in_pyc:
# 3.3 added another long to the header (size), skip it.
fpyc.read(4)
diff --git a/coverage/files.py b/coverage/files.py
index b328f653..d9495912 100644
--- a/coverage/files.py
+++ b/coverage/files.py
@@ -59,6 +59,7 @@ def canonical_filename(filename):
"""
if filename not in CANONICAL_FILENAME_CACHE:
+ cf = filename
if not os.path.isabs(filename):
for path in [os.curdir] + sys.path:
if path is None:
@@ -69,9 +70,9 @@ def canonical_filename(filename):
except UnicodeError:
exists = False
if exists:
- filename = f
+ cf = f
break
- cf = abs_file(filename)
+ cf = abs_file(cf)
CANONICAL_FILENAME_CACHE[filename] = cf
return CANONICAL_FILENAME_CACHE[filename]
diff --git a/coverage/htmlfiles/keybd_closed.png b/coverage/htmlfiles/keybd_closed.png
index db114023..db114023 100755..100644
--- a/coverage/htmlfiles/keybd_closed.png
+++ b/coverage/htmlfiles/keybd_closed.png
Binary files differ
diff --git a/coverage/htmlfiles/keybd_open.png b/coverage/htmlfiles/keybd_open.png
index db114023..db114023 100755..100644
--- a/coverage/htmlfiles/keybd_open.png
+++ b/coverage/htmlfiles/keybd_open.png
Binary files differ
diff --git a/coverage/parser.py b/coverage/parser.py
index 1c19f69e..6ae99fe4 100644
--- a/coverage/parser.py
+++ b/coverage/parser.py
@@ -409,7 +409,7 @@ class ByteParser(object):
yield (byte_num, line_num)
last_line_num = line_num
byte_num += byte_incr
- if env.PYVERSION >= (3, 6) and line_incr >= 0x80:
+ if env.PYBEHAVIOR.negative_lnotab and line_incr >= 0x80:
line_incr -= 0x100
line_num += line_incr
if line_num != last_line_num:
diff --git a/coverage/sqldata.py b/coverage/sqldata.py
index 0219a8a2..bf8c1e43 100644
--- a/coverage/sqldata.py
+++ b/coverage/sqldata.py
@@ -545,7 +545,7 @@ class CoverageSqliteData(SimpleReprMixin):
if file_id is None:
return None
else:
- query = "select lineno from line where file_id = ?"
+ query = "select distinct lineno from line where file_id = ?"
data = [file_id]
if context is not None:
query += " and context_id = ?"
@@ -560,7 +560,7 @@ class CoverageSqliteData(SimpleReprMixin):
if file_id is None:
return None
else:
- query = "select fromno, tono from arc where file_id = ?"
+ query = "select distinct fromno, tono from arc where file_id = ?"
data = [file_id]
if context is not None:
query += " and context_id = ?"
diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py
index 6c07337a..8ecdc24a 100644
--- a/coverage/xmlreport.py
+++ b/coverage/xmlreport.py
@@ -6,7 +6,6 @@
import os
import os.path
-import re
import sys
import time
import xml.dom.minidom
@@ -225,16 +224,4 @@ def serialize_xml(dom):
out = dom.toprettyxml()
if env.PY2:
out = out.encode("utf8")
- # In Python 3.8, minidom lost the sorting of attributes: https://bugs.python.org/issue34160
- # For the limited kinds of XML we produce, this re-sorts them.
- if env.PYVERSION >= (3, 8):
- rx_attr = r' [\w-]+="[^"]*"'
- rx_attrs = r'(' + rx_attr + ')+'
- fixed_lines = []
- for line in out.splitlines(True):
- hollow_line = re.sub(rx_attrs, u"☺", line)
- attrs = sorted(re.findall(rx_attr, line))
- new_line = hollow_line.replace(u"☺", "".join(attrs))
- fixed_lines.append(new_line)
- out = "".join(fixed_lines)
return out