[pypy-svn] r59502 - in pypy/trunk/pypy/interpreter: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Tue Oct 28 19:01:46 CET 2008


Author: cfbolz
Date: Tue Oct 28 19:01:45 2008
New Revision: 59502

Modified:
   pypy/trunk/pypy/interpreter/generator.py
   pypy/trunk/pypy/interpreter/pytraceback.py
   pypy/trunk/pypy/interpreter/test/test_generator.py
Log:
you can pass None as a valid traceback argument to generator.throw


Modified: pypy/trunk/pypy/interpreter/generator.py
==============================================================================
--- pypy/trunk/pypy/interpreter/generator.py	(original)
+++ pypy/trunk/pypy/interpreter/generator.py	Tue Oct 28 19:01:45 2008
@@ -66,7 +66,7 @@
             self.frame.f_back = None
             self.running = False
 
-    def descr_throw(self, w_type, w_val=None, w_tb=NoneNotWrapped):
+    def descr_throw(self, w_type, w_val=None, w_tb=None):
         """throw(typ[,val[,tb]]) -> raise exception in generator,
 return next yielded value or raise StopIteration."""
         return self.throw(w_type, w_val, w_tb)
@@ -77,7 +77,10 @@
         space = self.space
         
         msg = "throw() third argument must be a traceback object"
-        tb = check_traceback(space, w_tb, msg)
+        if space.is_w(w_tb, space.w_None):
+            tb = None
+        else:
+            tb = check_traceback(space, w_tb, msg)
        
         operr = OperationError(w_type, w_val, tb)
         operr.normalize_exception(space)
@@ -96,7 +99,8 @@
         """close(arg) -> raise GeneratorExit inside generator."""
         space = self.space
         try:
-            w_retval = self.throw(space.w_GeneratorExit, space.w_None, None)
+            w_retval = self.throw(space.w_GeneratorExit, space.w_None,
+                                  space.w_None)
         except OperationError, e:
             if e.match(space, space.w_StopIteration) or \
                     e.match(space, space.w_GeneratorExit):

Modified: pypy/trunk/pypy/interpreter/pytraceback.py
==============================================================================
--- pypy/trunk/pypy/interpreter/pytraceback.py	(original)
+++ pypy/trunk/pypy/interpreter/pytraceback.py	Tue Oct 28 19:01:45 2008
@@ -66,12 +66,8 @@
 
 def check_traceback(space, w_tb, msg):
     from pypy.interpreter.typedef import PyTraceback
-    if w_tb is not None:
-        tb = space.interpclass_w(w_tb)
-        if tb is None or not space.is_true(space.isinstance(tb, 
-                space.gettypeobject(PyTraceback.typedef))):
-            raise OperationError(space.w_TypeError, space.wrap(msg))
-    else:
-        tb = None
+    tb = space.interpclass_w(w_tb)
+    if tb is None or not space.is_true(space.isinstance(tb, 
+            space.gettypeobject(PyTraceback.typedef))):
+        raise OperationError(space.w_TypeError, space.wrap(msg))
     return tb
-

Modified: pypy/trunk/pypy/interpreter/test/test_generator.py
==============================================================================
--- pypy/trunk/pypy/interpreter/test/test_generator.py	(original)
+++ pypy/trunk/pypy/interpreter/test/test_generator.py	Tue Oct 28 19:01:45 2008
@@ -94,6 +94,13 @@
         # String exceptions are allowed (with DeprecationWarning)
         assert g.throw("Error") == 3
         raises(StopIteration, g.throw, "Error")
+
+    def test_throw6(self):
+        def f():
+            yield 2
+        g = f()
+        raises(NameError, g.throw, NameError, "Error", None)
+
     
     def test_throw_fail(self):
         def f():



More information about the Pypy-commit mailing list