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::types::{BasicTypeKind, Place};
10use swamp_vm_types::PointerLocation;
11
12impl CodeBuilder<'_> {
13 pub fn emit_map_like_init_from_initialization_pair_list(
14 &mut self,
15 output_destination: &Place,
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 hwm = self.temp_registers.save_mark();
29 let target_map_header_ptr_reg = self.emit_compute_effective_address_to_register(
32 output_destination,
33 node,
34 "map header init",
35 );
36 let pointer_target = PointerLocation {
37 ptr_reg: target_map_header_ptr_reg,
38 };
39
40
41 self.emit_map_storage_init_from_initializer_pair_list(
43 &pointer_target,
44 elements,
45 key_type,
46 value_type,
47 *logical_limit,
48 node,
49 "emit_container_init_from_initialization_pair_list",
50 ctx,
51 );
52
53 self.temp_registers.restore_to_mark(hwm);
54 }
55
56 _ => panic!(
57 "unknown initializer pair list type:{}",
58 output_destination.ty()
59 ),
60 }
61 }
62}