aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPreston Landers <planders@utexas.edu>2016-12-28 13:14:53 -0600
committerPreston Landers <planders@utexas.edu>2016-12-28 13:14:53 -0600
commit1bd827efdf08b77f8a0a29c58dfc805368466964 (patch)
tree365ccdb9ca5fa60a5bf28249dbaef8171e2fce06
parent6d69dd73b900cff84ee142ad82967dd025a75b72 (diff)
downloadexternal_python_setuptools-1bd827efdf08b77f8a0a29c58dfc805368466964.tar.gz
external_python_setuptools-1bd827efdf08b77f8a0a29c58dfc805368466964.tar.bz2
external_python_setuptools-1bd827efdf08b77f8a0a29c58dfc805368466964.zip
Attempt to fix issue #866 by iterating over code with `dis.Bytecode` instead of the internal `_iter_code`.
The `dis` module was already used in `_iter_code` so I figured it was safe to use `Bytecode` from it. Not sure how this assumption holds up across all supported Python releases. I can only assume `Bytecode` wasn't there before when `_iter_code` was originally written? Note that `_iter_code` doesn't appear to be called anywhere in light of this change so I removed it. I should also note that `get_module_constant` has never worked with `setuptools.__version__` (returns -1) because it's not a string literal; it gets that attribute from another module. But this change does work in cases where a string literal is requested. https://github.com/pypa/setuptools/issues/866
-rw-r--r--setuptools/depends.py43
1 files changed, 6 insertions, 37 deletions
diff --git a/setuptools/depends.py b/setuptools/depends.py
index 89d39a50..d8496ef8 100644
--- a/setuptools/depends.py
+++ b/setuptools/depends.py
@@ -4,7 +4,6 @@ import marshal
from distutils.version import StrictVersion
from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN
-from setuptools.extern import six
__all__ = [
'Require', 'find_module', 'get_module_constant', 'extract_constant'
@@ -78,39 +77,6 @@ class Require:
return self.version_ok(version)
-def _iter_code(code):
- """Yield '(op,arg)' pair for each operation in code object 'code'"""
-
- from array import array
- from dis import HAVE_ARGUMENT, EXTENDED_ARG
-
- bytes = array('b', code.co_code)
- eof = len(code.co_code)
-
- ptr = 0
- extended_arg = 0
-
- while ptr < eof:
-
- op = bytes[ptr]
-
- if op >= HAVE_ARGUMENT:
-
- arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg
- ptr += 3
-
- if op == EXTENDED_ARG:
- long_type = six.integer_types[-1]
- extended_arg = arg * long_type(65536)
- continue
-
- else:
- arg = None
- ptr += 1
-
- yield op, arg
-
-
def find_module(module, paths=None):
"""Just like 'imp.find_module()', but with package support"""
@@ -176,11 +142,12 @@ def extract_constant(code, symbol, default=-1):
only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol'
must be present in 'code.co_names'.
"""
-
if symbol not in code.co_names:
- # name's not there, can't possibly be an assigment
+ # name's not there, can't possibly be an assignment
return None
+ from dis import Bytecode
+
name_idx = list(code.co_names).index(symbol)
STORE_NAME = 90
@@ -189,7 +156,9 @@ def extract_constant(code, symbol, default=-1):
const = default
- for op, arg in _iter_code(code):
+ for byte_code in Bytecode(code):
+ op = byte_code.opcode
+ arg = byte_code.arg
if op == LOAD_CONST:
const = code.co_consts[arg]