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 @ Type::Array(..), size, option) = 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,
Box::new(Expression::Variable(Loc::Codegen, Type::Uint(32), temp_res)),
option,
)
} else {
if let Expression::Variable(_, _, 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.remove(pos);
}
}
right.clone()
}
}