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

Reply via email to