Skip to main content

ruda_kernel/dsl/codegen/
info.rs

1use alloc::vec;
2use ruda_core::ir::AddressType;
3use ruda::runtime::server::MetadataBindingInfo;
4use crate::dsl::{INFO_ALIGN, MetadataBuilder, ScalarBuilder};
5
6#[derive(Default)]
7pub struct InfoBuilder {
8    pub scalars: ScalarBuilder,
9    pub metadata: MetadataBuilder,
10}
11
12impl InfoBuilder {
13    pub fn finish(&mut self, address_type: AddressType) -> MetadataBindingInfo {
14        let addr_packing = INFO_ALIGN / address_type.size();
15
16        let scalars_size = self.scalars.len_aligned();
17        let static_len = self.metadata.static_len(address_type);
18        let static_size = static_len.div_ceil(addr_packing);
19        let dynamic_len = self.metadata.dynamic_len(address_type);
20        let dynamic_size = dynamic_len.div_ceil(addr_packing);
21
22        let mut out = vec![0; scalars_size + static_size + dynamic_size];
23        self.scalars.finish(&mut out[..scalars_size]);
24        self.metadata
25            .finish(address_type, out[scalars_size..].split_at_mut(static_size));
26
27        MetadataBindingInfo {
28            data: out,
29            dynamic_metadata_offset: scalars_size + static_size,
30        }
31    }
32}