Index: tools/telemetry/third_party/coverage/lab/show_pyc.py |
diff --git a/tools/telemetry/third_party/coverage/lab/show_pyc.py b/tools/telemetry/third_party/coverage/lab/show_pyc.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..147c6ff847a846e4deae3d93c4670845e6dd0060 |
--- /dev/null |
+++ b/tools/telemetry/third_party/coverage/lab/show_pyc.py |
@@ -0,0 +1,73 @@ |
+# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 |
+# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt |
+ |
+import dis, marshal, struct, sys, time, types |
+ |
+def show_pyc_file(fname): |
+ f = open(fname, "rb") |
+ magic = f.read(4) |
+ moddate = f.read(4) |
+ modtime = time.asctime(time.localtime(struct.unpack('<L', moddate)[0])) |
+ print "magic %s" % (magic.encode('hex')) |
+ print "moddate %s (%s)" % (moddate.encode('hex'), modtime) |
+ code = marshal.load(f) |
+ show_code(code) |
+ |
+def show_py_file(fname): |
+ text = open(fname).read().replace('\r\n', '\n') |
+ show_py_text(text, fname=fname) |
+ |
+def show_py_text(text, fname="<string>"): |
+ code = compile(text, fname, "exec") |
+ show_code(code) |
+ |
+def show_code(code, indent=''): |
+ print "%scode" % indent |
+ indent += ' ' |
+ print "%sargcount %d" % (indent, code.co_argcount) |
+ print "%snlocals %d" % (indent, code.co_nlocals) |
+ print "%sstacksize %d" % (indent, code.co_stacksize) |
+ print "%sflags %04x" % (indent, code.co_flags) |
+ show_hex("code", code.co_code, indent=indent) |
+ dis.disassemble(code) |
+ print "%sconsts" % indent |
+ for const in code.co_consts: |
+ if type(const) == types.CodeType: |
+ show_code(const, indent+' ') |
+ else: |
+ print " %s%r" % (indent, const) |
+ print "%snames %r" % (indent, code.co_names) |
+ print "%svarnames %r" % (indent, code.co_varnames) |
+ print "%sfreevars %r" % (indent, code.co_freevars) |
+ print "%scellvars %r" % (indent, code.co_cellvars) |
+ print "%sfilename %r" % (indent, code.co_filename) |
+ print "%sname %r" % (indent, code.co_name) |
+ print "%sfirstlineno %d" % (indent, code.co_firstlineno) |
+ show_hex("lnotab", code.co_lnotab, indent=indent) |
+ |
+def show_hex(label, h, indent): |
+ h = h.encode('hex') |
+ if len(h) < 60: |
+ print "%s%s %s" % (indent, label, h) |
+ else: |
+ print "%s%s" % (indent, label) |
+ for i in range(0, len(h), 60): |
+ print "%s %s" % (indent, h[i:i+60]) |
+ |
+def show_file(fname): |
+ if fname.endswith('pyc'): |
+ show_pyc_file(fname) |
+ elif fname.endswith('py'): |
+ show_py_file(fname) |
+ else: |
+ print "Odd file:", fname |
+ |
+def main(args): |
+ if args[0] == '-c': |
+ show_py_text(" ".join(args[1:]).replace(";", "\n")) |
+ else: |
+ for a in args: |
+ show_file(a) |
+ |
+if __name__ == '__main__': |
+ main(sys.argv[1:]) |