//! Regression tests for GitHub issue:
//! https://github.com/paritytech/wasmi/issues/587
//!
//! The problem was that Wasm memories (and tables) were defined twice for a
//! Wasmi instance for every imported Wasm memory (or table). Since Wasmi
//! does not support the `multi-memory` Wasm proposal this resulted Wasm
//! instances with more than 1 memory (or table) if the Wasm module imported
//! those entities.

use crate::{
    Engine,
    Error,
    Instance,
    Linker,
    Memory,
    MemoryType,
    Module,
    Ref,
    RefType,
    Store,
    Table,
    TableType,
    instance::InstanceEntity,
};

fn try_instantiate_from_wat(wasm: &str) -> Result<(Store<()>, Instance), Error> {
    let engine = Engine::default();
    let module = Module::new(&engine, wasm)?;
    let mut store = Store::new(&engine, ());
    let mut linker = <Linker<()>>::new(&engine);
    // Define one memory that can be used by the tests as import.
    let memory_type = MemoryType::new(4, None);
    let memory = Memory::new(&mut store, memory_type)?;
    linker.define("env", "memory", memory)?;
    // Define one table that can be used by the tests as import.
    let table_type = TableType::new(RefType::Func, 4, None);
    let init = Ref::default_for_ty(table_type.element());
    let table = Table::new(&mut store, table_type, init)?;
    linker.define("env", "table", table)?;
    let instance = linker.instantiate_and_start(&mut store, &module)?;
    Ok((store, instance))
}

fn instantiate_from_wat(wat: &str) -> (Store<()>, Instance) {
    try_instantiate_from_wat(wat).unwrap()
}

fn resolve_instance<'a>(store: &'a Store<()>, instance: &Instance) -> &'a InstanceEntity {
    store.inner.resolve_instance(instance)
}

fn assert_no_duplicates(store: &Store<()>, instance: Instance) {
    assert!(resolve_instance(store, &instance).get_memory(1).is_none());
    assert!(resolve_instance(store, &instance).get_table(1).is_none());
}

#[test]
fn test_import_memory_and_table() {
    let wat = r#"
        (module
            (import "env" "memory" (memory 4))
            (import "env" "table" (table 4 funcref))
        )"#;
    let (store, instance) = instantiate_from_wat(wat);
    assert!(resolve_instance(&store, &instance).get_memory(0).is_some());
    assert!(resolve_instance(&store, &instance).get_table(0).is_some());
    assert_no_duplicates(&store, instance);
}

#[test]
fn test_import_memory() {
    let wat = r#"
        (module
            (import "env" "memory" (memory 4))
        )"#;
    let (store, instance) = instantiate_from_wat(wat);
    assert!(resolve_instance(&store, &instance).get_memory(0).is_some());
    assert!(resolve_instance(&store, &instance).get_table(0).is_none());
    assert_no_duplicates(&store, instance);
}

#[test]
fn test_import_table() {
    let wat = r#"
        (module
            (import "env" "table" (table 4 funcref))
        )"#;
    let (store, instance) = instantiate_from_wat(wat);
    assert!(resolve_instance(&store, &instance).get_memory(0).is_none());
    assert!(resolve_instance(&store, &instance).get_table(0).is_some());
    assert_no_duplicates(&store, instance);
}

#[test]
fn test_no_memory_no_table() {
    let wat = "(module)";
    let (store, instance) = instantiate_from_wat(wat);
    assert!(resolve_instance(&store, &instance).get_memory(0).is_none());
    assert!(resolve_instance(&store, &instance).get_table(0).is_none());
    assert_no_duplicates(&store, instance);
}

#[test]
fn test_internal_memory() {
    let wat = "(module (memory 1 10) )";
    let (store, instance) = instantiate_from_wat(wat);
    assert!(resolve_instance(&store, &instance).get_memory(0).is_some());
    assert!(resolve_instance(&store, &instance).get_table(0).is_none());
    assert_no_duplicates(&store, instance);
}

#[test]
fn test_internal_table() {
    let wat = "(module (table 4 funcref) )";
    let (store, instance) = instantiate_from_wat(wat);
    assert!(resolve_instance(&store, &instance).get_memory(0).is_none());
    assert!(resolve_instance(&store, &instance).get_table(0).is_some());
    assert_no_duplicates(&store, instance);
}

Homonyms

neural/trident/src/deploy/tests.rs
soft3/radio/iroh-blobs/src/tests.rs
cyb/honeycrisp/aruminium/src/tests.rs
neural/trident/src/package/store/tests.rs
neural/trident/src/lsp/util/tests.rs
neural/trident/src/ir/lir/tests.rs
neural/trident/src/verify/sym/tests.rs
cyb/wysm/crates/collections/src/tests.rs
neural/trident/src/cost/stack_verifier/tests.rs
neural/trident/src/package/registry/tests.rs
neural/trident/src/syntax/lexer/tests.rs
neural/trident/src/syntax/format/tests.rs
neural/trident/src/verify/smt/tests.rs
neural/trident/src/syntax/grammar/tests.rs
cyb/wysm/crates/wasmi/src/tests.rs
neural/trident/src/verify/report/tests.rs
neural/trident/src/config/scaffold/tests.rs
neural/trident/src/lsp/semantic/tests.rs
neural/trident/src/verify/equiv/tests.rs
cyb/wysm/crates/cli/src/tests.rs
neural/trident/src/verify/solve/tests.rs
neural/trident/src/verify/synthesize/tests.rs
neural/trident/src/config/resolve/tests.rs
cyb/honeycrisp/aruminium/src/render/tests.rs
neural/trident/src/package/manifest/tests.rs
neural/trident/src/package/hash/tests.rs
cyb/wysm/crates/wasmi/src/instance/tests.rs
neural/trident/src/ir/tir/optimize/tests.rs
neural/trident/src/ir/tir/lower/tests.rs
bootloader/go-cyber/cw/contracts/graph-filter/src/tests.rs
cyb/wysm/crates/core/src/table/tests.rs
cyb/evy/forks/bevy_ecs/src/bundle/tests.rs
neural/trident/src/neural/data/tir_graph/tests.rs
cyb/wysm/crates/core/src/memory/tests.rs
neural/trident/src/ir/tir/stack/tests.rs
cyb/wysm/crates/wasmi/src/engine/limits/tests.rs
cyb/evy/forks/naga/src/front/wgsl/tests.rs

Graph