@@ -3208,6 +3208,8 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
32083208
32093209 std::unordered_map<Name, Tag*> allTags;
32103210
3211+ std::unordered_map<Name, RuntimeMemory*> allMemories;
3212+
32113213 using CreateTableFunc = std::unique_ptr<RuntimeTable>(Literal, Table);
32123214
32133215 ModuleRunnerBase (
@@ -3321,6 +3323,19 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
33213323 return iter->second ;
33223324 }
33233325
3326+ RuntimeMemory* getExportedMemoryOrNull (Name name) {
3327+ Export* export_ = wasm.getExportOrNull (name);
3328+ if (!export_ || export_->kind != ExternalKind::Memory) {
3329+ return nullptr ;
3330+ }
3331+ Name internalName = *export_->getInternalName ();
3332+ auto iter = allMemories.find (internalName);
3333+ if (iter == allMemories.end ()) {
3334+ return nullptr ;
3335+ }
3336+ return iter->second ;
3337+ }
3338+
33243339 Literals& getExportedGlobalOrTrap (Name name) {
33253340 auto * global = getExportedGlobalOrNull (name);
33263341 if (!global) {
@@ -3372,6 +3387,7 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
33723387 std::vector<Literals> definedGlobals;
33733388 std::vector<std::unique_ptr<RuntimeTable>> definedTables;
33743389 std::vector<Tag> definedTags;
3390+ std::vector<std::unique_ptr<RuntimeMemory>> definedMemories;
33753391
33763392 // Keep a record of call depth, to guard against excessive recursion.
33773393 size_t callDepth = 0 ;
@@ -3595,6 +3611,37 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
35953611 });
35963612 }
35973613
3614+ void initializeMemories () {
3615+ int definedMemoryCount = 0 ;
3616+ ModuleUtils::iterDefinedMemories (
3617+ wasm, [&definedMemoryCount](auto && _) { ++definedMemoryCount; });
3618+ definedMemories.reserve (definedMemoryCount);
3619+
3620+ for (auto & memory : wasm.memories ) {
3621+ if (memory->imported ()) {
3622+ auto importNames = memory->importNames ();
3623+ auto * importedMemory =
3624+ importResolver->getMemoryOrNull (importNames, *memory);
3625+ if (!importedMemory) {
3626+ externalInterface->trap ((std::stringstream ()
3627+ << " Imported memory " << importNames
3628+ << " not found." )
3629+ .str ());
3630+ }
3631+ [[maybe_unused]] auto [_, inserted] =
3632+ allMemories.try_emplace (memory->name , importedMemory);
3633+ // parsing/validation checked this already.
3634+ assert (inserted && " Unexpected repeated memory name" );
3635+ } else {
3636+ auto & runtimeMemory = definedMemories.emplace_back (
3637+ std::make_unique<RealRuntimeMemory>(memory));
3638+ [[maybe_unused]] auto [_, inserted] =
3639+ allMemories.try_emplace (memory->name , runtimeMemory.get ());
3640+ assert (inserted && " Unexpected repeated memory name" );
3641+ }
3642+ }
3643+ }
3644+
35983645 struct MemoryInstanceInfo {
35993646 // The ModuleRunner instance in which the memory is defined.
36003647 SubType* instance;
0 commit comments