Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3c51cf2

Browse files
committed
Oops, bug omission: also scan internal code objects for imports!
1 parent 912a14c commit 3c51cf2

1 file changed

Lines changed: 37 additions & 31 deletions

File tree

Tools/freeze/modulefinder.py

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -232,40 +232,46 @@ def load_module(self, fqname, fp, pathname, (suffix, mode, type)):
232232
if co:
233233
m.__file__ = pathname
234234
m.__code__ = co
235-
code = co.co_code
236-
n = len(code)
237-
i = 0
238-
lastname = None
239-
while i < n:
240-
c = code[i]
241-
i = i+1
242-
op = ord(c)
243-
if op >= dis.HAVE_ARGUMENT:
244-
oparg = ord(code[i]) + ord(code[i+1])*256
245-
i = i+2
246-
if op == IMPORT_NAME:
247-
name = lastname = co.co_names[oparg]
248-
if not self.badmodules.has_key(lastname):
249-
try:
250-
self.import_hook(name, m)
251-
except ImportError, msg:
252-
self.msg(2, "ImportError:", str(msg))
253-
self.badmodules[name] = None
254-
elif op == IMPORT_FROM:
255-
name = co.co_names[oparg]
256-
assert lastname is not None
257-
if not self.badmodules.has_key(lastname):
258-
try:
259-
self.import_hook(lastname, m, [name])
260-
except ImportError, msg:
261-
self.msg(2, "ImportError:", str(msg))
262-
fullname = lastname + "." + name
263-
self.badmodules[fullname] = None
264-
else:
265-
lastname = None
235+
self.scan_code(co, m)
266236
self.msgout(2, "load_module ->", m)
267237
return m
268238

239+
def scan_code(self, co, m):
240+
code = co.co_code
241+
n = len(code)
242+
i = 0
243+
lastname = None
244+
while i < n:
245+
c = code[i]
246+
i = i+1
247+
op = ord(c)
248+
if op >= dis.HAVE_ARGUMENT:
249+
oparg = ord(code[i]) + ord(code[i+1])*256
250+
i = i+2
251+
if op == IMPORT_NAME:
252+
name = lastname = co.co_names[oparg]
253+
if not self.badmodules.has_key(lastname):
254+
try:
255+
self.import_hook(name, m)
256+
except ImportError, msg:
257+
self.msg(2, "ImportError:", str(msg))
258+
self.badmodules[name] = None
259+
elif op == IMPORT_FROM:
260+
name = co.co_names[oparg]
261+
assert lastname is not None
262+
if not self.badmodules.has_key(lastname):
263+
try:
264+
self.import_hook(lastname, m, [name])
265+
except ImportError, msg:
266+
self.msg(2, "ImportError:", str(msg))
267+
fullname = lastname + "." + name
268+
self.badmodules[fullname] = None
269+
else:
270+
lastname = None
271+
for c in co.co_consts:
272+
if isinstance(c, type(co)):
273+
self.scan_code(c, m)
274+
269275
def load_package(self, fqname, pathname):
270276
self.msgin(2, "load_package", fqname, pathname)
271277
m = self.add_module(fqname)

0 commit comments

Comments
 (0)