Expected<SymbolFlagsMap>
JITDylib::defineMaterializing(SymbolFlagsMap SymbolFlags) {
+ // TODO: Should we bail out early here if MR is defunct?
return ES.runSessionLocked([&]() -> Expected<SymbolFlagsMap> {
- std::vector<SymbolTable::iterator> AddedSyms;
- std::vector<SymbolFlagsMap::iterator> RejectedWeakDefs;
+ std::vector<NonOwningSymbolStringPtr> AddedSyms;
+ std::vector<NonOwningSymbolStringPtr> RejectedWeakDefs;
for (auto SFItr = SymbolFlags.begin(), SFEnd = SymbolFlags.end();
SFItr != SFEnd; ++SFItr) {
// If this is a strong definition then error out.
if (!Flags.isWeak()) {
// Remove any symbols already added.
- for (auto &SI : AddedSyms)
- Symbols.erase(SI);
+ for (auto &S : AddedSyms)
+ Symbols.erase(Symbols.find_as(S));
// FIXME: Return all duplicates.
return make_error<DuplicateDefinition>(std::string(*Name));
}
// Otherwise just make a note to discard this symbol after the loop.
- RejectedWeakDefs.push_back(SFItr);
+ RejectedWeakDefs.push_back(NonOwningSymbolStringPtr(Name));
continue;
} else
EntryItr =
Symbols.insert(std::make_pair(Name, SymbolTableEntry(Flags))).first;
- AddedSyms.push_back(EntryItr);
+ AddedSyms.push_back(NonOwningSymbolStringPtr(Name));
EntryItr->second.setState(SymbolState::Materializing);
}
// Remove any rejected weak definitions from the SymbolFlags map.
while (!RejectedWeakDefs.empty()) {
- SymbolFlags.erase(RejectedWeakDefs.back());
+ SymbolFlags.erase(SymbolFlags.find_as(RejectedWeakDefs.back()));
RejectedWeakDefs.pop_back();
}