diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-03-02 17:03:16 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-02 14:03:16 -0800 |
| commit | c2653ba1ec8f06453f0653d141bcd348eff5d4a5 (patch) | |
| tree | 85bfafed35844d5d2fe90a93f82eb0254045d416 /source/core/slang-string.cpp | |
| parent | b81e8d4c8b718e97c6d6fc65b09850f19fb80502 (diff) | |
Fix issue with long identifier names in GLSL output (#1731)
* #include an absolute path didn't work - because paths were taken to always be relative.
* First pass at handling 'names' that are too long in GLSL output.
* Test to check functionality with very long func name.
* Add access a long names buffer.
* Fix typo in assert.
Fix issue with coercion error for 1.0f / 0x7fffffff
Co-authored-by: Tim Foley <tfoleyNV@users.noreply.github.com>
Diffstat (limited to 'source/core/slang-string.cpp')
| -rw-r--r-- | source/core/slang-string.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/source/core/slang-string.cpp b/source/core/slang-string.cpp index a7374d8ba..62bc19754 100644 --- a/source/core/slang-string.cpp +++ b/source/core/slang-string.cpp @@ -340,6 +340,51 @@ namespace Slang } } + void String::reduceLength(Index newLength) + { + Index oldLength = getLength(); + SLANG_ASSERT(newLength <= oldLength); + if (oldLength == newLength) + { + return; + } + + // It must have a buffer, because only 0 length allows for nullptr + // and being 0 sized is already covered + SLANG_ASSERT(m_buffer); + + if (m_buffer->isUniquelyReferenced()) + { + m_buffer->length = newLength; + m_buffer->getData()[newLength] = 0; + } + else + { + // If 0 length is wanted we can just free + if (newLength == 0) + { + m_buffer.setNull(); + } + else + { + // We need to make a new copy, that we will shrink + + // We'll just go with capacity enough for the new length + const Index newCapacity = newLength; + StringRepresentation* newRepresentation = StringRepresentation::createWithCapacityAndLength(newCapacity, newLength); + + // Copy + char* dst = newRepresentation->getData(); + memcpy(dst, m_buffer->getData(), sizeof(char) * newLength); + // Zero terminate + dst[newLength] = 0; + + // Set the new rep + m_buffer = newRepresentation; + } + } + } + void String::append(const char* textBegin, char const* textEnd) { auto oldLength = getLength(); |
