From 065c0e874abefedde129d33fe3bf3e16b2409acc Mon Sep 17 00:00:00 2001 From: Aaron Long Date: Fri, 5 Mar 2021 22:56:48 -0500 Subject: [PATCH] Begin async list comprehension implementation --- compiler/src/compile.rs | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/compiler/src/compile.rs b/compiler/src/compile.rs index e25bd7c01f..70a5b56022 100644 --- a/compiler/src/compile.rs +++ b/compiler/src/compile.rs @@ -2258,9 +2258,9 @@ impl Compiler { let mut loop_labels = vec![]; for generator in generators { - if generator.is_async { - unimplemented!("async for comprehensions"); - } + // if generator.is_async { + // unimplemented!("async for comprehensions"); + // } // Setup for loop: self.emit(Instruction::SetupLoop); @@ -2271,21 +2271,37 @@ impl Compiler { } else { // Evaluate iterated item: self.compile_expression(&generator.iter)?; - - // Get iterator / turn item into an iterator - self.emit(Instruction::GetIter); } let loop_block = self.new_block(); let after_block = self.new_block(); loop_labels.push((loop_block, after_block)); - self.switch_to_block(loop_block); - self.emit(Instruction::ForIter { - target: after_block, - }); + if generator.is_async { + let check_asynciter_block = self.new_block(); + + self.emit(Instruction::GetAIter); + self.switch_to_block(loop_block); + self.emit(Instruction::SetupExcept { + handler: check_asynciter_block, + }); + self.emit(Instruction::GetANext); + self.emit_constant(ConstantData::None); + self.emit(Instruction::YieldFrom); + self.compile_store(&generator.target)?; + self.emit(Instruction::PopBlock); + + } else { + // Get iterator / turn item into an iterator + self.emit(Instruction::GetIter); - self.compile_store(&generator.target)?; + self.switch_to_block(loop_block); + self.emit(Instruction::ForIter { + target: after_block, + }); + + self.compile_store(&generator.target)?; + } // Now evaluate the ifs: for if_condition in &generator.ifs {