summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2022-05-27 17:28:05 -0400
committerGitHub <noreply@github.com>2022-05-27 17:28:05 -0400
commit2d3392f22c894957d17dd13486e0565c4ecea89c (patch)
treece4dadbd85a59e52725fa6f92613553cd5b29859 /source/slang/slang-ir.cpp
parentabb89b3e460e11e8f9a134199c2d559190bfc47e (diff)
Added NativeStringType (#2252)
* #include an absolute path didn't work - because paths were taken to always be relative. * Use TerminatedUnownedStringSlice for literals in output C++. * Remove Escape/Unescape functions used in slang-token-reader.cpp Add target type of 'host-cpp' etc to map to the target types. * Fix some corner cases around string encoding. * Added unit test for string escaping. Fixed some assorted escaping bugs. * Updated test output. * Added decode test. * Stop using hex output, to get around 'greedy' aspect. Use octal instead.
Diffstat (limited to 'source/slang/slang-ir.cpp')
-rw-r--r--source/slang/slang-ir.cpp103
1 files changed, 8 insertions, 95 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp
index 9de2f5b4f..d454333e6 100644
--- a/source/slang/slang-ir.cpp
+++ b/source/slang/slang-ir.cpp
@@ -2508,6 +2508,12 @@ namespace Slang
return (IRStringType*)getType(kIROp_StringType);
}
+ IRNativeStringType* IRBuilder::getNativeStringType()
+ {
+ return (IRNativeStringType*)getType(kIROp_NativeStringType);
+ }
+
+
IRType* IRBuilder::getCapabilitySetType()
{
return getType(kIROp_CapabilitySetType);
@@ -4676,106 +4682,13 @@ namespace Slang
dumpDebugID(context, inst);
}
- struct StringEncoder
- {
- static char getHexChar(int v)
- {
- return (v <= 9) ? char(v + '0') : char(v - 10 + 'A');
- }
-
- void flush(const char* pos)
- {
- if (pos > m_runStart)
- {
- m_builder->append(m_runStart, pos);
- }
- m_runStart = pos + 1;
- }
-
- void appendEscapedChar(const char* pos, char encodeChar)
- {
- flush(pos);
- const char chars[] = { '\\', encodeChar };
- m_builder->Append(chars, 2);
- }
-
- void appendAsHex(const char* pos)
- {
- flush(pos);
-
- const int v = *(const uint8_t*)pos;
-
- char buf[5];
- buf[0] = '\\';
- buf[1] = 'x';
- buf[2] = '0';
-
- buf[3] = getHexChar(v >> 4);
- buf[4] = getHexChar(v & 0xf);
-
- m_builder->Append(buf, 5);
- }
-
- StringEncoder(StringBuilder* builder, const char* start):
- m_runStart(start),
- m_builder(builder)
- {}
-
- StringBuilder* m_builder;
- const char* m_runStart;
- };
-
static void dumpEncodeString(
IRDumpContext* context,
const UnownedStringSlice& slice)
{
- // https://msdn.microsoft.com/en-us/library/69ze775t.aspx
-
+ auto handler = StringEscapeUtil::getHandler(StringEscapeUtil::Style::Slang);
StringBuilder& builder = *context->builder;
- builder.Append('"');
-
- {
- const char* cur = slice.begin();
- StringEncoder encoder(&builder, cur);
- const char* end = slice.end();
-
- for (; cur < end; cur++)
- {
- const int8_t c = uint8_t(*cur);
- switch (c)
- {
- case '\\':
- encoder.appendEscapedChar(cur, '\\');
- break;
- case '"':
- encoder.appendEscapedChar(cur, '"');
- break;
- case '\n':
- encoder.appendEscapedChar(cur, 'n');
- break;
- case '\t':
- encoder.appendEscapedChar(cur, 't');
- break;
- case '\r':
- encoder.appendEscapedChar(cur, 'r');
- break;
- case '\0':
- encoder.appendEscapedChar(cur, '0');
- break;
- default:
- {
- if (c < 32)
- {
- encoder.appendAsHex(cur);
- }
- break;
- }
- }
- }
- encoder.flush(end);
- }
-
- builder.Append('"');
+ StringEscapeUtil::appendQuoted(handler, slice, builder);
}
static void dumpType(