Author: Raffael Tfirst <[email protected]>
Branch: py3.5-async
Changeset: r85933:5af313e59b4f
Date: 2016-07-30 18:33 +0200
http://bitbucket.org/pypy/pypy/changeset/5af313e59b4f/
Log: Fix call for __aiter__ and __anext__ in pyopcodes, check for illegal
object types returned in GET_AITER and GET_ANEXT, fix error message
in generator
diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -310,8 +310,8 @@
return self
w_await = space.lookup(self, "__await__")
if w_await is None:
- raise oefmt(space.w_TypeError,
- "object %s can't be used in 'await' expression",
+ raise oefmt(space.w_AttributeError,
+ "object %T does not have __await__ method",
self)
res = space.get_and_call_function(w_await, None)
if res is not None:
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1467,14 +1467,32 @@
def GET_AITER(self, oparg, next_instr):
w_obj = self.popvalue()
- w_iter = w_obj.aiter()
+ w_func = self.space.lookup(w_obj, "__aiter__")
+ if w_func is None:
+ raise oefmt(space.w_AttributeError,
+ "object %T does not have __aiter__ method",
+ w_obj)
+ w_iter = space.get_and_call_function(w_func, None)
w_awaitable = w_iter._GetAwaitableIter(self.space)
+ if w_awaitable is None:
+ raise oefmt(space.w_TypeError,
+ "'async for' received an invalid object "
+ "from __aiter__: %T", w_iter)
self.pushvalue(w_awaitable)
def GET_ANEXT(self, oparg, next_instr):
w_aiter = self.popvalue()
- w_next_iter = w_aiter.anext()
+ w_func = self.space.lookup(w_aiter, "__anext__")
+ if w_func is None:
+ raise oefmt(space.w_AttributeError,
+ "object %T does not have __anext__ method",
+ w_aiter)
+ w_next_iter = space.get_and_call_function(w_func, None)
w_awaitable = w_next_iter._GetAwaitableIter(self.space)
+ if w_awaitable is None:
+ raise oefmt(space.w_TypeError,
+ "'async for' received an invalid object "
+ "from __anext__: %T", w_next_iter)
self.pushvalue(w_awaitable)
### ____________________________________________________________ ###
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit