old_contents: # mode: run
  # tag: generator
  
  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)
  
new_contents: # mode: run
  # tag: generator
  
  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)
  
subject: Fix a CPython comparison test in CPython 3.3 which was apparently fixed only in 3.4 and later.