From 56c8229d7443be66cb9ff38315aa76f4ec24a3df Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Wed, 31 May 2023 14:34:57 +1000 Subject: [PATCH] Compile yield expressions --- .../src/expression_compiler.rs | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/valuescript_compiler/src/expression_compiler.rs b/valuescript_compiler/src/expression_compiler.rs index d0e3b06..9c4913c 100644 --- a/valuescript_compiler/src/expression_compiler.rs +++ b/valuescript_compiler/src/expression_compiler.rs @@ -163,9 +163,8 @@ impl<'a> ExpressionCompiler<'a> { self.fnc.todo(class_exp.span(), "Class expression"); return CompiledExpression::empty(); } - Yield(yield_exp) => { - self.fnc.todo(yield_exp.span, "Yield expression"); - return CompiledExpression::empty(); + Yield(yield_expr) => { + return self.yield_expr(yield_expr, target_register); } MetaProp(meta_prop) => { self.fnc.todo(meta_prop.span, "MetaProp expression"); @@ -1205,6 +1204,34 @@ impl<'a> ExpressionCompiler<'a> { return CompiledExpression::new(Value::Register(acc_reg), nested_registers); } + pub fn yield_expr( + &mut self, + yield_expr: &swc_ecma_ast::YieldExpr, + target_register: Option, + ) -> CompiledExpression { + let mut nested_registers = Vec::::new(); + + let arg_compiled = match &yield_expr.arg { + Some(arg) => self.compile(arg, None), + None => CompiledExpression::empty(), + }; + + let dst = match target_register { + Some(t) => t, + None => { + let tmp = self.fnc.allocate_tmp(); + nested_registers.push(tmp.clone()); + tmp + } + }; + + let instr = Instruction::Yield(self.fnc.use_(arg_compiled), dst.clone()); + + self.fnc.push(instr); + + return CompiledExpression::new(Value::Register(dst), nested_registers); + } + pub fn literal( &mut self, lit: &swc_ecma_ast::Lit,