diff --git a/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.cpp b/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.cpp index 7376d729dbd..5b1adfb8b76 100644 --- a/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.cpp +++ b/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.cpp @@ -275,7 +275,7 @@ InstantiationResult AbstractMachine::instantiate(Module const& module, Vector(); - if (!active_ptr) + auto elem_instance = m_store.get(main_module_instance.elements()[current_index]); + if (!active_ptr) { + if (segment.mode.has()) + *elem_instance = ElementInstance(elem_instance->type(), {}); continue; + } Configuration config { m_store }; if (m_should_limit_instruction_count) config.enable_instruction_count_limit(); @@ -322,7 +326,6 @@ InstantiationResult AbstractMachine::instantiate(Module const& module, Vector Validator::validate(ElementSection const& section [](ElementSection::Passive const&) -> ErrorOr { return {}; }, [&](ElementSection::Active const& active) -> ErrorOr { TRY(validate(active.index)); + auto table = m_context.tables[active.index.value()]; + if (table.element_type() != segment.type) + return Errors::invalid("active element reference type"sv); auto expression_result = TRY(validate(active.expression, { ValueType(ValueType::I32) })); if (!expression_result.is_constant) return Errors::invalid("active element initializer"sv); diff --git a/Userland/Libraries/LibWasm/Parser/Parser.cpp b/Userland/Libraries/LibWasm/Parser/Parser.cpp index 39efe2f57ea..464e689d9b7 100644 --- a/Userland/Libraries/LibWasm/Parser/Parser.cpp +++ b/Userland/Libraries/LibWasm/Parser/Parser.cpp @@ -1281,10 +1281,10 @@ ParseResult ElementSection::Element::parse(Stream& stre Vector items; if (!has_exprs) { auto indices = TRY(parse_vector>(stream)); - Vector instructions; - for (auto& index : indices) - instructions.empend(Instructions::ref_func, index); - items = { Expression { move(instructions) } }; + for (auto& index : indices) { + Vector instructions { Instruction(Instructions::ref_func, index) }; + items.empend(move(instructions)); + } } else { items = TRY(parse_vector(stream)); }