diff options
Diffstat (limited to 'coverage')
-rw-r--r-- | coverage/ctracer/tracer.c | 2 | ||||
-rw-r--r-- | coverage/ctracer/util.h | 8 | ||||
-rw-r--r-- | coverage/env.py | 33 | ||||
-rw-r--r-- | coverage/execfile.py | 10 | ||||
-rw-r--r-- | coverage/files.py | 5 | ||||
-rw-r--r--[-rwxr-xr-x] | coverage/htmlfiles/keybd_closed.png | bin | 112 -> 112 bytes | |||
-rw-r--r--[-rwxr-xr-x] | coverage/htmlfiles/keybd_open.png | bin | 112 -> 112 bytes | |||
-rw-r--r-- | coverage/parser.py | 2 | ||||
-rw-r--r-- | coverage/sqldata.py | 4 | ||||
-rw-r--r-- | coverage/xmlreport.py | 13 |
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 Binary files differindex db114023..db114023 100755..100644 --- a/coverage/htmlfiles/keybd_closed.png +++ b/coverage/htmlfiles/keybd_closed.png diff --git a/coverage/htmlfiles/keybd_open.png b/coverage/htmlfiles/keybd_open.png Binary files differindex db114023..db114023 100755..100644 --- a/coverage/htmlfiles/keybd_open.png +++ b/coverage/htmlfiles/keybd_open.png 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 |