Author: Raffael Tfirst <raffael.tfi...@gmail.com>
Branch: py3.5-async
Changeset: r85602:22be1589e771
Date: 2016-07-07 18:16 +0200
http://bitbucket.org/pypy/pypy/changeset/22be1589e771/

Log:    Implement visit_AsyncWith in codegen

diff --git a/pypy/interpreter/astcompiler/codegen.py 
b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -863,6 +863,44 @@
         self.emit_op(ops.END_FINALLY)
         self.pop_frame_block(F_BLOCK_FINALLY_END, cleanup)
 
+    def visit_AsyncWith(self, wih):
+        self.update_position(wih.lineno, True)
+        self.handle_asyncwithitem(wih, 0)
+
+    def handle_asyncwithitem(self, wih, pos):
+        body_block = self.new_block()
+        cleanup = self.new_block()
+        witem = wih.items[pos]
+        witem.context_expr.walkabout(self)
+        self.emit_op(ops.BEFORE_ASYNC_WITH)
+        self.emit_op(ops.GET_AWAITABLE)
+        self.load_const(self.space.w_None)
+        self.emit_op(ops.YIELD_FROM)
+        self.emit_jump(ops.SETUP_ASYNC_WITH, cleanup)
+        self.use_next_block(body_block)
+        self.push_frame_block(F_BLOCK_FINALLY, body_block)
+        if witem.optional_vars:
+            witem.optional_vars.walkabout(self)
+        else:
+            self.emit_op(ops.POP_TOP)
+        if pos == len(wih.items) - 1:
+            self.visit_sequence(wih.body)
+        else:
+            self.handle_withitem(wih, pos + 1)
+        self.emit_op(ops.POP_BLOCK)
+        self.pop_frame_block(F_BLOCK_FINALLY, body_block)
+        self.load_const(self.space.w_None)
+        self.use_next_block(cleanup)
+        self.push_frame_block(F_BLOCK_FINALLY_END, cleanup)
+        self.emit_op(ops.WITH_CLEANUP_START)
+        self.emit_op(ops.GET_AWAITABLE)
+        self.load_const(self.space.w_None)
+        self.emit_op(ops.YIELD_FROM)
+        self.emit_op(ops.WITH_CLEANUP_FINISH)
+        self.emit_op(ops.END_FINALLY)
+        self.pop_frame_block(F_BLOCK_FINALLY_END, cleanup)
+
+
     def visit_Raise(self, rais):
         self.update_position(rais.lineno, True)
         arg = 0
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to