use crate::ModuleContext;
use std::collections::HashMap;
#[derive(Default)]
pub struct ComponentContext<'a> {
pub(crate) sections: Vec<RawSection<'a>>,
pub(crate) instances: u32,
pub(crate) funcs: u32,
pub(crate) types: u32,
pub(crate) core_instances: u32,
pub(crate) core_memories: u32,
pub(crate) core_funcs: u32,
pub(crate) core_instantiations: HashMap<u32, u32>,
pub(crate) accessors: Option<Vec<Accessor>>,
}
pub(crate) enum Accessor {
Global {
module_index: u32,
core_export_name: String,
accessor_export_name: String,
ty: wasmparser::ValType,
},
Memory {
module_index: u32,
core_export_name: String,
accessor_export_name: String,
},
}
pub(crate) enum RawSection<'a> {
Raw(wasm_encoder::RawSection<'a>),
Module(ModuleContext<'a>),
}
impl<'a> ComponentContext<'a> {
pub(crate) fn push_raw_section(&mut self, section: wasm_encoder::RawSection<'a>) {
self.sections.push(RawSection::Raw(section));
}
pub(crate) fn push_module_section(&mut self, module: ModuleContext<'a>) {
self.sections.push(RawSection::Module(module));
}
pub(crate) fn core_modules(&self) -> impl Iterator<Item = (u32, &ModuleContext<'a>)> + '_ {
let mut i = 0;
self.sections.iter().filter_map(move |s| match s {
RawSection::Module(m) => Some((inc(&mut i), m)),
RawSection::Raw(_) => None,
})
}
pub(crate) fn num_core_modules(&self) -> u32 {
u32::try_from(self.core_modules().count()).unwrap()
}
pub(crate) fn inc(&mut self, kind: wasmparser::ComponentExternalKind) {
match kind {
wasmparser::ComponentExternalKind::Type => {
self.inc_types();
}
wasmparser::ComponentExternalKind::Instance => {
self.inc_instances();
}
wasmparser::ComponentExternalKind::Func => {
self.inc_funcs();
}
wasmparser::ComponentExternalKind::Component
| wasmparser::ComponentExternalKind::Module
| wasmparser::ComponentExternalKind::Value => {}
}
}
pub(crate) fn inc_core(&mut self, kind: wasmparser::ExternalKind) {
match kind {
wasmparser::ExternalKind::Func | wasmparser::ExternalKind::FuncExact => {
self.inc_core_funcs();
}
wasmparser::ExternalKind::Memory => {
self.inc_core_memories();
}
wasmparser::ExternalKind::Table
| wasmparser::ExternalKind::Global
| wasmparser::ExternalKind::Tag => {}
}
}
pub(crate) fn inc_instances(&mut self) -> u32 {
inc(&mut self.instances)
}
pub(crate) fn inc_funcs(&mut self) -> u32 {
inc(&mut self.funcs)
}
pub(crate) fn inc_core_memories(&mut self) -> u32 {
inc(&mut self.core_memories)
}
pub(crate) fn inc_types(&mut self) -> u32 {
inc(&mut self.types)
}
pub(crate) fn inc_core_instances(&mut self) -> u32 {
inc(&mut self.core_instances)
}
pub(crate) fn inc_core_funcs(&mut self) -> u32 {
inc(&mut self.core_funcs)
}
}
fn inc(count: &mut u32) -> u32 {
let current = *count;
*count += 1;
current
}