| Index: tools/telemetry/third_party/coverage/coverage/execfile.py
|
| diff --git a/tools/telemetry/third_party/coverage/coverage/execfile.py b/tools/telemetry/third_party/coverage/coverage/execfile.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1845f8d73e89f7b6583e0d966e9912379b922960
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/coverage/coverage/execfile.py
|
| @@ -0,0 +1,237 @@
|
| +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
|
| +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
|
| +
|
| +"""Execute files of Python code."""
|
| +
|
| +import marshal
|
| +import os
|
| +import sys
|
| +import types
|
| +
|
| +from coverage.backward import BUILTINS
|
| +from coverage.backward import PYC_MAGIC_NUMBER, imp, importlib_util_find_spec
|
| +from coverage.misc import ExceptionDuringRun, NoCode, NoSource
|
| +from coverage.phystokens import compile_unicode
|
| +from coverage.python import get_python_source
|
| +
|
| +
|
| +class DummyLoader(object):
|
| + """A shim for the pep302 __loader__, emulating pkgutil.ImpLoader.
|
| +
|
| + Currently only implements the .fullname attribute
|
| + """
|
| + def __init__(self, fullname, *_args):
|
| + self.fullname = fullname
|
| +
|
| +
|
| +if importlib_util_find_spec:
|
| + def find_module(modulename):
|
| + """Find the module named `modulename`.
|
| +
|
| + Returns the file path of the module, and the name of the enclosing
|
| + package.
|
| + """
|
| + try:
|
| + spec = importlib_util_find_spec(modulename)
|
| + except ImportError as err:
|
| + raise NoSource(str(err))
|
| + if not spec:
|
| + raise NoSource("No module named %r" % (modulename,))
|
| + pathname = spec.origin
|
| + packagename = spec.name
|
| + if pathname.endswith("__init__.py"):
|
| + mod_main = modulename + ".__main__"
|
| + spec = importlib_util_find_spec(mod_main)
|
| + if not spec:
|
| + raise NoSource(
|
| + "No module named %s; "
|
| + "%r is a package and cannot be directly executed"
|
| + % (mod_main, modulename)
|
| + )
|
| + pathname = spec.origin
|
| + packagename = spec.name
|
| + packagename = packagename.rpartition(".")[0]
|
| + return pathname, packagename
|
| +else:
|
| + def find_module(modulename):
|
| + """Find the module named `modulename`.
|
| +
|
| + Returns the file path of the module, and the name of the enclosing
|
| + package.
|
| + """
|
| + openfile = None
|
| + glo, loc = globals(), locals()
|
| + try:
|
| + # Search for the module - inside its parent package, if any - using
|
| + # standard import mechanics.
|
| + if '.' in modulename:
|
| + packagename, name = modulename.rsplit('.', 1)
|
| + package = __import__(packagename, glo, loc, ['__path__'])
|
| + searchpath = package.__path__
|
| + else:
|
| + packagename, name = None, modulename
|
| + searchpath = None # "top-level search" in imp.find_module()
|
| + openfile, pathname, _ = imp.find_module(name, searchpath)
|
| +
|
| + # Complain if this is a magic non-file module.
|
| + if openfile is None and pathname is None:
|
| + raise NoSource(
|
| + "module does not live in a file: %r" % modulename
|
| + )
|
| +
|
| + # If `modulename` is actually a package, not a mere module, then we
|
| + # pretend to be Python 2.7 and try running its __main__.py script.
|
| + if openfile is None:
|
| + packagename = modulename
|
| + name = '__main__'
|
| + package = __import__(packagename, glo, loc, ['__path__'])
|
| + searchpath = package.__path__
|
| + openfile, pathname, _ = imp.find_module(name, searchpath)
|
| + except ImportError as err:
|
| + raise NoSource(str(err))
|
| + finally:
|
| + if openfile:
|
| + openfile.close()
|
| +
|
| + return pathname, packagename
|
| +
|
| +
|
| +def run_python_module(modulename, args):
|
| + """Run a Python module, as though with ``python -m name args...``.
|
| +
|
| + `modulename` is the name of the module, possibly a dot-separated name.
|
| + `args` is the argument array to present as sys.argv, including the first
|
| + element naming the module being executed.
|
| +
|
| + """
|
| + pathname, packagename = find_module(modulename)
|
| +
|
| + pathname = os.path.abspath(pathname)
|
| + args[0] = pathname
|
| + run_python_file(pathname, args, package=packagename, modulename=modulename, path0="")
|
| +
|
| +
|
| +def run_python_file(filename, args, package=None, modulename=None, path0=None):
|
| + """Run a Python file as if it were the main program on the command line.
|
| +
|
| + `filename` is the path to the file to execute, it need not be a .py file.
|
| + `args` is the argument array to present as sys.argv, including the first
|
| + element naming the file being executed. `package` is the name of the
|
| + enclosing package, if any.
|
| +
|
| + `modulename` is the name of the module the file was run as.
|
| +
|
| + `path0` is the value to put into sys.path[0]. If it's None, then this
|
| + function will decide on a value.
|
| +
|
| + """
|
| + if modulename is None and sys.version_info >= (3, 3):
|
| + modulename = '__main__'
|
| +
|
| + # Create a module to serve as __main__
|
| + old_main_mod = sys.modules['__main__']
|
| + main_mod = types.ModuleType('__main__')
|
| + sys.modules['__main__'] = main_mod
|
| + main_mod.__file__ = filename
|
| + if package:
|
| + main_mod.__package__ = package
|
| + if modulename:
|
| + main_mod.__loader__ = DummyLoader(modulename)
|
| +
|
| + main_mod.__builtins__ = BUILTINS
|
| +
|
| + # Set sys.argv properly.
|
| + old_argv = sys.argv
|
| + sys.argv = args
|
| +
|
| + if os.path.isdir(filename):
|
| + # Running a directory means running the __main__.py file in that
|
| + # directory.
|
| + my_path0 = filename
|
| +
|
| + for ext in [".py", ".pyc", ".pyo"]:
|
| + try_filename = os.path.join(filename, "__main__" + ext)
|
| + if os.path.exists(try_filename):
|
| + filename = try_filename
|
| + break
|
| + else:
|
| + raise NoSource("Can't find '__main__' module in '%s'" % filename)
|
| + else:
|
| + my_path0 = os.path.abspath(os.path.dirname(filename))
|
| +
|
| + # Set sys.path correctly.
|
| + old_path0 = sys.path[0]
|
| + sys.path[0] = path0 if path0 is not None else my_path0
|
| +
|
| + try:
|
| + # Make a code object somehow.
|
| + if filename.endswith((".pyc", ".pyo")):
|
| + code = make_code_from_pyc(filename)
|
| + else:
|
| + code = make_code_from_py(filename)
|
| +
|
| + # Execute the code object.
|
| + try:
|
| + exec(code, main_mod.__dict__)
|
| + except SystemExit:
|
| + # The user called sys.exit(). Just pass it along to the upper
|
| + # layers, where it will be handled.
|
| + raise
|
| + except:
|
| + # Something went wrong while executing the user code.
|
| + # Get the exc_info, and pack them into an exception that we can
|
| + # throw up to the outer loop. We peel one layer off the traceback
|
| + # so that the coverage.py code doesn't appear in the final printed
|
| + # traceback.
|
| + typ, err, tb = sys.exc_info()
|
| +
|
| + # PyPy3 weirdness. If I don't access __context__, then somehow it
|
| + # is non-None when the exception is reported at the upper layer,
|
| + # and a nested exception is shown to the user. This getattr fixes
|
| + # it somehow? https://bitbucket.org/pypy/pypy/issue/1903
|
| + getattr(err, '__context__', None)
|
| +
|
| + raise ExceptionDuringRun(typ, err, tb.tb_next)
|
| + finally:
|
| + # Restore the old __main__, argv, and path.
|
| + sys.modules['__main__'] = old_main_mod
|
| + sys.argv = old_argv
|
| + sys.path[0] = old_path0
|
| +
|
| +
|
| +def make_code_from_py(filename):
|
| + """Get source from `filename` and make a code object of it."""
|
| + # Open the source file.
|
| + try:
|
| + source = get_python_source(filename)
|
| + except (IOError, NoSource):
|
| + raise NoSource("No file to run: '%s'" % filename)
|
| +
|
| + code = compile_unicode(source, filename, "exec")
|
| + return code
|
| +
|
| +
|
| +def make_code_from_pyc(filename):
|
| + """Get a code object from a .pyc file."""
|
| + try:
|
| + fpyc = open(filename, "rb")
|
| + except IOError:
|
| + raise NoCode("No file to run: '%s'" % filename)
|
| +
|
| + with fpyc:
|
| + # First four bytes are a version-specific magic number. It has to
|
| + # match or we won't run the file.
|
| + magic = fpyc.read(4)
|
| + if magic != PYC_MAGIC_NUMBER:
|
| + raise NoCode("Bad magic number in .pyc file")
|
| +
|
| + # Skip the junk in the header that we don't need.
|
| + fpyc.read(4) # Skip the moddate.
|
| + if sys.version_info >= (3, 3):
|
| + # 3.3 added another long to the header (size), skip it.
|
| + fpyc.read(4)
|
| +
|
| + # The rest of the file is the code object we want.
|
| + code = marshal.load(fpyc)
|
| +
|
| + return code
|
|
|