Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r49304:6f2534aea5ca
Date: 2011-11-11 13:59 +0100
http://bitbucket.org/pypy/pypy/changeset/6f2534aea5ca/

Log:    Obscure: mark some builtin modules (but not others) as taking
        precedence in an "import xyz" statement if there is a file "xyz.py".
        The exact list is copied from the default installation of CPython
        2.7 on a recent Ubuntu Linux.

diff --git a/pypy/interpreter/mixedmodule.py b/pypy/interpreter/mixedmodule.py
--- a/pypy/interpreter/mixedmodule.py
+++ b/pypy/interpreter/mixedmodule.py
@@ -13,6 +13,7 @@
 
     applevel_name = None
     expose__file__attribute = True
+    cannot_override_in_import_statements = False
 
     # The following attribute is None as long as the module has not been
     # imported yet, and when it has been, it is mod.__dict__.items() just
diff --git a/pypy/module/__builtin__/__init__.py 
b/pypy/module/__builtin__/__init__.py
--- a/pypy/module/__builtin__/__init__.py
+++ b/pypy/module/__builtin__/__init__.py
@@ -7,6 +7,7 @@
 
 class Module(MixedModule):
     """Built-in functions, exceptions, and other objects."""
+    cannot_override_in_import_statements = True
     expose__file__attribute = False
 
     appleveldefs = {
diff --git a/pypy/module/_ast/__init__.py b/pypy/module/_ast/__init__.py
--- a/pypy/module/_ast/__init__.py
+++ b/pypy/module/_ast/__init__.py
@@ -3,6 +3,7 @@
 
 
 class Module(MixedModule):
+    cannot_override_in_import_statements = True
 
     interpleveldefs = {
         "PyCF_ONLY_AST" : "space.wrap(%s)" % consts.PyCF_ONLY_AST,
diff --git a/pypy/module/_codecs/__init__.py b/pypy/module/_codecs/__init__.py
--- a/pypy/module/_codecs/__init__.py
+++ b/pypy/module/_codecs/__init__.py
@@ -37,6 +37,7 @@
 
 Copyright (c) Corporation for National Research Initiatives.
 """
+    cannot_override_in_import_statements = True
 
     appleveldefs = {}
 
diff --git a/pypy/module/_sre/__init__.py b/pypy/module/_sre/__init__.py
--- a/pypy/module/_sre/__init__.py
+++ b/pypy/module/_sre/__init__.py
@@ -1,6 +1,7 @@
 from pypy.interpreter.mixedmodule import MixedModule 
 
 class Module(MixedModule):
+    cannot_override_in_import_statements = True
 
     appleveldefs = {
     }
diff --git a/pypy/module/_warnings/__init__.py 
b/pypy/module/_warnings/__init__.py
--- a/pypy/module/_warnings/__init__.py
+++ b/pypy/module/_warnings/__init__.py
@@ -3,6 +3,7 @@
 class Module(MixedModule):
     """provides basic warning filtering support.
     It is a helper module to speed up interpreter start-up."""
+    cannot_override_in_import_statements = True
 
     interpleveldefs = {
         'warn'         : 'interp_warnings.warn',
diff --git a/pypy/module/_weakref/__init__.py b/pypy/module/_weakref/__init__.py
--- a/pypy/module/_weakref/__init__.py
+++ b/pypy/module/_weakref/__init__.py
@@ -1,6 +1,7 @@
 from pypy.interpreter.mixedmodule import MixedModule
     
 class Module(MixedModule):
+    cannot_override_in_import_statements = True
     appleveldefs = {
     }
     interpleveldefs = {
diff --git a/pypy/module/errno/__init__.py b/pypy/module/errno/__init__.py
--- a/pypy/module/errno/__init__.py
+++ b/pypy/module/errno/__init__.py
@@ -16,6 +16,7 @@
     To map error codes to error messages, use the function os.strerror(),
     e.g. os.strerror(2) could return 'No such file or directory'."""
 
+    cannot_override_in_import_statements = True
     appleveldefs = {}
     interpleveldefs = {"errorcode": "interp_errno.get_errorcode(space)"}
     
diff --git a/pypy/module/exceptions/__init__.py 
b/pypy/module/exceptions/__init__.py
--- a/pypy/module/exceptions/__init__.py
+++ b/pypy/module/exceptions/__init__.py
@@ -2,6 +2,8 @@
 from pypy.interpreter.mixedmodule import MixedModule
 
 class Module(MixedModule):
+    cannot_override_in_import_statements = True
+
     appleveldefs = {}
     
     interpleveldefs = {
diff --git a/pypy/module/gc/__init__.py b/pypy/module/gc/__init__.py
--- a/pypy/module/gc/__init__.py
+++ b/pypy/module/gc/__init__.py
@@ -1,6 +1,7 @@
 from pypy.interpreter.mixedmodule import MixedModule
     
 class Module(MixedModule):
+    cannot_override_in_import_statements = True
     appleveldefs = {
         'enable': 'app_gc.enable',
         'disable': 'app_gc.disable',
diff --git a/pypy/module/imp/__init__.py b/pypy/module/imp/__init__.py
--- a/pypy/module/imp/__init__.py
+++ b/pypy/module/imp/__init__.py
@@ -5,6 +5,7 @@
     This module provides the components needed to build your own
     __import__ function.
     """
+    cannot_override_in_import_statements = True
     interpleveldefs = {
         'PY_SOURCE':       'space.wrap(importing.PY_SOURCE)',
         'PY_COMPILED':     'space.wrap(importing.PY_COMPILED)',
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -5,6 +5,7 @@
 import sys, os, stat
 
 from pypy.interpreter.module import Module
+from pypy.interpreter.mixedmodule import MixedModule
 from pypy.interpreter.gateway import interp2app, unwrap_spec
 from pypy.interpreter.typedef import TypeDef, generic_new_descr
 from pypy.interpreter.error import OperationError, operationerrfmt
@@ -483,10 +484,19 @@
     # XXX Check for frozen modules?
     #     when w_path is a string
 
+    default_result = None
+
     if w_path is None:
         # check the builtin modules
-        if modulename in space.builtin_modules:
-            return FindInfo(C_BUILTIN, modulename, None)
+        w_mod = space.builtin_modules.get(modulename, None)
+        if w_mod is not None:
+            default_result = FindInfo(C_BUILTIN, modulename, None)
+            mod = space.interpclass_w(w_mod)
+            if (isinstance(mod, MixedModule) and
+                mod.cannot_override_in_import_statements):
+                return default_result
+            #else:
+            #   continue looking and only return it if no xxx.py found
         w_path = space.sys.get('path')
 
     # XXX check frozen modules?
@@ -530,7 +540,7 @@
                        # Out of file descriptors.
 
     # not found
-    return None
+    return default_result
 
 def _prepare_module(space, w_mod, filename, pkgdir):
     w = space.wrap
diff --git a/pypy/module/imp/test/test_import.py 
b/pypy/module/imp/test/test_import.py
--- a/pypy/module/imp/test/test_import.py
+++ b/pypy/module/imp/test/test_import.py
@@ -918,6 +918,34 @@
                 finally:
                     stream.close()
 
+    def test_cannot_hide_builtin_exceptions(self):
+        import sys, os
+        filename = os.path.join(sys.path[0], 'exceptions.py')
+        f = open(filename, 'w')
+        f.close()
+        try:
+            import exceptions
+            assert hasattr(exceptions, 'NotImplementedError')
+        finally:
+            os.unlink(filename)
+
+    def test_can_hide_builtin_parser(self):
+        import sys, os
+        filename = os.path.join(sys.path[0], 'parser.py')
+        f = open(filename, 'w')
+        f.write('I_have_been_hidden = 42\n')
+        f.close()
+        old = sys.modules.pop('parser', None)
+        try:
+            import parser
+            assert hasattr(parser, 'I_have_been_hidden')
+        finally:
+            os.unlink(filename)
+            if old is not None:
+                sys.modules['parser'] = old
+            else:
+                del sys.modules['parser']
+
 
 def test_PYTHONPATH_takes_precedence(space): 
     if sys.platform == "win32":
diff --git a/pypy/module/marshal/__init__.py b/pypy/module/marshal/__init__.py
--- a/pypy/module/marshal/__init__.py
+++ b/pypy/module/marshal/__init__.py
@@ -5,6 +5,7 @@
     """
     This module implements marshal at interpreter level.
     """
+    cannot_override_in_import_statements = True
 
     appleveldefs = {
     }
diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -30,6 +30,7 @@
 disguised Unix interface).  Refer to the library manual and
 corresponding Unix manual entries for more information on calls."""
 
+    cannot_override_in_import_statements = True
     applevel_name = os.name
 
     appleveldefs = {
diff --git a/pypy/module/pwd/__init__.py b/pypy/module/pwd/__init__.py
--- a/pypy/module/pwd/__init__.py
+++ b/pypy/module/pwd/__init__.py
@@ -11,6 +11,7 @@
     The uid and gid items are integers, all others are strings. An
     exception is raised if the entry asked for cannot be found.
     """
+    cannot_override_in_import_statements = True
 
     interpleveldefs = {
         'getpwuid': 'interp_pwd.getpwuid',
diff --git a/pypy/module/signal/__init__.py b/pypy/module/signal/__init__.py
--- a/pypy/module/signal/__init__.py
+++ b/pypy/module/signal/__init__.py
@@ -4,6 +4,7 @@
 import signal as cpy_signal
 
 class Module(MixedModule):
+    cannot_override_in_import_statements = True
     interpleveldefs = {
         'signal':              'interp_signal.signal',
         'getsignal':           'interp_signal.getsignal',
diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py
--- a/pypy/module/sys/__init__.py
+++ b/pypy/module/sys/__init__.py
@@ -8,6 +8,7 @@
 class Module(MixedModule):
     """Sys Builtin Module. """
     _immutable_fields_ = ["defaultencoding?"]
+    cannot_override_in_import_statements = True
 
     def __init__(self, space, w_name):
         """NOT_RPYTHON""" # because parent __init__ isn't
diff --git a/pypy/module/thread/__init__.py b/pypy/module/thread/__init__.py
--- a/pypy/module/thread/__init__.py
+++ b/pypy/module/thread/__init__.py
@@ -3,6 +3,8 @@
 from pypy.interpreter.mixedmodule import MixedModule
 
 class Module(MixedModule):
+    cannot_override_in_import_statements = True
+
     appleveldefs = {
     }
 
diff --git a/pypy/module/zipimport/__init__.py 
b/pypy/module/zipimport/__init__.py
--- a/pypy/module/zipimport/__init__.py
+++ b/pypy/module/zipimport/__init__.py
@@ -5,6 +5,7 @@
 from pypy.interpreter.mixedmodule import MixedModule
 
 class Module(MixedModule):
+    cannot_override_in_import_statements = True
 
     interpleveldefs = {
         'zipimporter':'interp_zipimport.W_ZipImporter',
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to