swamp_code_gen/
initializer_pair_list.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/swamp
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5use 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                //info!("emit map_like_init_from_initialization_pair_list: {hwm}");
30
31                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                //let adjusted_capacity = capacity.next_power_of_two();
42                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}