mirror of
https://github.com/voltrevo/ValueScript.git
synced 2026-01-14 16:08:02 -05:00
Remove .take() from compiler first pass
This commit is contained in:
@@ -698,7 +698,7 @@ impl<'a> ExpressionCompiler<'a> {
|
||||
};
|
||||
|
||||
self.fnc.push(Instruction::JmpIf(
|
||||
Value::Register(dst.take()),
|
||||
Value::Register(dst.clone()),
|
||||
true_label.ref_(),
|
||||
));
|
||||
|
||||
|
||||
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user