object::Archive::child_iterator OldI;
StringRef NewFilename;
- mutable int NewFD;
- mutable sys::fs::file_status NewStatus;
public:
NewArchiveIterator(object::Archive::child_iterator I, StringRef Name);
object::Archive::child_iterator getOld() const;
StringRef getNew() const;
- int getFD() const;
+ int getFD(sys::fs::file_status &NewStatus) const;
const sys::fs::file_status &getStatus() const;
};
}
: IsNewMember(false), Name(Name), OldI(I) {}
NewArchiveIterator::NewArchiveIterator(StringRef NewFilename, StringRef Name)
- : IsNewMember(true), Name(Name), NewFilename(NewFilename), NewFD(-1) {}
+ : IsNewMember(true), Name(Name), NewFilename(NewFilename) {}
StringRef NewArchiveIterator::getName() const { return Name; }
return NewFilename;
}
-int NewArchiveIterator::getFD() const {
+int NewArchiveIterator::getFD(sys::fs::file_status &NewStatus) const {
assert(IsNewMember);
- if (NewFD != -1)
- return NewFD;
+ int NewFD;
failIfError(sys::fs::openFileForRead(NewFilename, NewFD), NewFilename);
assert(NewFD != -1);
return NewFD;
}
-const sys::fs::file_status &NewArchiveIterator::getStatus() const {
- assert(IsNewMember);
- assert(NewFD != -1 && "Must call getFD first");
- return NewStatus;
-}
-
template <typename T>
void addMember(std::vector<NewArchiveIterator> &Members, T I, StringRef Name,
int Pos = -1) {
std::vector<std::unique_ptr<MemoryBuffer>> Buffers;
std::vector<MemoryBufferRef> Members;
+ std::vector<sys::fs::file_status> NewMemberStatus;
for (unsigned I = 0, N = NewMembers.size(); I < N; ++I) {
NewArchiveIterator &Member = NewMembers[I];
if (Member.isNewMember()) {
StringRef Filename = Member.getNew();
- int FD = Member.getFD();
- const sys::fs::file_status &Status = Member.getStatus();
+ NewMemberStatus.resize(NewMemberStatus.size() + 1);
+ sys::fs::file_status &Status = NewMemberStatus.back();
+ int FD = Member.getFD(Status);
ErrorOr<std::unique_ptr<MemoryBuffer>> MemberBufferOrErr =
MemoryBuffer::getOpenFile(FD, Filename, Status.getSize(), false);
failIfError(MemberBufferOrErr.getError(), Filename);
+ if (close(FD) != 0)
+ fail("Could not close file");
Buffers.push_back(std::move(MemberBufferOrErr.get()));
MemberRef = Buffers.back()->getMemBufferRef();
} else {
unsigned MemberNum = 0;
unsigned LongNameMemberNum = 0;
+ unsigned NewMemberNum = 0;
for (std::vector<NewArchiveIterator>::iterator I = NewMembers.begin(),
E = NewMembers.end();
I != E; ++I, ++MemberNum) {
MemoryBufferRef File = Members[MemberNum];
if (I->isNewMember()) {
StringRef FileName = I->getNew();
- const sys::fs::file_status &Status = I->getStatus();
+ const sys::fs::file_status &Status = NewMemberStatus[NewMemberNum];
+ NewMemberNum++;
StringRef Name = sys::path::filename(FileName);
if (Name.size() < 16)