]> granicus.if.org Git - python/commitdiff
Fix issue #1705170 (backport from trunk)
authorNick Coghlan <ncoghlan@gmail.com>
Wed, 7 Nov 2007 12:26:40 +0000 (12:26 +0000)
committerNick Coghlan <ncoghlan@gmail.com>
Wed, 7 Nov 2007 12:26:40 +0000 (12:26 +0000)
Lib/contextlib.py
Lib/test/test_with.py
Misc/NEWS

index a807c42ce47561c6a05f42123ad7e5582f02c4c2..c4fab1bbfa86333df429016c3fb96d4c3aeaf794 100644 (file)
@@ -25,6 +25,10 @@ class GeneratorContextManager(object):
             else:
                 raise RuntimeError("generator didn't stop")
         else:
+            if value is None:
+                # Need to force instantiation so we can reliably
+                # tell if we get the same exception back
+                value = type()
             try:
                 self.gen.throw(type, value, traceback)
                 raise RuntimeError("generator didn't stop after throw()")
index 57505085dd3e5a6d4bdab8924b4ea0ffd54e0df7..8242c912c526d268d6c20eee1a68bf0d6af34654 100644 (file)
@@ -440,6 +440,7 @@ class ExceptionalTestCase(unittest.TestCase, ContextmanagerAssertionMixin):
         self.assertAfterWithGeneratorInvariantsNoError(self.bar)
 
     def testRaisedStopIteration1(self):
+        # From bug 1462485
         @contextmanager
         def cm():
             yield
@@ -451,6 +452,7 @@ class ExceptionalTestCase(unittest.TestCase, ContextmanagerAssertionMixin):
         self.assertRaises(StopIteration, shouldThrow)
 
     def testRaisedStopIteration2(self):
+        # From bug 1462485
         class cm(object):
             def __enter__(self):
                 pass
@@ -463,7 +465,21 @@ class ExceptionalTestCase(unittest.TestCase, ContextmanagerAssertionMixin):
 
         self.assertRaises(StopIteration, shouldThrow)
 
+    def testRaisedStopIteration3(self):
+        # Another variant where the exception hasn't been instantiated
+        # From bug 1705170
+        @contextmanager
+        def cm():
+            yield
+
+        def shouldThrow():
+            with cm():
+                raise iter([]).next()
+
+        self.assertRaises(StopIteration, shouldThrow)
+
     def testRaisedGeneratorExit1(self):
+        # From bug 1462485
         @contextmanager
         def cm():
             yield
@@ -475,6 +491,7 @@ class ExceptionalTestCase(unittest.TestCase, ContextmanagerAssertionMixin):
         self.assertRaises(GeneratorExit, shouldThrow)
 
     def testRaisedGeneratorExit2(self):
+        # From bug 1462485
         class cm (object):
             def __enter__(self):
                 pass
index 2cf7be4108e55b8869de0d2184676ecc653622b6..aad83fd1c1708263bf5a9b9dd8e8ae10f6a3a020 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -32,6 +32,9 @@ Core and builtins
 Library
 -------
 
+- Issue #1705170: contextlib.contextmanager was still swallowing
+  StopIteration in some cases. This should no longer happen.
+
 - Bug #1307: Fix smtpd so it doesn't raise an exception when there is no arg.
 
 - ctypes will now work correctly on 32-bit systems when Python is