use wasmi::{CompilationMode, Config};
use wasmi_wast::WastRunner;

/// Runs the Wasm test spec identified by the given name.
fn process_wast(path: &'static str, wast: &'static str, config: Config) {
    let mut runner = WastRunner::new(&config);
    if let Err(error) = runner.register_spectest() {
        panic!("{path}: failed to setup Wasm spectest module: {error}");
    }
    if let Err(error) = runner.register_wasmitest() {
        panic!("{path}: failed to setup Wasmi test module: {error:?}");
    }
    if let Err(error) = runner.process_directives(path, wast) {
        panic!("{error:#}")
    }
}

macro_rules! define_test {
    (
        config: $get_config:expr;

        $( $(#[$attr:meta])* fn $test_name:ident($file_name:literal); )*
    ) => {
        $(
            #[test]
            $( #[$attr] )*
            fn $test_name() {
                let name: &'static ::core::primitive::str = ::core::concat!($file_name);
                let file: &'static ::core::primitive::str = self::blobs::$test_name();
                process_wast(name, file, $get_config)
            }
        )*
    };
}

/// Create a [`Config`] for the Wasm MVP feature set.
fn mvp_config() -> Config {
    let mut config = Config::default();
    config
        .compilation_mode(CompilationMode::Eager)
        .wasm_mutable_global(false)
        .wasm_saturating_float_to_int(false)
        .wasm_sign_extension(false)
        .wasm_multi_value(false)
        .wasm_multi_memory(false)
        .wasm_simd(false)
        .wasm_memory64(false);
    config
}

/// If Wasmi's fuel metering is enabled or disabled.
pub enum FuelMetering {
    /// Fuel metering is disabled.
    Disabled,
    /// Fuel metering is enabled.
    Enabled,
}

/// Returns [`Config`] with `parsing_mode` and apply `adjust_config` to its [`Config`].
fn runner_config(adjust_config: impl Fn(&mut Config)) -> Config {
    let mut config = mvp_config();
    adjust_config(&mut config);
    config
}

/// Returns a closure that applies a [`Config`]'s Config for Wasm spec tests.
fn apply_spec_config(fuel_metering: FuelMetering) -> impl Fn(&mut Config) {
    move |config| {
        config
            .consume_fuel(matches!(fuel_metering, FuelMetering::Enabled))
            .wasm_mutable_global(true)
            .wasm_saturating_float_to_int(true)
            .wasm_sign_extension(true)
            .wasm_multi_value(true)
            .wasm_multi_memory(false)
            .wasm_bulk_memory(true)
            .wasm_reference_types(true)
            .wasm_tail_call(true)
            .wasm_extended_const(true)
            .wasm_wide_arithmetic(true)
            .wasm_simd(true);
    }
}

macro_rules! foreach_test {
    ( $mac:ident $( $args:tt )* ) => {
        $mac! {
            $( $args )*

            fn spec_address("spec/address");
            fn spec_align("spec/align");
            fn spec_binary_leb128("spec/binary-leb128");
            fn spec_binary("spec/binary");
            fn spec_block("spec/block");
            fn spec_br("spec/br");
            fn spec_br_if("spec/br_if");
            fn spec_br_table("spec/br_table");
            fn spec_bulk("spec/bulk");
            fn spec_call("spec/call");
            fn spec_call_indirect("spec/call_indirect");
            fn spec_extended_const_data("spec/proposals/extended-const/data");
            fn spec_extended_const_elem("spec/proposals/extended-const/elem");
            fn spec_extended_const_global("spec/proposals/extended-const/global");
            fn spec_return_call("spec/proposals/tail-call/return_call");
            fn spec_return_call_indirect("spec/proposals/tail-call/return_call_indirect");
            fn spec_comments("spec/comments");
            fn spec_const("spec/const");
            fn spec_conversions("spec/conversions");
            fn spec_custom("spec/custom");
            fn spec_data("spec/data");
            fn spec_elem("spec/elem");
            fn spec_endianness("spec/endianness");
            fn spec_exports("spec/exports");
            fn spec_f32("spec/f32");
            fn spec_f32_bitwise("spec/f32_bitwise");
            fn spec_f32_cmp("spec/f32_cmp");
            fn spec_f64("spec/f64");
            fn spec_f64_bitwise("spec/f64_bitwise");
            fn spec_f64_cmp("spec/f64_cmp");
            fn spec_fac("spec/fac");
            fn spec_float_exprs("spec/float_exprs");
            fn spec_float_literals("spec/float_literals");
            fn spec_float_memory("spec/float_memory");
            fn spec_float_misc("spec/float_misc");
            fn spec_forward("spec/forward");
            fn spec_func("spec/func");
            fn spec_func_ptrs("spec/func_ptrs");
            fn spec_global("spec/global");
            fn spec_i32("spec/i32");
            fn spec_i64("spec/i64");
            fn spec_if("spec/if");
            fn spec_imports("spec/imports");
            fn spec_inline_module("spec/inline-module");
            fn spec_int_exprs("spec/int_exprs");
            fn spec_int_literals("spec/int_literals");
            fn spec_labels("spec/labels");
            fn spec_left_to_right("spec/left-to-right");
            fn spec_linking("spec/linking");
            fn spec_load("spec/load");
            fn spec_local_get("spec/local_get");
            fn spec_local_set("spec/local_set");
            fn spec_local_tee("spec/local_tee");
            fn spec_loop("spec/loop");
            fn spec_memory("spec/memory");
            fn spec_memory_copy("spec/memory_copy");
            fn spec_memory_fill("spec/memory_fill");
            fn spec_memory_grow("spec/memory_grow");
            fn spec_memory_init("spec/memory_init");
            fn spec_memory_redundancy("spec/memory_redundancy");
            fn spec_memory_size("spec/memory_size");
            fn spec_memory_trap("spec/memory_trap");
            fn spec_obsolete_keywords("spec/obsolete-keywords");
            fn spec_names("spec/names");
            fn spec_nop("spec/nop");
            fn spec_ref_func("spec/ref_func");
            fn spec_ref_is_null("spec/ref_is_null");
            fn spec_ref_null("spec/ref_null");
            fn spec_return("spec/return");
            fn spec_select("spec/select");
            fn spec_skip_stack_guard_page("spec/skip-stack-guard-page");
            fn spec_stack("spec/stack");
            fn spec_start("spec/start");
            fn spec_store("spec/store");
            fn spec_switch("spec/switch");
            fn spec_table_sub("spec/table-sub");
            fn spec_table("spec/table");
            fn spec_table_copy("spec/table_copy");
            fn spec_table_fill("spec/table_fill");
            fn spec_table_get("spec/table_get");
            fn spec_table_grow("spec/table_grow");
            fn spec_table_init("spec/table_init");
            fn spec_table_set("spec/table_set");
            fn spec_table_size("spec/table_size");
            fn spec_token("spec/token");
            fn spec_traps("spec/traps");
            fn spec_type("spec/type");
            fn spec_unreachable("spec/unreachable");
            fn spec_unreached_invalid("spec/unreached-invalid");
            fn spec_unreached_valid("spec/unreached-valid");
            fn spec_unwind("spec/unwind");
            fn spec_utf8_custom_section_id("spec/utf8-custom-section-id");
            fn spec_utf8_import_field("spec/utf8-import-field");
            fn spec_utf8_import_module("spec/utf8-import-module");
            fn spec_utf8_invalid_encoding("spec/utf8-invalid-encoding");
            fn spec_wide_arithmetic("spec/proposals/wide-arithmetic/wide-arithmetic");

            // Wasmi specific test cases and regression tests.
            fn wasmi_fibonacci("wasmi/tests/fibonacci");
            fn wasmi_wide_arithmetic("wasmi/tests/wide-arithmetic");
            fn wasmi_replace_result("wasmi/tests/replace-result");
            fn wasmi_local_set("wasmi/tests/local-set");
            fn wasmi_local_tee("wasmi/tests/local-tee");
            fn wasmi_if("wasmi/tests/if");
            fn wasmi_fuse_cmp("wasmi/tests/fuse-cmp");
            fn wasmi_select("wasmi/tests/select");
            fn wasmi_preserve_locals("wasmi/tests/preserve-locals");
            fn wasmi_many_inout("wasmi/tests/many-inout");
            fn wasmi_copy_span("wasmi/tests/copy-span");
            fn wasmi_audit("wasmi/tests/audit");
            fn wasmi_call("wasmi/tests/call");
            fn wasmi_call_indirect("wasmi/tests/call-indirect");
            fn wasmi_return_call("wasmi/tests/return-call");
            fn wasmi_return_call_indirect("wasmi/tests/return-call-indirect");
            fn wasmi_global_set("wasmi/tests/global-set");
            fn wasmi_br_table("wasmi/tests/br-table");
            // Wasmi: binary operators
            fn wasmi_i32_add("wasmi/tests/op/i32-add");
            fn wasmi_i32_sub("wasmi/tests/op/i32-sub");
            fn wasmi_i32_mul("wasmi/tests/op/i32-mul");
            fn wasmi_i32_sdiv("wasmi/tests/op/i32-sdiv");
            fn wasmi_i32_srem("wasmi/tests/op/i32-srem");
            fn wasmi_i32_and("wasmi/tests/op/i32-and");
            fn wasmi_i64_add("wasmi/tests/op/i64-add");
            fn wasmi_i64_sub("wasmi/tests/op/i64-sub");
            fn wasmi_i64_mul("wasmi/tests/op/i64-mul");
            fn wasmi_i64_sdiv("wasmi/tests/op/i64-sdiv");
            fn wasmi_i64_srem("wasmi/tests/op/i64-srem");
            fn wasmi_i64_and("wasmi/tests/op/i64-and");
            // Wasmi: fuse br_if + cmp
            fn wasmi_fuse_br_i32_ge_s("wasmi/tests/fuse-br/i32_ge_s");
            fn wasmi_fuse_br_i32_ge_u("wasmi/tests/fuse-br/i32_ge_u");
            fn wasmi_fuse_br_i32_gt_s("wasmi/tests/fuse-br/i32_gt_s");
            fn wasmi_fuse_br_i32_gt_u("wasmi/tests/fuse-br/i32_gt_u");
            fn wasmi_fuse_br_i32_le_s("wasmi/tests/fuse-br/i32_le_s");
            fn wasmi_fuse_br_i32_le_u("wasmi/tests/fuse-br/i32_le_u");
            fn wasmi_fuse_br_i32_lt_s("wasmi/tests/fuse-br/i32_lt_s");
            fn wasmi_fuse_br_i32_lt_u("wasmi/tests/fuse-br/i32_lt_u");
            fn wasmi_fuse_br_i32_and("wasmi/tests/fuse-br/i32_and");
            fn wasmi_fuse_br_i32_or("wasmi/tests/fuse-br/i32_or");
            fn wasmi_fuse_br_i32_xor("wasmi/tests/fuse-br/i32_xor");
            fn wasmi_fuse_br_i64_ge_s("wasmi/tests/fuse-br/i64_ge_s");
            fn wasmi_fuse_br_i64_ge_u("wasmi/tests/fuse-br/i64_ge_u");
            fn wasmi_fuse_br_i64_gt_s("wasmi/tests/fuse-br/i64_gt_s");
            fn wasmi_fuse_br_i64_gt_u("wasmi/tests/fuse-br/i64_gt_u");
            fn wasmi_fuse_br_i64_le_s("wasmi/tests/fuse-br/i64_le_s");
            fn wasmi_fuse_br_i64_le_u("wasmi/tests/fuse-br/i64_le_u");
            fn wasmi_fuse_br_i64_lt_s("wasmi/tests/fuse-br/i64_lt_s");
            fn wasmi_fuse_br_i64_lt_u("wasmi/tests/fuse-br/i64_lt_u");
            fn wasmi_fuse_br_i64_and("wasmi/tests/fuse-br/i64_and");
            fn wasmi_fuse_br_i64_or("wasmi/tests/fuse-br/i64_or");
            fn wasmi_fuse_br_i64_xor("wasmi/tests/fuse-br/i64_xor");
            fn wasmi_fuse_br_f32_lt("wasmi/tests/fuse-br/f32_lt");
            fn wasmi_fuse_br_f32_le("wasmi/tests/fuse-br/f32_le");
            fn wasmi_fuse_br_f32_gt("wasmi/tests/fuse-br/f32_gt");
            fn wasmi_fuse_br_f32_ge("wasmi/tests/fuse-br/f32_ge");
            fn wasmi_fuse_br_f64_lt("wasmi/tests/fuse-br/f64_lt");
            fn wasmi_fuse_br_f64_le("wasmi/tests/fuse-br/f64_le");
            fn wasmi_fuse_br_f64_gt("wasmi/tests/fuse-br/f64_gt");
            fn wasmi_fuse_br_f64_ge("wasmi/tests/fuse-br/f64_ge");
            // Wasmi: fuse if + cmp
            fn wasmi_fuse_if_i32_ge_s("wasmi/tests/fuse-if/i32_ge_s");
            fn wasmi_fuse_if_i32_ge_u("wasmi/tests/fuse-if/i32_ge_u");
            fn wasmi_fuse_if_i32_gt_s("wasmi/tests/fuse-if/i32_gt_s");
            fn wasmi_fuse_if_i32_gt_u("wasmi/tests/fuse-if/i32_gt_u");
            fn wasmi_fuse_if_i32_le_s("wasmi/tests/fuse-if/i32_le_s");
            fn wasmi_fuse_if_i32_le_u("wasmi/tests/fuse-if/i32_le_u");
            fn wasmi_fuse_if_i32_lt_s("wasmi/tests/fuse-if/i32_lt_s");
            fn wasmi_fuse_if_i32_lt_u("wasmi/tests/fuse-if/i32_lt_u");
            fn wasmi_fuse_if_i32_and("wasmi/tests/fuse-if/i32_and");
            fn wasmi_fuse_if_i32_or("wasmi/tests/fuse-if/i32_or");
            fn wasmi_fuse_if_i32_xor("wasmi/tests/fuse-if/i32_xor");
            fn wasmi_fuse_if_i64_ge_s("wasmi/tests/fuse-if/i64_ge_s");
            fn wasmi_fuse_if_i64_ge_u("wasmi/tests/fuse-if/i64_ge_u");
            fn wasmi_fuse_if_i64_gt_s("wasmi/tests/fuse-if/i64_gt_s");
            fn wasmi_fuse_if_i64_gt_u("wasmi/tests/fuse-if/i64_gt_u");
            fn wasmi_fuse_if_i64_le_s("wasmi/tests/fuse-if/i64_le_s");
            fn wasmi_fuse_if_i64_le_u("wasmi/tests/fuse-if/i64_le_u");
            fn wasmi_fuse_if_i64_lt_s("wasmi/tests/fuse-if/i64_lt_s");
            fn wasmi_fuse_if_i64_lt_u("wasmi/tests/fuse-if/i64_lt_u");
            fn wasmi_fuse_if_i64_and("wasmi/tests/fuse-if/i64_and");
            fn wasmi_fuse_if_i64_or("wasmi/tests/fuse-if/i64_or");
            fn wasmi_fuse_if_i64_xor("wasmi/tests/fuse-if/i64_xor");
            fn wasmi_fuse_if_f32_lt("wasmi/tests/fuse-if/f32_lt");
            fn wasmi_fuse_if_f32_le("wasmi/tests/fuse-if/f32_le");
            fn wasmi_fuse_if_f32_gt("wasmi/tests/fuse-if/f32_gt");
            fn wasmi_fuse_if_f32_ge("wasmi/tests/fuse-if/f32_ge");
            fn wasmi_fuse_if_f64_lt("wasmi/tests/fuse-if/f64_lt");
            fn wasmi_fuse_if_f64_le("wasmi/tests/fuse-if/f64_le");
            fn wasmi_fuse_if_f64_gt("wasmi/tests/fuse-if/f64_gt");
            fn wasmi_fuse_if_f64_ge("wasmi/tests/fuse-if/f64_ge");
            // Wasmi: fuse select + i32.cmp
            fn wasmi_fuse_select_i32_lt_s("wasmi/tests/fuse-select/i32_lt_s");
            fn wasmi_fuse_select_i32_lt_u("wasmi/tests/fuse-select/i32_lt_u");
            fn wasmi_fuse_select_i32_le_s("wasmi/tests/fuse-select/i32_le_s");
            fn wasmi_fuse_select_i32_le_u("wasmi/tests/fuse-select/i32_le_u");
            fn wasmi_fuse_select_i32_gt_s("wasmi/tests/fuse-select/i32_gt_s");
            fn wasmi_fuse_select_i32_gt_u("wasmi/tests/fuse-select/i32_gt_u");
            fn wasmi_fuse_select_i32_ge_s("wasmi/tests/fuse-select/i32_ge_s");
            fn wasmi_fuse_select_i32_ge_u("wasmi/tests/fuse-select/i32_ge_u");
            fn wasmi_fuse_select_i32_and("wasmi/tests/fuse-select/i32_and");
            fn wasmi_fuse_select_i32_or("wasmi/tests/fuse-select/i32_or");
            fn wasmi_fuse_select_i32_xor("wasmi/tests/fuse-select/i32_xor");
            // Wasmi: fuse select + i64.cmp
            fn wasmi_fuse_select_i64_lt_s("wasmi/tests/fuse-select/i64_lt_s");
            fn wasmi_fuse_select_i64_lt_u("wasmi/tests/fuse-select/i64_lt_u");
            fn wasmi_fuse_select_i64_le_s("wasmi/tests/fuse-select/i64_le_s");
            fn wasmi_fuse_select_i64_le_u("wasmi/tests/fuse-select/i64_le_u");
            fn wasmi_fuse_select_i64_gt_s("wasmi/tests/fuse-select/i64_gt_s");
            fn wasmi_fuse_select_i64_gt_u("wasmi/tests/fuse-select/i64_gt_u");
            fn wasmi_fuse_select_i64_ge_s("wasmi/tests/fuse-select/i64_ge_s");
            fn wasmi_fuse_select_i64_ge_u("wasmi/tests/fuse-select/i64_ge_u");
            fn wasmi_fuse_select_i64_and("wasmi/tests/fuse-select/i64_and");
            fn wasmi_fuse_select_i64_or("wasmi/tests/fuse-select/i64_or");
            fn wasmi_fuse_select_i64_xor("wasmi/tests/fuse-select/i64_xor");
            // Wasmi: fuse select + f32.cmp
            fn wasmi_fuse_select_f32_lt("wasmi/tests/fuse-select/f32_lt");
            fn wasmi_fuse_select_f32_le("wasmi/tests/fuse-select/f32_le");
            fn wasmi_fuse_select_f32_gt("wasmi/tests/fuse-select/f32_gt");
            fn wasmi_fuse_select_f32_ge("wasmi/tests/fuse-select/f32_ge");
            // Wasmi: fuse select + f64.cmp
            fn wasmi_fuse_select_f64_lt("wasmi/tests/fuse-select/f64_lt");
            fn wasmi_fuse_select_f64_le("wasmi/tests/fuse-select/f64_le");
            fn wasmi_fuse_select_f64_gt("wasmi/tests/fuse-select/f64_gt");
            fn wasmi_fuse_select_f64_ge("wasmi/tests/fuse-select/f64_ge");
            // Simd
            fn wasmi_simd("wasmi/tests/simd");
            fn wasmi_v128_select("wasmi/tests/v128-select");

            // Wasm `simd` tests
            fn spec_simd_address("spec/simd_address");
            fn spec_simd_align("spec/simd_align");
            fn spec_simd_bit_shift("spec/simd_bit_shift");
            fn spec_simd_bitwise("spec/simd_bitwise");
            fn spec_simd_boolean("spec/simd_boolean");
            fn spec_simd_const("spec/simd_const");
            fn spec_simd_conversions("spec/simd_conversions");
            fn spec_simd_f32x4("spec/simd_f32x4");
            fn spec_simd_f32x4_arith("spec/simd_f32x4_arith");
            fn spec_simd_f32x4_cmp("spec/simd_f32x4_cmp");
            fn spec_simd_f32x4_pmin_pmax("spec/simd_f32x4_pmin_pmax");
            fn spec_simd_f32x4_rounding("spec/simd_f32x4_rounding");
            fn spec_simd_f64x2("spec/simd_f64x2");
            fn spec_simd_f64x2_arith("spec/simd_f64x2_arith");
            fn spec_simd_f64x2_cmp("spec/simd_f64x2_cmp");
            fn spec_simd_f64x2_pmin_pmax("spec/simd_f64x2_pmin_pmax");
            fn spec_simd_f64x2_rounding("spec/simd_f64x2_rounding");
            fn spec_simd_i16x8_arith("spec/simd_i16x8_arith");
            fn spec_simd_i16x8_arith2("spec/simd_i16x8_arith2");
            fn spec_simd_i16x8_cmp("spec/simd_i16x8_cmp");
            fn spec_simd_i16x8_extadd_pairwise_i8x16("spec/simd_i16x8_extadd_pairwise_i8x16");
            fn spec_simd_i16x8_extmul_i8x16("spec/simd_i16x8_extmul_i8x16");
            fn spec_simd_i16x8_q15mulr_sat_s("spec/simd_i16x8_q15mulr_sat_s");
            fn spec_simd_i16x8_sat_arith("spec/simd_i16x8_sat_arith");
            fn spec_simd_i32x4_arith("spec/simd_i32x4_arith");
            fn spec_simd_i32x4_arith2("spec/simd_i32x4_arith2");
            fn spec_simd_i32x4_cmp("spec/simd_i32x4_cmp");
            fn spec_simd_i32x4_dot_i16x8("spec/simd_i32x4_dot_i16x8");
            fn spec_simd_i32x4_extadd_pairwise_i16x8("spec/simd_i32x4_extadd_pairwise_i16x8");
            fn spec_simd_i32x4_extmul_i16x8("spec/simd_i32x4_extmul_i16x8");
            fn spec_simd_i32x4_trunc_sat_f32x4("spec/simd_i32x4_trunc_sat_f32x4");
            fn spec_simd_i32x4_trunc_sat_f64x2("spec/simd_i32x4_trunc_sat_f64x2");
            fn spec_simd_i64x2_arith("spec/simd_i64x2_arith");
            fn spec_simd_i64x2_arith2("spec/simd_i64x2_arith2");
            fn spec_simd_i64x2_cmp("spec/simd_i64x2_cmp");
            fn spec_simd_i64x2_extmul_i32x4("spec/simd_i64x2_extmul_i32x4");
            fn spec_simd_i8x16_arith("spec/simd_i8x16_arith");
            fn spec_simd_i8x16_arith2("spec/simd_i8x16_arith2");
            fn spec_simd_i8x16_cmp("spec/simd_i8x16_cmp");
            fn spec_simd_i8x16_sat_arith("spec/simd_i8x16_sat_arith");
            fn spec_simd_int_to_int_extend("spec/simd_int_to_int_extend");
            fn spec_simd_lane("spec/simd_lane");
            fn spec_simd_linking("spec/simd_linking");
            fn spec_simd_load("spec/simd_load");
            fn spec_simd_load16_lane("spec/simd_load16_lane");
            fn spec_simd_load32_lane("spec/simd_load32_lane");
            fn spec_simd_load64_lane("spec/simd_load64_lane");
            fn spec_simd_load8_lane("spec/simd_load8_lane");
            fn spec_simd_load_splat("spec/simd_load_splat");
            fn spec_simd_load_extend("spec/simd_load_extend");
            fn spec_simd_load_zero("spec/simd_load_zero");
            fn spec_simd_splat("spec/simd_splat");
            fn spec_simd_store("spec/simd_store");
            fn spec_simd_store16_lane("spec/simd_store16_lane");
            fn spec_simd_store32_lane("spec/simd_store32_lane");
            fn spec_simd_store64_lane("spec/simd_store64_lane");
            fn spec_simd_store8_lane("spec/simd_store8_lane");

            // Wasm `relaxed-simd` tests
            fn spec_relaxed_simd_i16x8_relaxed_q15mulr_s("spec/proposals/relaxed-simd/i16x8_relaxed_q15mulr_s");
            fn spec_relaxed_simd_i32x4_relaxed_trunc("spec/proposals/relaxed-simd/i32x4_relaxed_trunc");
            fn spec_relaxed_simd_i8x16_relaxed_swizzle("spec/proposals/relaxed-simd/i8x16_relaxed_swizzle");
            fn spec_relaxed_simd_relaxed_dot_product("spec/proposals/relaxed-simd/relaxed_dot_product");
            fn spec_relaxed_simd_relaxed_laneselect("spec/proposals/relaxed-simd/relaxed_laneselect");
            fn spec_relaxed_simd_relaxed_madd_nmadd("spec/proposals/relaxed-simd/relaxed_madd_nmadd");
            fn spec_relaxed_simd_relaxed_min_max("spec/proposals/relaxed-simd/relaxed_min_max");
        }
    };
}

macro_rules! foreach_test_multi_memory {
    ( $mac:ident $( $args:tt )* ) => {
        $mac! {
            $( $args )*

            fn spec_multi_memory_align("spec/proposals/multi-memory/align");
            fn spec_multi_memory_address0("spec/proposals/multi-memory/address0");
            fn spec_multi_memory_address1("spec/proposals/multi-memory/address1");
            fn spec_multi_memory_align0("spec/proposals/multi-memory/align0");
            fn spec_multi_memory_binary("spec/proposals/multi-memory/binary");
            fn spec_multi_memory_binary0("spec/proposals/multi-memory/binary0");
            fn spec_multi_memory_data_drop0("spec/proposals/multi-memory/data_drop0");
            fn spec_multi_memory_data("spec/proposals/multi-memory/data");
            fn spec_multi_memory_data0("spec/proposals/multi-memory/data0");
            fn spec_multi_memory_data1("spec/proposals/multi-memory/data1");
            fn spec_multi_memory_exports0("spec/proposals/multi-memory/exports0");
            fn spec_multi_memory_float_exprs0("spec/proposals/multi-memory/float_exprs0");
            fn spec_multi_memory_float_exprs1("spec/proposals/multi-memory/float_exprs1");
            fn spec_multi_memory_float_memory0("spec/proposals/multi-memory/float_memory0");
            fn spec_multi_memory_imports("spec/proposals/multi-memory/imports");
            fn spec_multi_memory_imports0("spec/proposals/multi-memory/imports0");
            fn spec_multi_memory_imports1("spec/proposals/multi-memory/imports1");
            fn spec_multi_memory_imports2("spec/proposals/multi-memory/imports2");
            fn spec_multi_memory_imports3("spec/proposals/multi-memory/imports3");
            fn spec_multi_memory_imports4("spec/proposals/multi-memory/imports4");
            fn spec_multi_memory_linking0("spec/proposals/multi-memory/linking0");
            fn spec_multi_memory_linking1("spec/proposals/multi-memory/linking1");
            fn spec_multi_memory_linking2("spec/proposals/multi-memory/linking2");
            fn spec_multi_memory_linking3("spec/proposals/multi-memory/linking3");
            fn spec_multi_memory_load("spec/proposals/multi-memory/load");
            fn spec_multi_memory_load0("spec/proposals/multi-memory/load0");
            fn spec_multi_memory_load1("spec/proposals/multi-memory/load1");
            fn spec_multi_memory_load2("spec/proposals/multi-memory/load2");
            fn spec_multi_memory_memory_copy0("spec/proposals/multi-memory/memory_copy0");
            fn spec_multi_memory_memory_copy1("spec/proposals/multi-memory/memory_copy1");
            fn spec_multi_memory_memory_fill0("spec/proposals/multi-memory/memory_fill0");
            fn spec_multi_memory_memory_grow("spec/proposals/multi-memory/memory_grow");
            fn spec_multi_memory_memory_init0("spec/proposals/multi-memory/memory_init0");
            fn spec_multi_memory_memory_size("spec/proposals/multi-memory/memory_size");
            fn spec_multi_memory_memory_size0("spec/proposals/multi-memory/memory_size0");
            fn spec_multi_memory_memory_size1("spec/proposals/multi-memory/memory_size1");
            fn spec_multi_memory_memory_size2("spec/proposals/multi-memory/memory_size2");
            fn spec_multi_memory_memory_size3("spec/proposals/multi-memory/memory_size3");
            fn spec_multi_memory_memory_trap0("spec/proposals/multi-memory/memory_trap0");
            fn spec_multi_memory_memory_trap1("spec/proposals/multi-memory/memory_trap1");
            fn spec_multi_memory_memory_multi("spec/proposals/multi-memory/memory-multi");
            fn spec_multi_memory_memory("spec/proposals/multi-memory/memory");
            fn spec_multi_memory_simd_memory("spec/proposals/multi-memory/simd_memory-multi");
            fn spec_multi_memory_start0("spec/proposals/multi-memory/start0");
            fn spec_multi_memory_store("spec/proposals/multi-memory/store");
            fn spec_multi_memory_store0("spec/proposals/multi-memory/store0");
            fn spec_multi_memory_store1("spec/proposals/multi-memory/store1");
            fn spec_multi_memory_traps0("spec/proposals/multi-memory/traps0");
        }
    };
}

macro_rules! foreach_test_cps {
    ( $mac:ident $( $args:tt )* ) => {
        $mac! {
            $( $args )*

            fn spec_custom_page_sizes("spec/proposals/custom-page-sizes/custom-page-sizes");
            fn spec_custom_page_sizes_invalid("spec/proposals/custom-page-sizes/custom-page-sizes-invalid");
            fn spec_custom_page_sizes_memory_max("spec/proposals/custom-page-sizes/memory_max");
            fn spec_custom_page_sizes_memory_max64("spec/proposals/custom-page-sizes/memory_max_i64");
        }
    };
}

macro_rules! foreach_test_memory64 {
    ( $mac:ident $( $args:tt )* ) => {
        $mac! {
            $( $args )*

            fn spec_address64("wasmi/memory64/address64");
            fn spec_align64("wasmi/memory64/align64");
            fn spec_call_indirect64("wasmi/memory64/call_indirect");
            fn spec_endianness64("wasmi/memory64/endianness64");
            fn spec_float_memory64("wasmi/memory64/float_memory64");
            fn spec_load64("wasmi/memory64/load64");
            fn spec_memory_grow64("wasmi/memory64/memory_grow64");
            fn spec_memory_trap64("wasmi/memory64/memory_trap64");
            fn spec_memory_redundancy64("wasmi/memory64/memory_redundancy64");
            fn spec_memory64("wasmi/memory64/memory64");
            fn spec_memory_copy64("wasmi/memory64/memory_copy");
            fn spec_memory_fill64("wasmi/memory64/memory_fill");
            fn spec_memory_init64("wasmi/memory64/memory_init");
            fn spec_imports64("wasmi/memory64/imports");
            fn spec_table64("wasmi/memory64/table");
            fn spec_table_copy_mixed("wasmi/memory64/table_copy_mixed");
        }
    };
}

macro_rules! foreach_test_missing_features {
    ( $mac:ident $( $args:tt )* ) => {
        $mac! {
            $( $args )*

            fn local_mutable_global_disabled("wasmi/tests/missing-features/mutable-global-disabled");
            fn local_saturating_float_to_int_disabled("wasmi/tests/missing-features/saturating-float-to-int-disabled");
            fn local_sign_extension_disabled("wasmi/tests/missing-features/sign-extension-disabled");
        }
    };
}

// Note: we include the Wasm blobs into the test binary instead of reading them
//       from file so that we can run the resulting binary with the `miri` interpreter.
macro_rules! include_wasm_blobs {
    (
        $( $(#[$attr:meta])* fn $test_name:ident($file_name:literal); )*
    ) => {
        $(
            $( #[$attr] )*
            pub fn $test_name() -> &'static str {
                ::core::include_str!(
                    ::core::concat!($file_name, ".wast")
                )
            }
        )*
    };
}

mod blobs {
    foreach_test!(include_wasm_blobs);
    foreach_test_multi_memory!(include_wasm_blobs);
    foreach_test_cps!(include_wasm_blobs);
    foreach_test_memory64!(include_wasm_blobs);
    foreach_test_missing_features!(include_wasm_blobs);
}

mod buffered {
    use super::*;

    foreach_test! {
        define_test
        config: runner_config(apply_spec_config(FuelMetering::Disabled));
    }
}

mod fueled {
    use super::*;

    foreach_test! {
        define_test
        config: runner_config(apply_spec_config(FuelMetering::Enabled));
    }
}

mod missing_features {
    use super::*;

    foreach_test_missing_features! {
        define_test
        config: runner_config(|_|());
    }
}

mod multi_memory {
    use super::*;

    foreach_test_multi_memory! {
        define_test
        config: runner_config(|config| {
            config
                .wasm_simd(true)
                .wasm_mutable_global(true)
                .wasm_multi_memory(true);
        });
    }
}

mod custom_page_sizes {
    use super::*;

    foreach_test_cps! {
        define_test
        config: runner_config(|config| {
            config
                .wasm_multi_memory(true)
                .wasm_memory64(true)
                .wasm_custom_page_sizes(true);
        });
    }
}

mod memory64 {
    use super::*;

    foreach_test_memory64! {
        define_test
        config: runner_config(|config| {
            config
                .wasm_mutable_global(true)
                .wasm_multi_value(true)
                .wasm_multi_memory(true)
                .wasm_memory64(true);
        });
    }
}

Homonyms

cyberia/src/components/mod.rs
cyberia/src/pages/mod.rs
cyb/optica/src/output/mod.rs
neural/trident/src/compile/mod.rs
cyb/optica/src/parser/mod.rs
soft3/nox/rs/data/mod.rs
neural/trident/src/api/mod.rs
soft3/mir/src/graph/mod.rs
cyb/optica/src/render/mod.rs
cyb/optica/src/scanner/mod.rs
soft3/cybergraph/tests/common/mod.rs
neural/trident/src/verify/mod.rs
soft3/tru/rs/model/mod.rs
neural/trident/src/diagnostic/mod.rs
soft3/mudra/src/proof/mod.rs
cyb/optica/src/graph/mod.rs
soft3/glia/import/loader/mod.rs
soft3/glia/run/backend/mod.rs
neural/trident/src/import/mod.rs
soft3/tru/rs/pass/mod.rs
soft3/mir/src/bevy/mod.rs
neural/trident/src/package/mod.rs
neural/trident/src/lsp/mod.rs
neural/trident/src/field/mod.rs
cyb/prysm/atoms/rs/mod.rs
soft3/tru/rs/graph/mod.rs
neural/trident/src/deploy/mod.rs
soft3/mir/src/epoch/mod.rs
neural/trident/src/runtime/mod.rs
soft3/glia/run/arch/mod.rs
neural/trident/src/typecheck/mod.rs
neural/trident/src/gpu/mod.rs
soft3/nox/rs/jets/mod.rs
soft3/glia/run/tokenizer/mod.rs
soft3/mir/src/frame/mod.rs
neural/trident/src/ir/mod.rs
neural/trident/src/config/mod.rs
soft3/nox/rs/patterns/mod.rs
neural/trident/src/cost/mod.rs
soft3/glia/run/ir/mod.rs
neural/trident/src/cli/mod.rs
soft3/tru/rs/focusing/mod.rs
neural/trident/src/neural/mod.rs
cyb/optica/src/query/mod.rs
cyb/prysm/system/rs/mod.rs
neural/trident/src/ast/mod.rs
soft3/glia/run/bench/mod.rs
cyb/prysm/molecules/rs/mod.rs
cyb/optica/src/server/mod.rs
soft3/glia/run/core/mod.rs
neural/trident/src/syntax/mod.rs
cyb/honeycrisp/acpu/src/vector/mod.rs
soft3/glia/run/backend/cpu/mod.rs
soft3/zheng/rs/src/spartan/mod.rs
soft3/bbg/rs/src/storage/mod.rs
neural/trident/src/config/resolve/mod.rs
cyb/honeycrisp/aruminium/src/ffi/mod.rs
cyb/cyb/cyb-shell/src/worlds/mod.rs
cyb/wysm/crates/wasi/tests/mod.rs
soft3/zheng/rs/src/ccs/mod.rs
neural/trident/src/package/store/mod.rs
cyb/cyb/cyb-shell/src/shell/mod.rs
cyb/wysm/crates/wasmi/tests/mod.rs
neural/trident/src/verify/synthesize/mod.rs
cyb/honeycrisp/acpu/src/field/mod.rs
neural/rs/macros/src/addressed/mod.rs
soft3/glia/run/cli/cmd/mod.rs
neural/trident/src/cost/stack_verifier/mod.rs
neural/eidos/rs/src/stdlib/mod.rs
neural/trident/src/verify/sym/mod.rs
neural/trident/src/syntax/format/mod.rs
neural/trident/src/syntax/grammar/mod.rs
neural/trident/src/lsp/util/mod.rs
neural/rs/rsc/src/lints/mod.rs
neural/trident/src/typecheck/tests/mod.rs
neural/eidos/rs/src/surface/mod.rs
soft3/mir/src/frame/tiers/mod.rs
cyb/honeycrisp/acpu/src/pulse/mod.rs
neural/trident/src/ir/lir/mod.rs
neural/trident/src/package/registry/mod.rs
neural/trident/src/neural/model/mod.rs
neural/trident/src/package/hash/mod.rs
cyb/honeycrisp/acpu/src/sync/mod.rs
soft3/glia/run/arch/decoder/mod.rs
neural/trident/src/verify/report/mod.rs
neural/trident/src/ir/tir/mod.rs
cyb/honeycrisp/rane/src/mil/mod.rs
cyb/honeycrisp/acpu/src/crypto/mod.rs
soft3/zheng/rs/src/folding/mod.rs
neural/trident/src/ir/tree/mod.rs
cyb/honeycrisp/acpu/src/matrix/mod.rs
soft3/glia/run/backend/honeycrisp/mod.rs
neural/eidos/rs/src/elab/mod.rs
neural/rs/macros/src/registers/mod.rs
neural/trident/src/verify/solve/mod.rs
neural/rs/core/src/fixed_point/mod.rs
neural/trident/src/syntax/parser/mod.rs
neural/trident/src/neural/data/mod.rs
neural/trident/src/verify/smt/mod.rs
soft3/radio/iroh-blobs/examples/common/mod.rs
soft3/strata/nebu/rs/extension/mod.rs
neural/rs/darwin-sys/src/ffi/mod.rs
cyb/honeycrisp/acpu/src/sparse/mod.rs
soft3/glia/run/backend/wgpu/mod.rs
neural/rs/core/src/bounded/mod.rs
neural/eidos/rs/src/tactic_ext/mod.rs
neural/trident/src/cost/model/mod.rs
soft3/radio/iroh-blobs/src/store/mod.rs
neural/trident/src/package/manifest/mod.rs
cyb/cyb/cyb-shell/src/agent/mod.rs
neural/trident/src/neural/training/mod.rs
neural/trident/src/verify/equiv/mod.rs
neural/trident/src/syntax/lexer/mod.rs
cyb/honeycrisp/acpu/src/numeric/mod.rs
soft3/radio/cyber-bao/src/io/mod.rs
neural/trident/src/ir/kir/mod.rs
cyb/honeycrisp/aruminium/src/render/mod.rs
neural/trident/src/neural/inference/mod.rs
cyb/honeycrisp/acpu/src/probe/mod.rs
neural/trident/src/api/tests/mod.rs
cyb/honeycrisp/acpu/src/gemm/mod.rs
soft3/nox/rs/jets/backends/mod.rs
neural/trident/src/lsp/semantic/mod.rs
neural/rs/macros/src/cell/mod.rs
neural/trident/src/config/scaffold/mod.rs
soft3/zheng/rs/src/sumcheck/mod.rs
cyb/evy/forks/bevy_ecs/src/entity/mod.rs
neural/trident/src/ir/tir/builder/mod.rs
cyb/evy/forks/bevy_ecs/src/system/mod.rs
cyb/evy/forks/bevy_sprite_render/src/render/mod.rs
soft3/strata/jali/wgsl/src/shaders/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/tonemapping/mod.rs
cyb/evy/forks/bevy_anti_alias/src/dlss/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/skybox/mod.rs
cyb/evy/forks/bevy_sprite_render/src/text2d/mod.rs
cyb/evy/forks/bevy_render/src/batching/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/experimental/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/oit/mod.rs
cyb/evy/forks/bevy_sprite_render/src/tilemap_chunk/mod.rs
cyb/evy/forks/bevy_pbr/src/atmosphere/mod.rs
cyb/evy/forks/bevy_post_process/src/motion_blur/mod.rs
cyb/wysm/crates/wasmi/src/store/mod.rs
cyb/evy/forks/bevy_render/src/render_graph/mod.rs
cyb/wysm/crates/wasmi/benches/bench/mod.rs
cyb/evy/forks/bevy_anti_alias/src/contrast_adaptive_sharpening/mod.rs
neural/trident/src/ir/tir/stack/mod.rs
cyb/evy/forks/bevy_render/src/texture/mod.rs
cyb/wysm/crates/c_api/src/types/mod.rs
soft3/strata/genies/wgsl/src/shaders/mod.rs
cyb/wysm/crates/core/src/memory/mod.rs
bootloader/go-cyber/mcp/rust/src/proto/mod.rs
cyb/evy/forks/bevy_ecs/src/bundle/mod.rs
cyb/evy/forks/bevy_mesh/src/primitives/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/mod.rs
cyb/wysm/crates/wasmi/src/module/mod.rs
cyb/evy/forks/bevy_sprite/src/texture_slice/mod.rs
cyb/evy/forks/bevy_ecs/src/observer/mod.rs
neural/trident/src/ir/tir/neural/mod.rs
cyb/evy/forks/bevy_render/src/view/mod.rs
neural/trident/src/ir/lir/lower/mod.rs
cyb/evy/forks/bevy_anti_alias/src/smaa/mod.rs
bootloader/go-cyber/mcp/rust/src/clients/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/fullscreen_vertex_shader/mod.rs
cyb/wysm/crates/wasmi/tests/integration/mod.rs
cyb/wysm/crates/ir/src/decode/mod.rs
cyb/wysm/crates/wasmi/src/memory/mod.rs
cyb/evy/crates/evy_prysm_core/src/layout/mod.rs
cyb/evy/forks/bevy_anti_alias/src/fxaa/mod.rs
cyb/evy/forks/bevy_pbr/src/prepass/mod.rs
cyb/evy/forks/bevy_render/src/render_resource/mod.rs
cyb/evy/forks/bevy_ecs/src/query/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/core_2d/mod.rs
cyb/wysm/crates/cli/src/commands/mod.rs
cyb/evy/forks/bevy_render/src/renderer/mod.rs
cyb/wysm/crates/collections/src/arena/mod.rs
cyb/evy/forks/bevy_post_process/src/effect_stack/mod.rs
cyb/evy/forks/bevy_ecs/src/change_detection/mod.rs
cyb/evy/forks/bevy_pbr/src/ssao/mod.rs
cyb/evy/forks/naga/src/keywords/mod.rs
cyb/evy/forks/naga/src/compact/mod.rs
neural/trident/src/ir/tir/lower/mod.rs
cyb/evy/forks/bevy_pbr/src/render/mod.rs
cyb/evy/forks/bevy_ecs/src/world/mod.rs
cyb/evy/forks/bevy_anti_alias/src/taa/mod.rs
cyb/evy/forks/bevy_ecs/src/reflect/mod.rs
soft3/strata/kuro/wgsl/src/shaders/mod.rs
cyb/evy/forks/bevy_ecs/src/error/mod.rs
neural/trident/src/ir/kir/lower/mod.rs
cyb/evy/forks/naga/src/proc/mod.rs
cyb/evy/forks/bevy_ecs/src/event/mod.rs
cyb/evy/forks/bevy_ecs/src/component/mod.rs
cyb/evy/forks/bevy_sprite_render/src/mesh2d/mod.rs
cyb/evy/forks/bevy_ecs/src/relationship/mod.rs
cyb/wysm/crates/wasmi/src/instance/mod.rs
cyb/evy/forks/bevy_pbr/src/ssr/mod.rs
bootloader/go-cyber/mcp/rust/src/tools/mod.rs
soft3/glia/run/backend/honeycrisp/kernels/mod.rs
cyb/evy/forks/naga/src/back/mod.rs
soft3/glia/run/backend/cpu/quant/mod.rs
cyb/wysm/crates/core/src/table/mod.rs
cyb/evy/forks/bevy_post_process/src/dof/mod.rs
cyb/evy/forks/bevy_pbr/src/light_probe/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/prepass/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/upscaling/mod.rs
cyb/wysm/crates/wasmi/src/table/mod.rs
cyb/evy/forks/bevy_post_process/src/bloom/mod.rs
cyb/evy/forks/bevy_pbr/src/lightmap/mod.rs
neural/trident/src/ir/tir/optimize/mod.rs
cyb/evy/forks/bevy_gizmos/src/primitives/mod.rs
cyb/evy/forks/bevy_post_process/src/auto_exposure/mod.rs
neural/trident/src/neural/data/tir_graph/mod.rs
cyb/evy/forks/bevy_render/src/experimental/mod.rs
cyb/wysm/crates/wasmi/src/engine/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/deferred/mod.rs
cyb/evy/forks/naga/src/arena/mod.rs
cyb/evy/forks/bevy_render/src/diagnostic/mod.rs
cyb/evy/forks/bevy_render/src/render_phase/mod.rs
cyb/evy/forks/bevy_transform/src/components/mod.rs
soft3/strata/trop/wgsl/src/shaders/mod.rs
soft3/glia/run/backend/wgpu/kernels/mod.rs
cyb/evy/forks/bevy_sprite_render/src/texture_slice/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/core_3d/mod.rs
cyb/evy/forks/bevy_render/src/mesh/mod.rs
neural/trident/src/ir/tree/lower/mod.rs
cyb/evy/forks/bevy_pbr/src/volumetric_fog/mod.rs
cyb/evy/forks/bevy_pbr/src/decal/mod.rs
cyb/wysm/crates/fuzz/src/oracle/mod.rs
cyb/evy/forks/bevy_ecs/src/message/mod.rs
cyb/evy/forks/naga/src/valid/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/blit/mod.rs
cyb/evy/forks/naga/src/front/mod.rs
cyb/wysm/crates/wasi/src/sync/mod.rs
cyb/evy/forks/bevy_pbr/src/meshlet/mod.rs
cyb/evy/forks/bevy_pbr/src/deferred/mod.rs
neural/trident/src/syntax/parser/tests/mod.rs
cyb/evy/forks/bevy_ecs/src/storage/mod.rs
cyb/evy/forks/bevy_tasks/src/iter/mod.rs
soft3/glia/run/arch/decoder/families/mod.rs
cyb/wysm/crates/wasmi/src/func/mod.rs
cyb/evy/forks/naga/src/common/mod.rs
cyb/evy/forks/naga/src/front/wgsl/mod.rs
cyb/evy/forks/naga/src/back/spv/mod.rs
cyb/evy/forks/naga/src/back/dot/mod.rs
cyb/evy/forks/bevy_render/src/view/window/mod.rs
cyb/wysm/crates/wasi/src/sync/snapshots/mod.rs
cyb/evy/forks/bevy_render/src/experimental/occlusion_culling/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/graph/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/mod.rs
cyb/wysm/crates/wasmi/src/module/parser/mod.rs
cyb/wysm/crates/wasmi/src/engine/limits/mod.rs
cyb/wysm/crates/wasmi/src/engine/executor/mod.rs
cyb/evy/forks/bevy_ecs/src/system/commands/mod.rs
cyb/evy/forks/naga/src/back/wgsl/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/oit/resolve/mod.rs
cyb/wysm/crates/wasmi/src/module/instantiate/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/experimental/mip_generation/mod.rs
cyb/evy/forks/bevy_ecs/src/storage/table/mod.rs
bootloader/go-cyber/cw/packages/cyber-std/src/tokenfactory/mod.rs
cyb/evy/forks/bevy_render/src/view/visibility/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/executor/mod.rs
cyb/evy/forks/naga/src/front/spv/mod.rs
cyb/evy/forks/naga/src/back/msl/mod.rs
cyb/evy/forks/naga/src/front/glsl/mod.rs
cyb/evy/forks/bevy_ecs/src/world/entity_access/mod.rs
cyb/evy/forks/bevy_mesh/src/primitives/dim3/mod.rs
cyb/evy/forks/naga/src/back/glsl/mod.rs
cyb/evy/forks/naga/src/back/hlsl/mod.rs
struct Baz { m: mat3x2, } struct Baz { float2 m_0; float2 m_1; float2 m_2; }; float3x2 GetMatmOnBaz(Baz obj) { return float3x2(obj.m_0, obj.m_1, obj.m_2); }
cyb/wysm/crates/wasmi/src/engine/executor/handler/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/mod.rs
cyb/evy/forks/naga/src/front/wgsl/parse/mod.rs
cyb/evy/forks/naga/src/back/wgsl/polyfill/mod.rs
cyb/evy/forks/naga/src/front/wgsl/lower/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/simd/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/stack/mod.rs
cyb/wysm/crates/wasmi/src/engine/executor/handler/dispatch/mod.rs

Graph