diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm/wasm-validator.cpp | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 179235fbc..cd90e767e 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -3734,13 +3734,23 @@ static void validateFeatures(Module& module, ValidationInfo& info) { static void validateClosedWorldInterface(Module& module, ValidationInfo& info) { // Error if there are any publicly exposed heap types beyond the types of - // publicly exposed functions. - std::unordered_set<HeapType> publicFuncTypes; - ModuleUtils::iterImportedFunctions( - module, [&](Function* func) { publicFuncTypes.insert(func->type); }); + // publicly exposed functions. Note that we must include all types in the rec + // groups that are used, as if a type if public then all types in its rec + // group are as well. + std::unordered_set<RecGroup> publicRecGroups; + ModuleUtils::iterImportedFunctions(module, [&](Function* func) { + publicRecGroups.insert(func->type.getRecGroup()); + }); for (auto& ex : module.exports) { if (ex->kind == ExternalKind::Function) { - publicFuncTypes.insert(module.getFunction(ex->value)->type); + publicRecGroups.insert(module.getFunction(ex->value)->type.getRecGroup()); + } + } + + std::unordered_set<HeapType> publicTypes; + for (auto& group : publicRecGroups) { + for (auto type : group) { + publicTypes.insert(type); } } @@ -3749,7 +3759,7 @@ static void validateClosedWorldInterface(Module& module, ValidationInfo& info) { auto ignorable = getIgnorablePublicTypes(); for (auto type : ModuleUtils::getPublicHeapTypes(module)) { - if (!publicFuncTypes.count(type) && !ignorable.count(type)) { + if (!publicTypes.count(type) && !ignorable.count(type)) { auto name = type.toString(); if (auto it = module.typeNames.find(type); it != module.typeNames.end()) { name = it->second.name.toString(); |