Author: Raffael Tfirst <raffael.tfi...@gmail.com> Branch: py3.5-async Changeset: r85604:d67ac6d8fc48 Date: 2016-07-07 21:39 +0200 http://bitbucket.org/pypy/pypy/changeset/d67ac6d8fc48/
Log: Implement visit_AsyncFor 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 @@ -565,6 +565,60 @@ self.pop_frame_block(F_BLOCK_LOOP, start) self.visit_sequence(fr.orelse) self.use_next_block(end) + + def visit_AsyncFor(self, fr): + self.update_position(fr.lineno, True) + b_try = self.new_block() + b_except = self.new_block() + b_end = self.new_block() + b_after_try = self.new_block() + b_try_cleanup = self.new_block() + b_after_loop = self.new_block() + b_after_loop_else = self.new_block() + self.emit_jump(ops.SETUP_LOOP, b_after_loop) + self.push_frame_block(F_BLOCK_LOOP, b_try) + fr.iter.walkabout(self) + self.emit_op(ops.GET_AITER) + self.load_const(self.space.w_None) + self.emit_op(ops.YIELD_FROM) + self.use_next_block(b_try) + # This adds another line, so each for iteration can be traced. + self.lineno_set = False + self.emit_jump(ops.SETUP_EXCEPT, b_except) + self.push_frame_block(F_BLOCK_EXCEPT, b_try) + self.emit_op(ops.GET_ANEXT) + self.load_const(self.space.w_None) + self.emit_op(ops.YIELD_FROM) + fr.target.walkabout(self) + self.emit_op(ops.POP_BLOCK) + self.pop_frame_block(F_BLOCK_EXCEPT, b_try) + self.emit_jump(ops.JUMP_FORWARD, b_after_try) + self.use_next_block(b_except) + self.emit_op(ops.POP_TOP) + self.emit_op_name(ops.LOAD_GLOBAL, self.names, "StopIterError") + self.emit_op_arg(ops.COMPARE_OP, 10) + self.emit_jump(ops.POP_JUMP_IF_FALSE, b_try_cleanup, True) + + self.emit_op(ops.POP_TOP) + self.emit_op(ops.POP_TOP) + self.emit_op(ops.POP_TOP) + self.emit_op(ops.POP_EXCEPT) # for SETUP_EXCEPT + self.emit_op(ops.POP_BLOCK) # for SETUP_LOOP + self.emit_jump(ops.JUMP_ABSOLUTE, b_after_loop_else, True) + + self.use_next_block(b_try_cleanup) + self.emit_op(ops.END_FINALLY) + self.use_next_block(b_after_try) + self.visit_sequence(fr.body) + self.emit_jump(ops.JUMP_ABSOLUTE, b_try, True) + self.emit_op(ops.POP_BLOCK) # for SETUP_LOOP + self.pop_frame_block(F_BLOCK_LOOP, b_try) + self.use_next_block(b_after_loop) + self.emit_jump(ops.JUMP_ABSOLUTE, b_end, True) + self.use_next_block(b_after_loop_else) + self.visit_sequence(fr.orelse) + + self.use_next_block(b_end) def visit_While(self, wh): self.update_position(wh.lineno, True) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit