[pypy-svn] pypy default: merge heads

arigo commits-noreply at bitbucket.org
Fri Apr 8 10:25:20 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r43207:7793938ab4f8
Date: 2011-04-08 10:24 +0200
http://bitbucket.org/pypy/pypy/changeset/7793938ab4f8/

Log:	merge heads

diff --git a/pypy/module/thread/test/test_import_lock.py b/pypy/module/thread/test/test_import_lock.py
--- a/pypy/module/thread/test/test_import_lock.py
+++ b/pypy/module/thread/test/test_import_lock.py
@@ -61,27 +61,3 @@
         assert not imp.lock_held()
         self.waitfor(lambda: done)
         assert done
-
-class TestImportLock:
-    def test_lock(self, space, monkeypatch):
-        from pypy.module.imp.importing import getimportlock, importhook
-
-        # Monkeypatch the import lock and add a counter
-        importlock = getimportlock(space)
-        original_acquire = importlock.acquire_lock
-        def acquire_lock():
-            importlock.count += 1
-            original_acquire()
-        importlock.count = 0
-        monkeypatch.setattr(importlock, 'acquire_lock', acquire_lock)
-
-        # An already imported module
-        importhook(space, 'sys')
-        assert importlock.count == 0
-        # A new module
-        importhook(space, 're')
-        assert importlock.count == 7
-        # Import it again
-        previous_count = importlock.count
-        importhook(space, 're')
-        assert importlock.count == previous_count

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
@@ -438,38 +438,6 @@
         res = __import__('', mydict, None, ['bar'], 2)
         assert res is pkg
 
-    def test__package__(self):
-        # Regression test for http://bugs.python.org/issue3221.
-        def check_absolute():
-            exec "from os import path" in ns
-        def check_relative():
-            exec "from . import a" in ns
-
-        # Check both OK with __package__ and __name__ correct
-        ns = dict(__package__='pkg', __name__='pkg.notarealmodule')
-        check_absolute()
-        check_relative()
-
-        # Check both OK with only __name__ wrong
-        ns = dict(__package__='pkg', __name__='notarealpkg.notarealmodule')
-        check_absolute()
-        check_relative()
-
-        # Check relative fails with only __package__ wrong
-        ns = dict(__package__='foo', __name__='pkg.notarealmodule')
-        check_absolute() # XXX check warnings
-        raises(SystemError, check_relative)
-
-        # Check relative fails with __package__ and __name__ wrong
-        ns = dict(__package__='foo', __name__='notarealpkg.notarealmodule')
-        check_absolute() # XXX check warnings
-        raises(SystemError, check_relative)
-
-        # Check both fail with package set to a non-string
-        ns = dict(__package__=object())
-        raises(ValueError, check_absolute)
-        raises(ValueError, check_relative)
-
     def test_universal_newlines(self):
         import pkg_univnewlines
         assert pkg_univnewlines.a == 5

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
@@ -118,107 +118,6 @@
 def check_sys_modules_w(space, modulename):
     return space.finditem_str(space.sys.get('modules'), modulename)
 
-def _get_relative_name(space, modulename, level, w_globals):
-    w = space.wrap
-    ctxt_w_package = space.finditem(w_globals, w('__package__'))
-
-    ctxt_package = None
-    if ctxt_w_package is not None and ctxt_w_package is not space.w_None:
-        try:
-            ctxt_package = space.str_w(ctxt_w_package)
-        except OperationError, e:
-            if not e.match(space, space.w_TypeError):
-                raise
-            raise OperationError(space.w_ValueError, space.wrap(
-                "__package__ set to non-string"))
-
-    if ctxt_package is not None:
-        # __package__ is set, so use it
-        if ctxt_package == '' and level < 0:
-            return None, 0
-
-        package_parts = ctxt_package.split('.')
-        while level > 1 and package_parts:
-            level -= 1
-            package_parts.pop()
-        if not package_parts:
-            if len(ctxt_package) == 0:
-                msg = "Attempted relative import in non-package"
-            else:
-                msg = "Attempted relative import beyond toplevel package"
-            raise OperationError(space.w_ValueError, w(msg))
-
-        # Try to import parent package
-        try:
-            w_parent = absolute_import(space, ctxt_package, 0,
-                                       None, tentative=False)
-        except OperationError, e:
-            if not e.match(space, space.w_ImportError):
-                raise
-            if level > 0:
-                raise OperationError(space.w_SystemError, space.wrap(
-                    "Parent module '%s' not loaded, "
-                    "cannot perform relative import" % ctxt_package))
-            else:
-                space.warn("Parent module '%s' not found "
-                           "while handling absolute import" % ctxt_package,
-                           space.w_RuntimeWarning)
-
-        rel_level = len(package_parts)
-        if modulename:
-            package_parts.append(modulename)
-        rel_modulename = '.'.join(package_parts)
-    else:
-        # __package__ not set, so figure it out and set it
-        ctxt_w_name = space.finditem(w_globals, w('__name__'))
-        ctxt_w_path = space.finditem(w_globals, w('__path__'))
-
-        ctxt_name = None
-        if ctxt_w_name is not None:
-            try:
-                ctxt_name = space.str_w(ctxt_w_name)
-            except OperationError, e:
-                if not e.match(space, space.w_TypeError):
-                    raise
-
-        if not ctxt_name:
-            return None, 0
-
-        ctxt_name_prefix_parts = ctxt_name.split('.')
-        if level > 0:
-            n = len(ctxt_name_prefix_parts)-level+1
-            assert n>=0
-            ctxt_name_prefix_parts = ctxt_name_prefix_parts[:n]
-        if ctxt_name_prefix_parts and ctxt_w_path is None: # plain module
-            ctxt_name_prefix_parts.pop()
-
-        if level > 0 and not ctxt_name_prefix_parts:
-            msg = "Attempted relative import in non-package"
-            raise OperationError(space.w_ValueError, w(msg))
-
-        rel_modulename = '.'.join(ctxt_name_prefix_parts)
-
-        if ctxt_w_path is not None:
-            # __path__ is set, so __name__ is already the package name
-            space.setitem(w_globals, w("__package__"), ctxt_w_name)
-        else:
-            # Normal module, so work out the package name if any
-            if '.' not in ctxt_name:
-                space.setitem(w_globals, w("__package__"), space.w_None)
-            elif rel_modulename:
-                space.setitem(w_globals, w("__package__"), w(rel_modulename))
-
-        if modulename:
-            if rel_modulename:
-                rel_modulename += '.' + modulename
-            else:
-                rel_modulename = modulename
-
-        rel_level = len(ctxt_name_prefix_parts)
-
-    return rel_modulename, rel_level
-
-
 @unwrap_spec(name=str, level=int)
 def importhook(space, name, w_globals=None,
                w_locals=None, w_fromlist=None, level=-1):
@@ -240,40 +139,68 @@
         w_globals is not None and
         space.isinstance_w(w_globals, space.w_dict)):
 
-        rel_modulename, rel_level = _get_relative_name(space, modulename, level, w_globals)
+        ctxt_w_name = space.finditem(w_globals, w('__name__'))
+        ctxt_w_path = space.finditem(w_globals, w('__path__'))
 
-        if rel_modulename:
-            # if no level was set, ignore import errors, and
-            # fall back to absolute import at the end of the
-            # function.
-            if level == -1:
-                tentative = True
-            else:
-                tentative = False
+        ctxt_name = None
+        if ctxt_w_name is not None:
+            try:
+                ctxt_name = space.str_w(ctxt_w_name)
+            except OperationError, e:
+                if not e.match(space, space.w_TypeError):
+                    raise
 
-            w_mod = absolute_import(space, rel_modulename, rel_level,
-                                    fromlist_w, tentative=tentative)
-            if w_mod is not None:
-                space.timer.stop_name("importhook", modulename)
-                return w_mod
+        if ctxt_name is not None:
+            ctxt_name_prefix_parts = ctxt_name.split('.')
+            if level > 0:
+                n = len(ctxt_name_prefix_parts)-level+1
+                assert n>=0
+                ctxt_name_prefix_parts = ctxt_name_prefix_parts[:n]
+            if ctxt_name_prefix_parts and ctxt_w_path is None: # plain module
+                ctxt_name_prefix_parts.pop()
+            if ctxt_name_prefix_parts:
+                rel_modulename = '.'.join(ctxt_name_prefix_parts)
+                if modulename:
+                    rel_modulename += '.' + modulename
+            baselevel = len(ctxt_name_prefix_parts)
+            if rel_modulename is not None:
+                # XXX What is this check about? There is no test for it
+                w_mod = check_sys_modules(space, w(rel_modulename))
 
-    w_mod = absolute_import(space, modulename, 0, fromlist_w, tentative=0)
+                if (w_mod is None or
+                    not space.is_w(w_mod, space.w_None) or
+                    level > 0):
+
+                    # if no level was set, ignore import errors, and
+                    # fall back to absolute import at the end of the
+                    # function.
+                    if level == -1:
+                        tentative = True
+                    else:
+                        tentative = False
+
+                    w_mod = absolute_import(space, rel_modulename,
+                                            baselevel, fromlist_w,
+                                            tentative=tentative)
+                    if w_mod is not None:
+                        space.timer.stop_name("importhook", modulename)
+                        return w_mod
+                else:
+                    rel_modulename = None
+
+        if level > 0:
+            msg = "Attempted relative import in non-package"
+            raise OperationError(space.w_ValueError, w(msg))
+    w_mod = absolute_import_try(space, modulename, 0, fromlist_w)
+    if w_mod is None or space.is_w(w_mod, space.w_None):
+        w_mod = absolute_import(space, modulename, 0, fromlist_w, tentative=0)
     if rel_modulename is not None:
         space.setitem(space.sys.get('modules'), w(rel_modulename), space.w_None)
     space.timer.stop_name("importhook", modulename)
     return w_mod
 
+ at jit.dont_look_inside
 def absolute_import(space, modulename, baselevel, fromlist_w, tentative):
-    # Short path: check in sys.modules
-    w_mod = absolute_import_try(space, modulename, baselevel, fromlist_w)
-    if w_mod is not None and not space.is_w(w_mod, space.w_None):
-        return w_mod
-    return absolute_import_with_lock(space, modulename, baselevel,
-                                     fromlist_w, tentative)
-
- at jit.dont_look_inside
-def absolute_import_with_lock(space, modulename, baselevel,
-                              fromlist_w, tentative):
     lock = getimportlock(space)
     lock.acquire_lock()
     try:


More information about the Pypy-commit mailing list