summaryrefslogtreecommitdiffstats
path: root/source/core/slang-string.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2021-03-02 17:03:16 -0500
committerGitHub <noreply@github.com>2021-03-02 14:03:16 -0800
commitc2653ba1ec8f06453f0653d141bcd348eff5d4a5 (patch)
tree85bfafed35844d5d2fe90a93f82eb0254045d416 /source/core/slang-string.cpp
parentb81e8d4c8b718e97c6d6fc65b09850f19fb80502 (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.cpp45
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();