Commit a01cf3c2 authored by Jason R. Coombs's avatar Jason R. Coombs

Merge proposals. Ref #866.

parents a29c9a4d 1bd827ef
...@@ -5,6 +5,7 @@ import dis ...@@ -5,6 +5,7 @@ import dis
from distutils.version import StrictVersion from distutils.version import StrictVersion
from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN
__all__ = [ __all__ = [
'Require', 'find_module', 'get_module_constant', 'extract_constant' 'Require', 'find_module', 'get_module_constant', 'extract_constant'
] ]
...@@ -77,14 +78,6 @@ class Require: ...@@ -77,14 +78,6 @@ class Require:
return self.version_ok(version) return self.version_ok(version)
def _iter_code(code):
"""Yield '(op,arg)' pair for each operation in code object 'code'"""
return (
(op.opcode, op.arg)
for op in dis.Bytecode(code)
)
def find_module(module, paths=None): def find_module(module, paths=None):
"""Just like 'imp.find_module()', but with package support""" """Just like 'imp.find_module()', but with package support"""
...@@ -150,9 +143,8 @@ def extract_constant(code, symbol, default=-1): ...@@ -150,9 +143,8 @@ def extract_constant(code, symbol, default=-1):
only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol'
must be present in 'code.co_names'. must be present in 'code.co_names'.
""" """
if symbol not 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 return None
name_idx = list(code.co_names).index(symbol) name_idx = list(code.co_names).index(symbol)
...@@ -163,7 +155,9 @@ def extract_constant(code, symbol, default=-1): ...@@ -163,7 +155,9 @@ def extract_constant(code, symbol, default=-1):
const = default const = default
for op, arg in _iter_code(code): for byte_code in dis.Bytecode(code):
op = byte_code.opcode
arg = byte_code.arg
if op == LOAD_CONST: if op == LOAD_CONST:
const = code.co_consts[arg] const = code.co_consts[arg]
......
...@@ -14,15 +14,3 @@ class TestGetModuleConstant: ...@@ -14,15 +14,3 @@ class TestGetModuleConstant:
val = depends.get_module_constant(mod_name, 'value') val = depends.get_module_constant(mod_name, 'value')
assert val == 'three, sir!' assert val == 'three, sir!'
assert 'setuptools.tests.mod_with_constant' not in sys.modules assert 'setuptools.tests.mod_with_constant' not in sys.modules
class TestIterCode:
def test_empty(self):
code = compile('', '<string>', mode='exec')
expected = (100, 0), (83, None)
assert tuple(depends._iter_code(code)) == expected
def test_constant(self):
code = compile('value = "three, sir!"', '<string>', mode='exec')
expected = (100, 0), (90, 0), (100, 1), (83, None)
assert tuple(depends._iter_code(code)) == expected
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment