@@ -3183,6 +3183,8 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
31833183
31843184 std::unordered_map<Name, Tag*> allTags;
31853185
3186+ std::unordered_map<Name, RuntimeMemory*> allMemories;
3187+
31863188 using CreateTableFunc = std::unique_ptr<RuntimeTable>(Literal, Table);
31873189
31883190 ModuleRunnerBase (
@@ -3296,6 +3298,19 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
32963298 return iter->second ;
32973299 }
32983300
3301+ RuntimeMemory* getExportedMemoryOrNull (Name name) {
3302+ Export* export_ = wasm.getExportOrNull (name);
3303+ if (!export_ || export_->kind != ExternalKind::Memory) {
3304+ return nullptr ;
3305+ }
3306+ Name internalName = *export_->getInternalName ();
3307+ auto iter = allMemories.find (internalName);
3308+ if (iter == allMemories.end ()) {
3309+ return nullptr ;
3310+ }
3311+ return iter->second ;
3312+ }
3313+
32993314 Literals& getExportedGlobalOrTrap (Name name) {
33003315 auto * global = getExportedGlobalOrNull (name);
33013316 if (!global) {
@@ -3347,6 +3362,7 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
33473362 std::vector<Literals> definedGlobals;
33483363 std::vector<std::unique_ptr<RuntimeTable>> definedTables;
33493364 std::vector<Tag> definedTags;
3365+ std::vector<std::unique_ptr<RuntimeMemory>> definedMemories;
33503366
33513367 // Keep a record of call depth, to guard against excessive recursion.
33523368 size_t callDepth = 0 ;
@@ -3570,6 +3586,37 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
35703586 });
35713587 }
35723588
3589+ void initializeMemories () {
3590+ int definedMemoryCount = 0 ;
3591+ ModuleUtils::iterDefinedMemories (
3592+ wasm, [&definedMemoryCount](auto && _) { ++definedMemoryCount; });
3593+ definedMemories.reserve (definedMemoryCount);
3594+
3595+ for (auto & memory : wasm.memories ) {
3596+ if (memory->imported ()) {
3597+ auto importNames = memory->importNames ();
3598+ auto * importedMemory =
3599+ importResolver->getMemoryOrNull (importNames, *memory);
3600+ if (!importedMemory) {
3601+ externalInterface->trap ((std::stringstream ()
3602+ << " Imported memory " << importNames
3603+ << " not found." )
3604+ .str ());
3605+ }
3606+ [[maybe_unused]] auto [_, inserted] =
3607+ allMemories.try_emplace (memory->name , importedMemory);
3608+ // parsing/validation checked this already.
3609+ assert (inserted && " Unexpected repeated memory name" );
3610+ } else {
3611+ auto & runtimeMemory = definedMemories.emplace_back (
3612+ std::make_unique<RealRuntimeMemory>(memory));
3613+ [[maybe_unused]] auto [_, inserted] =
3614+ allMemories.try_emplace (memory->name , runtimeMemory.get ());
3615+ assert (inserted && " Unexpected repeated memory name" );
3616+ }
3617+ }
3618+ }
3619+
35733620 struct MemoryInstanceInfo {
35743621 // The ModuleRunner instance in which the memory is defined.
35753622 SubType* instance;
0 commit comments