[pypy-commit] pypy stmgc-c7: (xoraxax, arigo) Fix two broken behaviors of zipimport:
arigo
noreply at buildbot.pypy.org
Sun Feb 22 12:59:02 CET 2015
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r76041:752077ecf930
Date: 2015-02-22 12:21 +0100
http://bitbucket.org/pypy/pypy/changeset/752077ecf930/
Log: (xoraxax, arigo) Fix two broken behaviors of zipimport:
* random exceptions produced by importing the modules were eaten
and (sometimes) re-raised as ZipImportErrors with the same
message, which does not make sense (added test_import_exception)
* calling import_py_file() from import_pyc_file() would try to
parse the pyc bytes as Python code! (transplanted from
5ada2fb6796fbc176e7ea49c513fd1edf1ddf709)
diff --git a/pypy/module/zipimport/interp_zipimport.py b/pypy/module/zipimport/interp_zipimport.py
--- a/pypy/module/zipimport/interp_zipimport.py
+++ b/pypy/module/zipimport/interp_zipimport.py
@@ -199,8 +199,7 @@
magic = importing._get_long(buf[:4])
timestamp = importing._get_long(buf[4:8])
if not self.can_use_pyc(space, filename, magic, timestamp):
- return self.import_py_file(space, modname, filename[:-1], buf,
- pkgpath)
+ return None
buf = buf[8:] # XXX ugly copy, should use sequential read instead
w_mod = w(Module(space, w(modname)))
real_name = self.filename + os.path.sep + self.corr_zname(filename)
@@ -249,7 +248,6 @@
def load_module(self, space, fullname):
w = space.wrap
filename = self.make_filename(fullname)
- last_exc = None
for compiled, is_package, ext in ENUMERATE_EXTS:
fname = filename + ext
try:
@@ -268,19 +266,18 @@
pkgpath = None
try:
if compiled:
- return self.import_pyc_file(space, fullname, fname,
- buf, pkgpath)
+ w_result = self.import_pyc_file(space, fullname, fname,
+ buf, pkgpath)
+ if w_result is not None:
+ return w_result
else:
return self.import_py_file(space, fullname, fname,
buf, pkgpath)
- except OperationError, e:
- last_exc = e
+ except:
w_mods = space.sys.get('modules')
- space.call_method(w_mods, 'pop', w(fullname), space.w_None)
- if last_exc:
- raise OperationError(get_error(space), last_exc.get_w_value(space))
- # should never happen I think
- return space.w_None
+ space.call_method(w_mods, 'pop', w(fullname), space.w_None)
+ raise
+ raise oefmt(get_error(space), "can't find module '%s'", fullname)
@unwrap_spec(filename=str)
def get_data(self, space, filename):
diff --git a/pypy/module/zipimport/test/test_zipimport.py b/pypy/module/zipimport/test/test_zipimport.py
--- a/pypy/module/zipimport/test/test_zipimport.py
+++ b/pypy/module/zipimport/test/test_zipimport.py
@@ -195,7 +195,8 @@
m0 ^= 0x04
test_pyc = chr(m0) + self.test_pyc[1:]
self.writefile("uu.pyc", test_pyc)
- raises(ImportError, "__import__('uu', globals(), locals(), [])")
+ raises(zipimport.ZipImportError,
+ "__import__('uu', globals(), locals(), [])")
assert 'uu' not in sys.modules
def test_force_py(self):
@@ -360,6 +361,11 @@
co_filename = code.co_filename
assert co_filename == expected
+ def test_import_exception(self):
+ self.writefile('x1test.py', '1/0')
+ self.writefile('x1test/__init__.py', 'raise ValueError')
+ raises(ValueError, __import__, 'x1test', None, None, [])
+
if os.sep != '/':
class AppTestNativePathSep(AppTestZipimport):
More information about the pypy-commit
mailing list