Fix a silly bug in StreamingMemoryObject.cpp.

The logic for detecting EOF was wrong and would fail if we ever requested
more than 16k past the last read position.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222505 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-11-21 05:15:41 +00:00
parent 361eafaffa
commit ed46a2c2aa
3 changed files with 36 additions and 4 deletions

View File

@ -65,19 +65,20 @@ private:
// Most of the requests will be small, but we fetch at kChunkSize bytes
// at a time to avoid making too many potentially expensive GetBytes calls
bool fetchToPos(size_t Pos) const {
if (EOFReached) return Pos < ObjectSize;
if (EOFReached)
return Pos < ObjectSize;
while (Pos >= BytesRead) {
Bytes.resize(BytesRead + BytesSkipped + kChunkSize);
size_t bytes = Streamer->GetBytes(&Bytes[BytesRead + BytesSkipped],
kChunkSize);
BytesRead += bytes;
if (BytesRead <= Pos) { // reached EOF/ran out of bytes
if (bytes != kChunkSize) { // reached EOF/ran out of bytes
ObjectSize = BytesRead;
EOFReached = true;
return false;
break;
}
}
return true;
return Pos < BytesRead;
}
StreamingMemoryObject(const StreamingMemoryObject&) LLVM_DELETED_FUNCTION;

View File

@ -32,6 +32,7 @@ add_llvm_unittest(SupportTests
ScaledNumberTest.cpp
SourceMgrTest.cpp
SpecialCaseListTest.cpp
StreamingMemoryObject.cpp
StringPool.cpp
SwapByteOrderTest.cpp
ThreadLocalTest.cpp

View File

@ -0,0 +1,30 @@
//===- llvm/unittest/Support/StreamingMemoryObject.cpp - unit tests -------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/Support/StreamingMemoryObject.h"
#include "gtest/gtest.h"
#include <string.h>
using namespace llvm;
namespace {
class NullDataStreamer : public DataStreamer {
size_t GetBytes(unsigned char *buf, size_t len) override {
memset(buf, 0, len);
return len;
}
};
}
TEST(StreamingMemoryObject, Test) {
auto *DS = new NullDataStreamer();
StreamingMemoryObject O(DS);
EXPECT_TRUE(O.isValidAddress(32 * 1024));
}