bool First;
Archive::child_iterator Cur;
Archive::child_iterator End;
- Error Err;
-
- RustArchiveIterator() : First(true), Err(Error::success()) {}
+ std::unique_ptr<Error> Err;
+
+ RustArchiveIterator(Archive::child_iterator Cur, Archive::child_iterator End,
+ std::unique_ptr<Error> Err)
+ : First(true),
+ Cur(Cur),
+ End(End),
+ Err(std::move(Err)) {}
};
enum class LLVMRustArchiveKind {
extern "C" LLVMRustArchiveIteratorRef
LLVMRustArchiveIteratorNew(LLVMRustArchiveRef RustArchive) {
Archive *Archive = RustArchive->getBinary();
- RustArchiveIterator *RAI = new RustArchiveIterator();
- RAI->Cur = Archive->child_begin(RAI->Err);
- if (RAI->Err) {
- LLVMRustSetLastError(toString(std::move(RAI->Err)).c_str());
- delete RAI;
+ std::unique_ptr<Error> Err = llvm::make_unique<Error>(Error::success());
+ auto Cur = Archive->child_begin(*Err);
+ if (*Err) {
+ LLVMRustSetLastError(toString(std::move(*Err)).c_str());
return nullptr;
}
- RAI->End = Archive->child_end();
- return RAI;
+ auto End = Archive->child_end();
+ return new RustArchiveIterator(Cur, End, std::move(Err));
}
extern "C" LLVMRustArchiveChildConstRef
// but instead advance it *before* fetching the child in all later calls.
if (!RAI->First) {
++RAI->Cur;
- if (RAI->Err) {
- LLVMRustSetLastError(toString(std::move(RAI->Err)).c_str());
+ if (*RAI->Err) {
+ LLVMRustSetLastError(toString(std::move(*RAI->Err)).c_str());
return nullptr;
}
} else {