diff --git a/Userland/Libraries/LibWasm/Parser/Parser.cpp b/Userland/Libraries/LibWasm/Parser/Parser.cpp index 6c6b343336..2a1292a8bb 100644 --- a/Userland/Libraries/LibWasm/Parser/Parser.cpp +++ b/Userland/Libraries/LibWasm/Parser/Parser.cpp @@ -1047,9 +1047,20 @@ ParseResult ElementSection::SegmentType3::parse(St ParseResult ElementSection::SegmentType4::parse(Stream& stream) { - dbgln("Type 4"); - (void)stream; - return ParseError::NotImplemented; + auto expression = Expression::parse(stream); + if (expression.is_error()) + return expression.error(); + auto initializers = parse_vector(stream); + if (initializers.is_error()) + return initializers.error(); + + return SegmentType4 { + .mode = Active { + .index = 0, + .expression = expression.release_value(), + }, + .initializer = initializers.release_value(), + }; } ParseResult ElementSection::SegmentType5::parse(Stream& stream) @@ -1117,7 +1128,7 @@ ParseResult ElementSection::Element::parse(Stream& stre if (auto result = SegmentType4::parse(stream); result.is_error()) { return result.error(); } else { - return ParseError::NotImplemented; + return Element { ValueType(ValueType::FunctionReference), move(result.value().initializer), move(result.value().mode) }; } case 0x05: if (auto result = SegmentType5::parse(stream); result.is_error()) { diff --git a/Userland/Libraries/LibWasm/Types.h b/Userland/Libraries/LibWasm/Types.h index 238b68b1c8..c12f0bb8d9 100644 --- a/Userland/Libraries/LibWasm/Types.h +++ b/Userland/Libraries/LibWasm/Types.h @@ -737,7 +737,6 @@ public: }; struct SegmentType0 { - // FIXME: Implement me! static ParseResult parse(Stream& stream); Vector function_indices; @@ -757,8 +756,10 @@ public: static ParseResult parse(Stream& stream); }; struct SegmentType4 { - // FIXME: Implement me! static ParseResult parse(Stream& stream); + + Active mode; + Vector initializer; }; struct SegmentType5 { // FIXME: Implement me!