]> git.proxmox.com Git - mirror_edk2.git/blobdiff - AppPkg/Applications/Python/Python-2.7.10/Lib/dis.py
AppPkg/Applications/Python/Python-2.7.10: Initial Checkin part 4/5.
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.10 / Lib / dis.py
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Lib/dis.py b/AppPkg/Applications/Python/Python-2.7.10/Lib/dis.py
new file mode 100644 (file)
index 0000000..cdb9c59
--- /dev/null
@@ -0,0 +1,224 @@
+"""Disassembler of Python byte code into mnemonics."""\r
+\r
+import sys\r
+import types\r
+\r
+from opcode import *\r
+from opcode import __all__ as _opcodes_all\r
+\r
+__all__ = ["dis", "disassemble", "distb", "disco",\r
+           "findlinestarts", "findlabels"] + _opcodes_all\r
+del _opcodes_all\r
+\r
+_have_code = (types.MethodType, types.FunctionType, types.CodeType,\r
+              types.ClassType, type)\r
+\r
+def dis(x=None):\r
+    """Disassemble classes, methods, functions, or code.\r
+\r
+    With no argument, disassemble the last traceback.\r
+\r
+    """\r
+    if x is None:\r
+        distb()\r
+        return\r
+    if isinstance(x, types.InstanceType):\r
+        x = x.__class__\r
+    if hasattr(x, 'im_func'):\r
+        x = x.im_func\r
+    if hasattr(x, 'func_code'):\r
+        x = x.func_code\r
+    if hasattr(x, '__dict__'):\r
+        items = x.__dict__.items()\r
+        items.sort()\r
+        for name, x1 in items:\r
+            if isinstance(x1, _have_code):\r
+                print "Disassembly of %s:" % name\r
+                try:\r
+                    dis(x1)\r
+                except TypeError, msg:\r
+                    print "Sorry:", msg\r
+                print\r
+    elif hasattr(x, 'co_code'):\r
+        disassemble(x)\r
+    elif isinstance(x, str):\r
+        disassemble_string(x)\r
+    else:\r
+        raise TypeError, \\r
+              "don't know how to disassemble %s objects" % \\r
+              type(x).__name__\r
+\r
+def distb(tb=None):\r
+    """Disassemble a traceback (default: last traceback)."""\r
+    if tb is None:\r
+        try:\r
+            tb = sys.last_traceback\r
+        except AttributeError:\r
+            raise RuntimeError, "no last traceback to disassemble"\r
+        while tb.tb_next: tb = tb.tb_next\r
+    disassemble(tb.tb_frame.f_code, tb.tb_lasti)\r
+\r
+def disassemble(co, lasti=-1):\r
+    """Disassemble a code object."""\r
+    code = co.co_code\r
+    labels = findlabels(code)\r
+    linestarts = dict(findlinestarts(co))\r
+    n = len(code)\r
+    i = 0\r
+    extended_arg = 0\r
+    free = None\r
+    while i < n:\r
+        c = code[i]\r
+        op = ord(c)\r
+        if i in linestarts:\r
+            if i > 0:\r
+                print\r
+            print "%3d" % linestarts[i],\r
+        else:\r
+            print '   ',\r
+\r
+        if i == lasti: print '-->',\r
+        else: print '   ',\r
+        if i in labels: print '>>',\r
+        else: print '  ',\r
+        print repr(i).rjust(4),\r
+        print opname[op].ljust(20),\r
+        i = i+1\r
+        if op >= HAVE_ARGUMENT:\r
+            oparg = ord(code[i]) + ord(code[i+1])*256 + extended_arg\r
+            extended_arg = 0\r
+            i = i+2\r
+            if op == EXTENDED_ARG:\r
+                extended_arg = oparg*65536L\r
+            print repr(oparg).rjust(5),\r
+            if op in hasconst:\r
+                print '(' + repr(co.co_consts[oparg]) + ')',\r
+            elif op in hasname:\r
+                print '(' + co.co_names[oparg] + ')',\r
+            elif op in hasjrel:\r
+                print '(to ' + repr(i + oparg) + ')',\r
+            elif op in haslocal:\r
+                print '(' + co.co_varnames[oparg] + ')',\r
+            elif op in hascompare:\r
+                print '(' + cmp_op[oparg] + ')',\r
+            elif op in hasfree:\r
+                if free is None:\r
+                    free = co.co_cellvars + co.co_freevars\r
+                print '(' + free[oparg] + ')',\r
+        print\r
+\r
+def disassemble_string(code, lasti=-1, varnames=None, names=None,\r
+                       constants=None):\r
+    labels = findlabels(code)\r
+    n = len(code)\r
+    i = 0\r
+    while i < n:\r
+        c = code[i]\r
+        op = ord(c)\r
+        if i == lasti: print '-->',\r
+        else: print '   ',\r
+        if i in labels: print '>>',\r
+        else: print '  ',\r
+        print repr(i).rjust(4),\r
+        print opname[op].ljust(15),\r
+        i = i+1\r
+        if op >= HAVE_ARGUMENT:\r
+            oparg = ord(code[i]) + ord(code[i+1])*256\r
+            i = i+2\r
+            print repr(oparg).rjust(5),\r
+            if op in hasconst:\r
+                if constants:\r
+                    print '(' + repr(constants[oparg]) + ')',\r
+                else:\r
+                    print '(%d)'%oparg,\r
+            elif op in hasname:\r
+                if names is not None:\r
+                    print '(' + names[oparg] + ')',\r
+                else:\r
+                    print '(%d)'%oparg,\r
+            elif op in hasjrel:\r
+                print '(to ' + repr(i + oparg) + ')',\r
+            elif op in haslocal:\r
+                if varnames:\r
+                    print '(' + varnames[oparg] + ')',\r
+                else:\r
+                    print '(%d)' % oparg,\r
+            elif op in hascompare:\r
+                print '(' + cmp_op[oparg] + ')',\r
+        print\r
+\r
+disco = disassemble                     # XXX For backwards compatibility\r
+\r
+def findlabels(code):\r
+    """Detect all offsets in a byte code which are jump targets.\r
+\r
+    Return the list of offsets.\r
+\r
+    """\r
+    labels = []\r
+    n = len(code)\r
+    i = 0\r
+    while i < n:\r
+        c = code[i]\r
+        op = ord(c)\r
+        i = i+1\r
+        if op >= HAVE_ARGUMENT:\r
+            oparg = ord(code[i]) + ord(code[i+1])*256\r
+            i = i+2\r
+            label = -1\r
+            if op in hasjrel:\r
+                label = i+oparg\r
+            elif op in hasjabs:\r
+                label = oparg\r
+            if label >= 0:\r
+                if label not in labels:\r
+                    labels.append(label)\r
+    return labels\r
+\r
+def findlinestarts(code):\r
+    """Find the offsets in a byte code which are start of lines in the source.\r
+\r
+    Generate pairs (offset, lineno) as described in Python/compile.c.\r
+\r
+    """\r
+    byte_increments = [ord(c) for c in code.co_lnotab[0::2]]\r
+    line_increments = [ord(c) for c in code.co_lnotab[1::2]]\r
+\r
+    lastlineno = None\r
+    lineno = code.co_firstlineno\r
+    addr = 0\r
+    for byte_incr, line_incr in zip(byte_increments, line_increments):\r
+        if byte_incr:\r
+            if lineno != lastlineno:\r
+                yield (addr, lineno)\r
+                lastlineno = lineno\r
+            addr += byte_incr\r
+        lineno += line_incr\r
+    if lineno != lastlineno:\r
+        yield (addr, lineno)\r
+\r
+def _test():\r
+    """Simple test program to disassemble a file."""\r
+    if sys.argv[1:]:\r
+        if sys.argv[2:]:\r
+            sys.stderr.write("usage: python dis.py [-|file]\n")\r
+            sys.exit(2)\r
+        fn = sys.argv[1]\r
+        if not fn or fn == "-":\r
+            fn = None\r
+    else:\r
+        fn = None\r
+    if fn is None:\r
+        f = sys.stdin\r
+    else:\r
+        f = open(fn)\r
+    source = f.read()\r
+    if fn is not None:\r
+        f.close()\r
+    else:\r
+        fn = "<stdin>"\r
+    code = compile(source, fn, "exec")\r
+    dis(code)\r
+\r
+if __name__ == "__main__":\r
+    _test()\r