Remove .take() from compiler first pass

This commit is contained in:
Andrew Morris
2023-06-30 09:47:31 +10:00
parent ae4c0a5be2
commit 4005510bf2
7 changed files with 11 additions and 22 deletions

View File

@@ -698,7 +698,7 @@ impl<'a> ExpressionCompiler<'a> {
};
self.fnc.push(Instruction::JmpIf(
Value::Register(dst.take()),
Value::Register(dst.clone()),
true_label.ref_(),
));

View File

@@ -1089,11 +1089,13 @@ impl FunctionCompiler {
self.push(Instruction::Next(iter_reg, iter_res_reg.clone()));
self.push(Instruction::UnpackIterRes(
iter_res_reg.take(),
iter_res_reg.clone(),
value_reg,
done_reg,
));
self.release_reg(&iter_res_reg);
self.push(Instruction::Jmp(for_test_label.ref_()));
self.label(for_end_label);
@@ -1182,7 +1184,7 @@ impl FunctionCompiler {
compiled_expr.release_checker.has_unreleased_registers = false;
return Self::optimized_value(&compiled_expr);
return compiled_expr.value;
}
pub fn use_ref(&mut self, compiled_expr: &mut CompiledExpression) -> Value {
@@ -1192,22 +1194,7 @@ impl FunctionCompiler {
compiled_expr.release_checker.has_unreleased_registers = false;
return Self::optimized_value(compiled_expr);
}
fn optimized_value(compiled_expr: &CompiledExpression) -> Value {
if let Value::Register(asm) = &compiled_expr.value {
if compiled_expr.nested_registers.first() == Some(asm) {
// Specialized optimization of common use case:
// - The value is a register and it's the only nested register.
// We can safely take this register when inserting it because it exists only for the
// purpose of supporting this value. A more generalized version is possible but it's
// duplicating the work of a proper optimizer anyway.
return Value::Register(asm.take());
}
}
compiled_expr.value.clone()
return compiled_expr.value.clone();
}
fn get_mutated_registers(&self, span: swc_common::Span) -> HashSet<Register> {