wamex-cli 0.1.0

Command line interface for wamex splitter
Documentation
use std::borrow::Cow;

use crate::{emit::ImportedEntity, index::InputGlobalId};

#[derive(Debug)]
pub enum DefinedGlobal<'a> {
    PlainCopy {
        input_global_id: InputGlobalId,
        global: wasmparser::Global<'a>,
    },
    WithConstructor(wasm_encoder::GlobalType),
}

#[derive(Debug)]
pub enum GlobalImport<'a> {
    Existing {
        global_name: &'a str,
        module_name: &'a str,
        input_global_id: InputGlobalId,
        global_type: wasm_encoder::GlobalType,
    },
    New {
        global_name: Cow<'a, str>,
        input_global_id: Option<InputGlobalId>,
        global_type: wasm_encoder::GlobalType,
    },
}

impl ImportedEntity for GlobalImport<'_> {
    fn module_name(&self) -> Cow<'_, str> {
        match self {
            GlobalImport::Existing { module_name, .. } => (*module_name).into(),
            GlobalImport::New { .. } => "__wamex".into(),
        }
    }
    fn import_name(&self) -> Cow<'_, str> {
        match self {
            GlobalImport::Existing { global_name, .. } => (*global_name).into(),
            GlobalImport::New { global_name, .. } => global_name.clone(),
        }
    }
}

impl GlobalImport<'_> {
    pub fn global_type(&self) -> &wasm_encoder::GlobalType {
        match self {
            GlobalImport::Existing { global_type, .. } => global_type,
            GlobalImport::New { global_type, .. } => global_type,
        }
    }
}

pub fn global_init_tmp(val_type: wasm_encoder::ValType) -> wasm_encoder::ConstExpr {
    match val_type {
        wasm_encoder::ValType::I32 => wasm_encoder::ConstExpr::i32_const(0),
        wasm_encoder::ValType::I64 => wasm_encoder::ConstExpr::i64_const(0),
        wasm_encoder::ValType::F32 => wasm_encoder::ConstExpr::f32_const(0.0.into()),
        wasm_encoder::ValType::F64 => wasm_encoder::ConstExpr::f64_const(0.0.into()),
        _ => panic!("Unsupported global type for tmp init"),
    }
}