
import cython
import sys


def test_generator_frame_cycle():
    """
    >>> test_generator_frame_cycle()
    ("I'm done",)
    """
    testit = []
    def whoo():
        try:
            yield
        except:
            yield
        finally:
            testit.append("I'm done")
    g = whoo()
    next(g)

    # Frame object cycle
    eval('g.throw(ValueError)', {'g': g})
    del g

    if cython.compiled:
        # FIXME: this should not be necessary, but I can't see how to do it...
        import gc; gc.collect()
    return tuple(testit)


def test_generator_frame_cycle_with_outer_exc():
    """
    >>> test_generator_frame_cycle_with_outer_exc()
    ("I'm done",)
    """
    testit = []
    def whoo():
        try:
            yield
        except:
            yield
        finally:
            testit.append("I'm done")
    g = whoo()
    next(g)

    try:
        raise ValueError()
    except ValueError as exc:
        assert sys.exc_info()[1] is exc, sys.exc_info()
        # Frame object cycle
        eval('g.throw(ValueError)', {'g': g})
        assert sys.exc_info()[1] is exc, sys.exc_info()
        del g
        assert sys.exc_info()[1] is exc, sys.exc_info()

    if cython.compiled:
        # FIXME: this should not be necessary, but I can't see how to do it...
        import gc; gc.collect()
    return tuple(testit)


import cython
import sys


def test_generator_frame_cycle():
    """
    >>> test_generator_frame_cycle()
    ("I'm done",)
    """
    testit = []
    def whoo():
        try:
            yield
        except:
            yield
        finally:
            testit.append("I'm done")
    g = whoo()
    next(g)

    # Frame object cycle
    eval('g.throw(ValueError)', {'g': g})
    del g

    return tuple(testit)


def test_generator_frame_cycle_with_outer_exc():
    """
    >>> test_generator_frame_cycle_with_outer_exc()
    ("I'm done",)
    """
    testit = []
    def whoo():
        try:
            yield
        except:
            yield
        finally:
            testit.append("I'm done")
    g = whoo()
    next(g)

    try:
        raise ValueError()
    except ValueError as exc:
        assert sys.exc_info()[1] is exc, sys.exc_info()
        # Frame object cycle
        eval('g.throw(ValueError)', {'g': g})
        # CPython 3.3 handles this incorrectly itself :)
        if cython.compiled or sys.version_info[:2] not in [(3, 2), (3, 3)]:
            assert sys.exc_info()[1] is exc, sys.exc_info()
        del g
        if cython.compiled or sys.version_info[:2] not in [(3, 2), (3, 3)]:
            assert sys.exc_info()[1] is exc, sys.exc_info()

    return tuple(testit)

Fix a CPython comparison test in CPython 3.3 which was apparently fixed only in 3.4 and later.
Fix a CPython comparison test in CPython 3.3 which was apparently fixed only in 3.4 and later.

  
  import cython
  import sys
  
  
  def test_generator_frame_cycle():
      """
      >>> test_generator_frame_cycle()
      ("I'm done",)
      """
      testit = []
      def whoo():
          try:
              yield
          except:
              yield
          finally:
              testit.append("I'm done")
      g = whoo()
      next(g)
  
      # Frame object cycle
      eval('g.throw(ValueError)', {'g': g})
      del g
  
-     if cython.compiled:
-         # FIXME: this should not be necessary, but I can't see how to do it...
-         import gc; gc.collect()
      return tuple(testit)
  
  
  def test_generator_frame_cycle_with_outer_exc():
      """
      >>> test_generator_frame_cycle_with_outer_exc()
      ("I'm done",)
      """
      testit = []
      def whoo():
          try:
              yield
          except:
              yield
          finally:
              testit.append("I'm done")
      g = whoo()
      next(g)
  
      try:
          raise ValueError()
      except ValueError as exc:
          assert sys.exc_info()[1] is exc, sys.exc_info()
          # Frame object cycle
          eval('g.throw(ValueError)', {'g': g})
+         # CPython 3.3 handles this incorrectly itself :)
+         if cython.compiled or sys.version_info[:2] not in [(3, 2), (3, 3)]:
-         assert sys.exc_info()[1] is exc, sys.exc_info()
+             assert sys.exc_info()[1] is exc, sys.exc_info()
          del g
+         if cython.compiled or sys.version_info[:2] not in [(3, 2), (3, 3)]:
-         assert sys.exc_info()[1] is exc, sys.exc_info()
+             assert sys.exc_info()[1] is exc, sys.exc_info()
  
-     if cython.compiled:
-         # FIXME: this should not be necessary, but I can't see how to do it...
-         import gc; gc.collect()
      return tuple(testit)
  
Fix a CPython comparison test in CPython 3.3 which was apparently fixed only in 3.4 and later.
## Code Before:

import cython
import sys


def test_generator_frame_cycle():
    """
    >>> test_generator_frame_cycle()
    ("I'm done",)
    """
    testit = []
    def whoo():
        try:
            yield
        except:
            yield
        finally:
            testit.append("I'm done")
    g = whoo()
    next(g)

    # Frame object cycle
    eval('g.throw(ValueError)', {'g': g})
    del g

    if cython.compiled:
        # FIXME: this should not be necessary, but I can't see how to do it...
        import gc; gc.collect()
    return tuple(testit)


def test_generator_frame_cycle_with_outer_exc():
    """
    >>> test_generator_frame_cycle_with_outer_exc()
    ("I'm done",)
    """
    testit = []
    def whoo():
        try:
            yield
        except:
            yield
        finally:
            testit.append("I'm done")
    g = whoo()
    next(g)

    try:
        raise ValueError()
    except ValueError as exc:
        assert sys.exc_info()[1] is exc, sys.exc_info()
        # Frame object cycle
        eval('g.throw(ValueError)', {'g': g})
        assert sys.exc_info()[1] is exc, sys.exc_info()
        del g
        assert sys.exc_info()[1] is exc, sys.exc_info()

    if cython.compiled:
        # FIXME: this should not be necessary, but I can't see how to do it...
        import gc; gc.collect()
    return tuple(testit)

## Instruction:
Fix a CPython comparison test in CPython 3.3 which was apparently fixed only in 3.4 and later.
## Code After:

import cython
import sys


def test_generator_frame_cycle():
    """
    >>> test_generator_frame_cycle()
    ("I'm done",)
    """
    testit = []
    def whoo():
        try:
            yield
        except:
            yield
        finally:
            testit.append("I'm done")
    g = whoo()
    next(g)

    # Frame object cycle
    eval('g.throw(ValueError)', {'g': g})
    del g

    return tuple(testit)


def test_generator_frame_cycle_with_outer_exc():
    """
    >>> test_generator_frame_cycle_with_outer_exc()
    ("I'm done",)
    """
    testit = []
    def whoo():
        try:
            yield
        except:
            yield
        finally:
            testit.append("I'm done")
    g = whoo()
    next(g)

    try:
        raise ValueError()
    except ValueError as exc:
        assert sys.exc_info()[1] is exc, sys.exc_info()
        # Frame object cycle
        eval('g.throw(ValueError)', {'g': g})
        # CPython 3.3 handles this incorrectly itself :)
        if cython.compiled or sys.version_info[:2] not in [(3, 2), (3, 3)]:
            assert sys.exc_info()[1] is exc, sys.exc_info()
        del g
        if cython.compiled or sys.version_info[:2] not in [(3, 2), (3, 3)]:
            assert sys.exc_info()[1] is exc, sys.exc_info()

    return tuple(testit)
