wirm 3.0.1

A lightweight WebAssembly Transformation Library for the Component Model
Documentation
use crate::ir::id::AliasId;
use crate::ir::AppendOnlyVec;
use wasmparser::{ComponentAlias, ComponentExternalKind, ExternalKind};

#[derive(Debug, Default)]
pub struct Aliases<'a> {
    pub items: AppendOnlyVec<ComponentAlias<'a>>,

    num_core_funcs: usize,
    num_core_funcs_added: usize,

    num_funcs: usize,
    num_funcs_added: usize,
    pub(crate) num_types: usize,
    num_types_added: usize,
}
impl<'a> Aliases<'a> {
    pub fn new(items: AppendOnlyVec<ComponentAlias<'a>>) -> Self {
        let (mut num_core_funcs, mut num_funcs, mut num_types) = (0, 0, 0);
        for i in items.iter() {
            match i {
                ComponentAlias::CoreInstanceExport { kind, .. } => {
                    if kind == &ExternalKind::Func {
                        num_core_funcs += 1
                    }
                }
                ComponentAlias::InstanceExport { kind, .. } => match kind {
                    ComponentExternalKind::Type => num_types += 1,
                    ComponentExternalKind::Func => num_funcs += 1,
                    _ => {}
                },
                _ => {}
            }
        }
        Self {
            items,
            num_core_funcs,
            num_funcs,
            num_types,
            ..Self::default()
        }
    }

    pub(crate) fn add(&mut self, alias: ComponentAlias<'a>) -> (u32, AliasId) {
        let ty_id = self.items.len() as u32;
        let ty_inner_id = match alias {
            ComponentAlias::CoreInstanceExport { kind, .. } => match kind {
                ExternalKind::Func => {
                    self.num_core_funcs += 1;
                    self.num_core_funcs_added += 1;

                    self.num_core_funcs - 1
                }
                _ => todo!(),
            },
            ComponentAlias::InstanceExport { kind, .. } => match kind {
                ComponentExternalKind::Type => {
                    self.num_types += 1;
                    self.num_types_added += 1;

                    self.num_types - 1
                }
                ComponentExternalKind::Func => {
                    self.num_funcs += 1;
                    self.num_funcs_added += 1;

                    self.num_funcs - 1
                }

                _ => todo!("haven't supported this yet: {:#?}", kind),
            },
            _ => todo!(),
        };

        self.items.push(alias);
        (ty_inner_id as u32, AliasId(ty_id))
    }
}