[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