Compile yield expressions

This commit is contained in:
Andrew Morris
2023-05-31 14:34:57 +10:00
parent 12bfe5bf7f
commit 56c8229d74

View File

@@ -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<Register>,
) -> CompiledExpression {
let mut nested_registers = Vec::<Register>::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,