swamp_code_gen/
initializer_pair_list.rs1use crate::code_bld::CodeBuilder;
6use crate::ctx::Context;
7use source_map_node::Node;
8use swamp_semantic::Expression;
9use swamp_vm_types::PointerLocation;
10use swamp_vm_types::types::{BasicTypeKind, Destination};
11
12impl CodeBuilder<'_> {
13 pub fn emit_map_like_init_from_initialization_pair_list(
14 &mut self,
15 output_destination: &Destination,
16 elements: &[(Expression, Expression)],
17 node: &Node,
18 ctx: &Context,
19 ) {
20 match &output_destination.ty().kind {
21 BasicTypeKind::MapStorage {
22 logical_limit,
23 key_type,
24 value_type,
25 ..
26 } => {
27 assert!(elements.len() <= *logical_limit, "too many initializers");
28 let target_map_header_ptr_reg = self.emit_compute_effective_address_to_register(
29 output_destination,
30 node,
31 "map header init",
32 );
33 let pointer_target = PointerLocation {
34 ptr_reg: target_map_header_ptr_reg,
35 };
36
37 self.emit_map_storage_init_from_initializer_pair_list(
39 &pointer_target,
40 elements,
41 key_type,
42 value_type,
43 *logical_limit,
44 node,
45 "emit_container_init_from_initialization_pair_list",
46 ctx,
47 );
48 }
49
50 _ => panic!(
51 "unknown initializer pair list type:{}",
52 output_destination.ty()
53 ),
54 }
55 }
56}