Author: Ronan Lamy <ronan.l...@gmail.com> Branch: py3.5 Changeset: r91623:12adced6b2f7 Date: 2017-06-18 02:43 +0100 http://bitbucket.org/pypy/pypy/changeset/12adced6b2f7/
Log: Fix sys.builtin_module_names to actually list all the built-in modules and only them, which allows importlib to correctly set __loader__ and __spec__ for them. diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -546,14 +546,6 @@ self._builtinmodule_list = modules return self._builtinmodule_list - ALL_BUILTIN_MODULES = [ - 'posix', 'nt', 'os2', 'mac', 'ce', 'riscos', - 'math', 'array', 'select', - '_random', '_sre', 'time', '_socket', 'errno', - 'unicodedata', - 'parser', 'fcntl', '_codecs', 'binascii' - ] - @not_rpython def make_builtins(self): "only for initializing the space." @@ -580,11 +572,6 @@ w_builtin.install() self.setitem(self.builtin.w_dict, self.newtext('__builtins__'), w_builtin) - # exceptions was bootstrapped as '__exceptions__' but still - # lives in pypy/module/exceptions, we rename it below for - # sys.builtin_module_names - bootstrap_modules = set(('sys', 'imp', 'builtins', 'exceptions')) - installed_builtin_modules = list(bootstrap_modules) exception_types_w = self.export_builtin_exceptions() @@ -595,15 +582,13 @@ self.setitem(self.builtin.w_dict, self.newtext(name), w_type) # install mixed modules + bootstrap_modules = set(('sys', 'imp', 'builtins', 'exceptions')) for mixedname in self.get_builtinmodule_to_install(): if mixedname not in bootstrap_modules: - self.install_mixedmodule(mixedname, installed_builtin_modules) + self.install_mixedmodule(mixedname) - installed_builtin_modules.remove('exceptions') - installed_builtin_modules.append('__exceptions__') - installed_builtin_modules.sort() w_builtin_module_names = self.newtuple( - [self.newtext(fn) for fn in installed_builtin_modules]) + [self.newtext(name) for name in sorted(self.builtin_modules)]) # force this value into the dict without unlazyfying everything self.setitem(self.sys.w_dict, self.newtext('builtin_module_names'), @@ -635,13 +620,8 @@ return exc_types_w @not_rpython - def install_mixedmodule(self, mixedname, installed_builtin_modules): - modname = self.setbuiltinmodule(mixedname) - if modname: - assert modname not in installed_builtin_modules, ( - "duplicate interp-level module enabled for the " - "app-level module %r" % (modname,)) - installed_builtin_modules.append(modname) + def install_mixedmodule(self, mixedname): + self.setbuiltinmodule(mixedname) @not_rpython def setup_builtin_modules(self): diff --git a/pypy/interpreter/module.py b/pypy/interpreter/module.py --- a/pypy/interpreter/module.py +++ b/pypy/interpreter/module.py @@ -38,6 +38,10 @@ def install(self): """NOT_RPYTHON: installs this module into space.builtin_modules""" modulename = self.space.text0_w(self.w_name) + if modulename in self.space.builtin_modules: + raise ValueError( + "duplicate interp-level module enabled for the " + "app-level module %r" % (modulename,)) self.space.builtin_modules[modulename] = self def setup_after_space_initialization(self): diff --git a/pypy/module/imp/test/test_app.py b/pypy/module/imp/test/test_app.py --- a/pypy/module/imp/test/test_app.py +++ b/pypy/module/imp/test/test_app.py @@ -108,6 +108,13 @@ assert not imp.is_builtin('hello.world.this.is.never.a.builtin.module.name') assert not imp.is_frozen('hello.world.this.is.never.a.frozen.module.name') + def test_is_builtin(self): + import sys, imp + for name in sys.builtin_module_names: + assert imp.is_builtin(name) + mod = imp.init_builtin(name) + assert mod + assert mod.__spec__ def test_load_module_py(self): import imp _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit