Author: Raffael Tfirst <[email protected]>
Branch: py3.5-async
Changeset: r85682:e3c740229eb3
Date: 2016-07-13 21:05 +0200
http://bitbucket.org/pypy/pypy/changeset/e3c740229eb3/

Log:    Implement GET_AWAITABLE, SETUP_ASYNC_WITH, BEFORE_ASYNC_WITH,
        GET_AITER, GET_ANEXT pyopcodes (temporarily without additional error
        checks), fix compiler test

diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1421,19 +1421,36 @@
         self.pushvalue(w_iterator)
     
     def GET_AWAITABLE(self, oparg, next_instr):
-        pass
+        w_iterable = self.popvalue()
+        self.pushvalue(w_iterable)
     
-    def SETUP_ASYNC_WITH(self, oparg, next_instr):
-        pass
+    def SETUP_ASYNC_WITH(self, offsettoend, next_instr):
+        res = self.popvalue()
+        block = WithBlock(self.valuestackdepth,
+                          next_instr + offsettoend, self.lastblock)
+        self.lastblock = block
+        self.pushvalue(res)
     
     def BEFORE_ASYNC_WITH(self, oparg, next_instr):
-        pass
+        w_manager = self.peekvalue()
+        w_enter = self.space.lookup(w_manager, "__aenter__")
+        w_descr = self.space.lookup(w_manager, "__aexit__")
+        if w_enter is None or w_descr is None:
+            raise oefmt(self.space.w_AttributeError,
+                        "'%T' object is not a context manager (no __aenter__/"
+                        "__aexit__ method)", w_manager)
+        w_exit = self.space.get(w_descr, w_manager)
+        self.settopvalue(w_exit)
+        w_result = self.space.get_and_call_function(w_enter, w_manager)
+        self.pushvalue(w_result)
     
     def GET_AITER(self, oparg, next_instr):
-        pass
+        w_iterable = self.popvalue()
+        self.pushvalue(w_iterable)
     
     def GET_ANEXT(self, oparg, next_instr):
-        pass
+        w_iterable = self.popvalue()
+        self.pushvalue(w_iterable)
         
 ### ____________________________________________________________ ###
 
diff --git a/pypy/interpreter/test/test_compiler.py 
b/pypy/interpreter/test/test_compiler.py
--- a/pypy/interpreter/test/test_compiler.py
+++ b/pypy/interpreter/test/test_compiler.py
@@ -621,7 +621,7 @@
                     yield 8
                 def generator():
                     yield from generator2()
-                for i in generator(): return i
+                return next(generator())
             res = f()
         '''))
         code = self.compiler.compile(snippet, '<tmp>', 'exec', 0)
@@ -629,7 +629,7 @@
         w_d = space.newdict()
         space.exec_(code, w_d, w_d)
         w_res = space.getitem(w_d, space.wrap('res'))
-        assert space.eq_w(w_res, space.wrap("8"))
+        assert space.eq_w(w_res, space.wrap(8))
 
     def test_dont_inherit_flag(self):
         # this test checks that compile() don't inherit the __future__ flags
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to