Author: Ronan Lamy <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit