/// Walk the list of registered Readers and find one that can parse the
/// supplied file and parse it.
- std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
- std::unique_ptr<File> &result) const;
+ ErrorOr<std::unique_ptr<File>>
+ loadFile(std::unique_ptr<MemoryBuffer> mb) const;
/// Walk the list of registered kind tables to convert a Reference Kind
/// name to a value.
_yamlHandlers.push_back(std::move(handler));
}
-std::error_code Registry::loadFile(std::unique_ptr<MemoryBuffer> mb,
- std::unique_ptr<File> &result) const {
+ErrorOr<std::unique_ptr<File>>
+Registry::loadFile(std::unique_ptr<MemoryBuffer> mb) const {
// Get file magic.
StringRef content(mb->getBufferStart(), mb->getBufferSize());
llvm::sys::fs::file_magic fileType = llvm::sys::fs::identify_magic(content);
for (const std::unique_ptr<Reader> &reader : _readers) {
if (!reader->canParse(fileType, *mb))
continue;
- ErrorOr<std::unique_ptr<File>> fileOrErr =
- reader->loadFile(std::move(mb), *this);
- if (std::error_code ec = fileOrErr.getError())
- return ec;
- result = std::move(fileOrErr.get());
- return std::error_code();
+ return reader->loadFile(std::move(mb), *this);
}
// No Reader could parse this file.
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr = ctx.getMemoryBuffer(path);
if (std::error_code ec = mbOrErr.getError())
return makeErrorFile(path, ec);
- std::unique_ptr<File> file;
- if (std::error_code ec =
- ctx.registry().loadFile(std::move(mbOrErr.get()), file))
+ ErrorOr<std::unique_ptr<File>> fileOrErr =
+ ctx.registry().loadFile(std::move(mbOrErr.get()));
+ if (std::error_code ec = fileOrErr.getError())
return makeErrorFile(path, ec);
std::vector<std::unique_ptr<File>> files;
- files.push_back(std::move(file));
+ files.push_back(std::move(fileOrErr.get()));
for (std::unique_ptr<File> &pf : files) {
// If file is a dylib, inform LinkingContext about it.
if (SharedLibraryFile *shl = dyn_cast<SharedLibraryFile>(pf.get())) {
= MemoryBuffer::getFileOrSTDIN(path);
if (std::error_code ec = mb.getError())
return makeErrorFile(path, ec);
- std::unique_ptr<File> file;
- if (std::error_code ec = ctx.registry().loadFile(std::move(mb.get()), file))
+ ErrorOr<std::unique_ptr<File>> fileOrErr =
+ ctx.registry().loadFile(std::move(mb.get()));
+ if (std::error_code ec = fileOrErr.getError())
return makeErrorFile(path, ec);
std::vector<std::unique_ptr<File>> files;
- files.push_back(std::move(file));
+ files.push_back(std::move(fileOrErr.get()));
if (wholeArchive)
return parseMemberFiles(files);
return files;
std::unique_ptr<MemoryBuffer> memberMB(MemoryBuffer::getMemBuffer(
mb.getBuffer(), mb.getBufferIdentifier(), false));
- std::unique_ptr<File> file;
- if (std::error_code ec = _registry.loadFile(std::move(memberMB), file))
+ ErrorOr<std::unique_ptr<File>> fileOrErr =
+ _registry.loadFile(std::move(memberMB));
+ if (std::error_code ec = fileOrErr.getError())
return ec;
std::vector<std::unique_ptr<File>> files;
- files.push_back(std::move(file));
+ files.push_back(std::move(fileOrErr.get()));
assert(files.size() == 1);
result = std::move(files[0]);
if (std::error_code ec = result->parse())
if (mbOrErr.getError())
return nullptr;
- std::unique_ptr<File> file;
- if (registry().loadFile(std::move(mbOrErr.get()), file))
+ ErrorOr<std::unique_ptr<File>> fileOrErr =
+ registry().loadFile(std::move(mbOrErr.get()));
+ if (!fileOrErr)
return nullptr;
std::vector<std::unique_ptr<File>> files;
- files.push_back(std::move(file));
+ files.push_back(std::move(fileOrErr.get()));
assert(files.size() == 1 && "expected one file in dylib");
files[0]->parse();
MachODylibFile* result = reinterpret_cast<MachODylibFile*>(files[0].get());