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