use crate::code_bld::CodeBuilder;
use crate::ctx::Context;
use source_map_node::Node;
use swamp_semantic::Expression;
use swamp_vm_types::types::{BasicTypeKind, Place};
use swamp_vm_types::PointerLocation;
impl CodeBuilder<'_> {
pub fn emit_map_like_init_from_initialization_pair_list(
&mut self,
output_destination: &Place,
elements: &[(Expression, Expression)],
node: &Node,
ctx: &Context,
) {
match &output_destination.ty().kind {
BasicTypeKind::MapStorage {
logical_limit,
key_type,
value_type,
..
} => {
assert!(elements.len() <= *logical_limit, "too many initializers");
let hwm = self.temp_registers.save_mark();
let target_map_header_ptr_reg = self.emit_compute_effective_address_to_register(
output_destination,
node,
"map header init",
);
let pointer_target = PointerLocation {
ptr_reg: target_map_header_ptr_reg,
};
self.emit_map_storage_init_from_initializer_pair_list(
&pointer_target,
elements,
key_type,
value_type,
*logical_limit,
node,
"emit_container_init_from_initialization_pair_list",
ctx,
);
self.temp_registers.restore_to_mark(hwm);
}
_ => panic!(
"unknown initializer pair list type:{}",
output_destination.ty()
),
}
}
}