use super::vartable::Vartable;
use crate::codegen::cfg::{ControlFlowGraph, Instr};
use crate::codegen::Expression;
use crate::sema::ast::Type;
use solang_parser::pt::Loc;
pub(crate) fn handle_array_assign(
right: Expression,
cfg: &mut ControlFlowGraph,
vartab: &mut Vartable,
pos: usize,
) -> Expression {
if let Expression::AllocDynamicBytes {
loc,
ty: ty @ Type::Array(..),
size,
initializer,
} = right
{
let temp_res = vartab.temp_name("array_length", &Type::Uint(32));
cfg.add(
vartab,
Instr::Set {
loc: Loc::Codegen,
res: temp_res,
expr: *size,
},
);
cfg.array_lengths_temps.insert(pos, temp_res);
Expression::AllocDynamicBytes {
loc,
ty,
size: Box::new(Expression::Variable {
loc: Loc::Codegen,
ty: Type::Uint(32),
var_no: temp_res,
}),
initializer,
}
} else {
if let Expression::Variable {
var_no: right_res, ..
} = &right
{
if cfg.array_lengths_temps.contains_key(right_res) {
let to_update = cfg.array_lengths_temps[right_res];
cfg.array_lengths_temps.insert(pos, to_update);
} else {
cfg.array_lengths_temps.swap_remove(&pos);
}
}
right.clone()
}
}