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

Reply via email to