From 945d7f58bde660b2523945962ec98aa258137d6f Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 21 Nov 2014 05:15:41 +0000 Subject: [PATCH] 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. llvm-svn: 222505 --- llvm/include/llvm/Support/StreamingMemoryObject.h | 9 ++++--- llvm/unittests/Support/CMakeLists.txt | 1 + llvm/unittests/Support/StreamingMemoryObject.cpp | 30 +++++++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 llvm/unittests/Support/StreamingMemoryObject.cpp diff --git a/llvm/include/llvm/Support/StreamingMemoryObject.h b/llvm/include/llvm/Support/StreamingMemoryObject.h index 6957c6e..66ed521 100644 --- a/llvm/include/llvm/Support/StreamingMemoryObject.h +++ b/llvm/include/llvm/Support/StreamingMemoryObject.h @@ -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; diff --git a/llvm/unittests/Support/CMakeLists.txt b/llvm/unittests/Support/CMakeLists.txt index 7abdd8a..dd270cc 100644 --- a/llvm/unittests/Support/CMakeLists.txt +++ b/llvm/unittests/Support/CMakeLists.txt @@ -32,6 +32,7 @@ add_llvm_unittest(SupportTests ScaledNumberTest.cpp SourceMgrTest.cpp SpecialCaseListTest.cpp + StreamingMemoryObject.cpp StringPool.cpp SwapByteOrderTest.cpp ThreadLocalTest.cpp diff --git a/llvm/unittests/Support/StreamingMemoryObject.cpp b/llvm/unittests/Support/StreamingMemoryObject.cpp new file mode 100644 index 0000000..399501e --- /dev/null +++ b/llvm/unittests/Support/StreamingMemoryObject.cpp @@ -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 + +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)); +} -- 2.7.4