diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2022-05-27 17:28:05 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-27 17:28:05 -0400 |
| commit | 2d3392f22c894957d17dd13486e0565c4ecea89c (patch) | |
| tree | ce4dadbd85a59e52725fa6f92613553cd5b29859 /source/slang/slang-ir.cpp | |
| parent | abb89b3e460e11e8f9a134199c2d559190bfc47e (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.cpp | 103 |
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( |
