diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2020-11-20 17:24:35 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-20 17:24:35 -0500 |
| commit | c0fab438a565cb2134679af8830d11644668d6a2 (patch) | |
| tree | 3eeccfd634c2853467f42abe51a0d7008dbb93a2 /source/core | |
| parent | ee5842a01cdb2bd6cd4acee7214666f180b95d84 (diff) | |
Bug fixes: Memory leak/off by one on UIntSet (#1616)
* #include an absolute path didn't work - because paths were taken to always be relative.
* Fix memory leak on ScopedAllocation.
Fix off by one bug on UIntSet
Diffstat (limited to 'source/core')
| -rw-r--r-- | source/core/slang-blob.h | 30 | ||||
| -rw-r--r-- | source/core/slang-uint-set.cpp | 15 | ||||
| -rw-r--r-- | source/core/slang-uint-set.h | 5 |
3 files changed, 49 insertions, 1 deletions
diff --git a/source/core/slang-blob.h b/source/core/slang-blob.h index 8bf02512d..d326f9c9c 100644 --- a/source/core/slang-blob.h +++ b/source/core/slang-blob.h @@ -109,17 +109,41 @@ public: m_sizeInBytes = size; } + void* set(const void* data, size_t size) + { + void* dst = allocate(size); + if (dst) + { + memcpy(dst, data, size); + } + return dst; + } + /// Get the allocated data. Returns nullptr if there is no allocated data void* getData() const { return m_data; } /// Get the size of the allocated data. size_t getSizeInBytes() const { return m_sizeInBytes; } + void swap(ThisType& rhs) + { + void*const data = m_data; + const size_t sizeInBytes = m_sizeInBytes; + + m_data = rhs.m_data; + m_sizeInBytes = rhs.m_sizeInBytes; + + rhs.m_data = data; + rhs.m_sizeInBytes = sizeInBytes; + } + ScopedAllocation() : m_data(nullptr), m_sizeInBytes(0) { } + ~ScopedAllocation() { deallocate(); } + private: // disable ScopedAllocation(const ThisType& rhs) = delete; @@ -153,6 +177,12 @@ public: blob->m_data.attach(data, dataCount); return blob; } + static RefPtr<RawBlob> moveCreate(ScopedAllocation& alloc) + { + RawBlob* blob = new RawBlob; + blob->m_data.swap(alloc); + return blob; + } protected: RawBlob() = default; diff --git a/source/core/slang-uint-set.cpp b/source/core/slang-uint-set.cpp index 3ac1c530a..02e142706 100644 --- a/source/core/slang-uint-set.cpp +++ b/source/core/slang-uint-set.cpp @@ -64,6 +64,21 @@ void UIntSet::clear() ::memset(m_buffer.getBuffer(), 0, m_buffer.getCount() * sizeof(Element)); } +bool UIntSet::isEmpty() const +{ + const Element*const src = m_buffer.getBuffer(); + const Index count = m_buffer.getCount(); + + for (Index i = 0; i < count; ++i) + { + if (src[i]) + { + return false; + } + } + return true; +} + void UIntSet::clearAndDeallocate() { m_buffer.clearAndDeallocate(); diff --git a/source/core/slang-uint-set.h b/source/core/slang-uint-set.h index 7833ffa25..f89f37df2 100644 --- a/source/core/slang-uint-set.h +++ b/source/core/slang-uint-set.h @@ -61,6 +61,9 @@ public: /// Store the intersection between this and set in this void intersectWith(const UIntSet& set); + /// + bool isEmpty() const; + /// Store the union of set1 and set2 in outRs static void calcUnion(UIntSet& outRs, const UIntSet& set1, const UIntSet& set2); /// Store the intersection of set1 and set2 in outRs @@ -99,7 +102,7 @@ inline void UIntSet::remove(UInt val) inline bool UIntSet::contains(UInt val) const { const Index idx = Index(val >> kElementShift); - return idx <= m_buffer.getCount() && + return idx < m_buffer.getCount() && ((m_buffer[idx] & (Element(1) << (val & kElementMask))) != 0); } |
