summaryrefslogtreecommitdiff
path: root/lib/python2.7/site-packages/setuptools/py33compat.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/setuptools/py33compat.py')
-rw-r--r--lib/python2.7/site-packages/setuptools/py33compat.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/setuptools/py33compat.py b/lib/python2.7/site-packages/setuptools/py33compat.py
new file mode 100644
index 0000000..af64d5d
--- /dev/null
+++ b/lib/python2.7/site-packages/setuptools/py33compat.py
@@ -0,0 +1,45 @@
+import dis
+import array
+import collections
+
+from setuptools.extern import six
+
+
+OpArg = collections.namedtuple('OpArg', 'opcode arg')
+
+
+class Bytecode_compat(object):
+ def __init__(self, code):
+ self.code = code
+
+ def __iter__(self):
+ """Yield '(op,arg)' pair for each operation in code object 'code'"""
+
+ bytes = array.array('b', self.code.co_code)
+ eof = len(self.code.co_code)
+
+ ptr = 0
+ extended_arg = 0
+
+ while ptr < eof:
+
+ op = bytes[ptr]
+
+ if op >= dis.HAVE_ARGUMENT:
+
+ arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg
+ ptr += 3
+
+ if op == dis.EXTENDED_ARG:
+ long_type = six.integer_types[-1]
+ extended_arg = arg * long_type(65536)
+ continue
+
+ else:
+ arg = None
+ ptr += 1
+
+ yield OpArg(op, arg)
+
+
+Bytecode = getattr(dis, 'Bytecode', Bytecode_compat)