From bab21052c3e12df7ad2fd3711d0fe6e69e05f449 Mon Sep 17 00:00:00 2001 From: Thomas Lively <7121787+tlively@users.noreply.github.com> Date: Sat, 18 Jun 2022 09:37:09 -0700 Subject: Do not emit recursion groups without GC enabled (#4738) We emit nominal types as a single large recursion group, but this produces invalid modules when --nominal or --hybrid was used without GC enabled. Fix the bug by always emitting types as though they were structural (i.e. without recursion groups) when GC is not enabled. Fixes #4723. --- src/wasm/wasm-binary.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 6cbf880e3..c161a623b 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -223,7 +223,12 @@ void WasmBinaryWriter::writeTypes() { // the type section. With nominal typing there is always one group and with // equirecursive typing there is one group per type. size_t numGroups = 0; - switch (getTypeSystem()) { + // MVP types are structural and do not use recursion groups. + TypeSystem typeSystem = getTypeSystem(); + if (!wasm->features.hasGC()) { + typeSystem = TypeSystem::Equirecursive; + } + switch (typeSystem) { case TypeSystem::Equirecursive: numGroups = indexedTypes.types.size(); break; @@ -242,7 +247,7 @@ void WasmBinaryWriter::writeTypes() { BYN_TRACE("== writeTypes\n"); auto start = startSection(BinaryConsts::Section::Type); o << U32LEB(numGroups); - if (getTypeSystem() == TypeSystem::Nominal) { + if (typeSystem == TypeSystem::Nominal) { // The nominal recursion group contains every type. o << S32LEB(BinaryConsts::EncodedType::Rec) << U32LEB(indexedTypes.types.size()); -- cgit v1.2.3