Author: Raffael Tfirst <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit