summaryrefslogtreecommitdiff
path: root/coverage
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2017-03-14 13:40:14 -0400
committerNed Batchelder <ned@nedbatchelder.com>2017-03-14 13:40:14 -0400
commit50a3baf54146337172d5efc57933adceb2b2fb78 (patch)
tree8ca9cee690bcbffd0c29f9b6978490dbda07589b /coverage
parentde73882e515fcce4bc4f2c62f0a6de42178866a5 (diff)
downloadpython-coveragepy-50a3baf54146337172d5efc57933adceb2b2fb78.tar.gz
Minimal IronPython support.
IronPython is weird: 2.7.7 has "str is unicode", and unicode.encode produces unicode! f_lasti is missing, and frame globals are missing.
Diffstat (limited to 'coverage')
-rw-r--r--coverage/control.py6
-rw-r--r--coverage/env.py1
-rw-r--r--coverage/python.py8
-rw-r--r--coverage/pytracer.py2
4 files changed, 14 insertions, 3 deletions
diff --git a/coverage/control.py b/coverage/control.py
index d42cbdc..4cc7645 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -393,6 +393,10 @@ class Coverage(object):
can't be determined, None is returned.
"""
+ if module_globals is None: # pragma: only ironpython
+ # IronPython doesn't provide globals: https://github.com/IronLanguages/main/issues/1296
+ module_globals = {}
+
dunder_name = module_globals.get('__name__', None)
if isinstance(dunder_name, str) and dunder_name != '__main__':
@@ -441,7 +445,7 @@ class Coverage(object):
# .pyc files can be moved after compilation (for example, by being
# installed), we look for __file__ in the frame and prefer it to the
# co_filename value.
- dunder_file = frame.f_globals.get('__file__')
+ dunder_file = frame.f_globals and frame.f_globals.get('__file__')
if dunder_file:
filename = source_for_file(dunder_file)
if original_filename and not original_filename.startswith('<'):
diff --git a/coverage/env.py b/coverage/env.py
index 528c774..4699a1e 100644
--- a/coverage/env.py
+++ b/coverage/env.py
@@ -17,6 +17,7 @@ if PYPY:
PYPYVERSION = sys.pypy_version_info
JYTHON = (platform.python_implementation() == 'Jython')
+IRONPYTHON = (platform.python_implementation() == 'IronPython')
# Python versions.
PYVERSION = sys.version_info
diff --git a/coverage/python.py b/coverage/python.py
index f75be60..9418c38 100644
--- a/coverage/python.py
+++ b/coverage/python.py
@@ -26,7 +26,13 @@ def read_python_source(filename):
"""
with open(filename, "rb") as f:
- return f.read().replace(b"\r\n", b"\n").replace(b"\r", b"\n")
+ source = f.read()
+
+ if env.IRONPYTHON:
+ # IronPython reads Unicode strings even for "rb" files.
+ source = bytes(source)
+
+ return source.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
@contract(returns='unicode')
diff --git a/coverage/pytracer.py b/coverage/pytracer.py
index 3cf956f..6dae014 100644
--- a/coverage/pytracer.py
+++ b/coverage/pytracer.py
@@ -101,7 +101,7 @@ class PyTracer(object):
# function calls and re-entering generators. The f_lasti field is
# -1 for calls, and a real offset for generators. Use <0 as the
# line number for calls, and the real line number for generators.
- if frame.f_lasti < 0:
+ if getattr(frame, 'f_lasti', -1) < 0:
self.last_line = -frame.f_code.co_firstlineno
else:
self.last_line = frame.f_lineno