summaryrefslogtreecommitdiffstats
path: root/source/compiler-core
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core')
-rw-r--r--source/compiler-core/slang-json-lexer.cpp2
-rw-r--r--source/compiler-core/slang-source-loc.cpp31
2 files changed, 26 insertions, 7 deletions
diff --git a/source/compiler-core/slang-json-lexer.cpp b/source/compiler-core/slang-json-lexer.cpp
index 0476ca37a..a335403e1 100644
--- a/source/compiler-core/slang-json-lexer.cpp
+++ b/source/compiler-core/slang-json-lexer.cpp
@@ -238,7 +238,7 @@ JSONTokenType JSONLexer::advance()
StringBuilder buf;
if (c <= ' ' || c >= 0x7e)
{
- static const char s_hex[] = "012345679abcdef";
+ static const char s_hex[] = "0123456789abcdef";
char hexBuf[5] = "0x";
diff --git a/source/compiler-core/slang-source-loc.cpp b/source/compiler-core/slang-source-loc.cpp
index 872c40f0d..75601b815 100644
--- a/source/compiler-core/slang-source-loc.cpp
+++ b/source/compiler-core/slang-source-loc.cpp
@@ -573,15 +573,34 @@ int SourceFile::calcColumnIndex(int lineIndex, int offset, int tabSize)
void SourceFile::setContents(ISlangBlob* blob)
{
- const UInt contentSize = blob->getBufferSize();
+ const UInt rawContentSize = blob->getBufferSize();
- SLANG_ASSERT(contentSize == m_contentSize);
+ SLANG_ASSERT(rawContentSize == m_contentSize);
- char const* contentBegin = (char const*)blob->getBufferPointer();
- char const* contentEnd = contentBegin + contentSize;
+ Byte* rawContentBegin = (Byte*)blob->getBufferPointer();
- m_contentBlob = blob;
- m_content = UnownedStringSlice(contentBegin, contentEnd);
+ // Query the encoding type and discard the Unicode Byte-Order-Marker before decoding
+ size_t offset;
+ auto type = CharEncoding::determineEncoding(
+ rawContentBegin,
+ rawContentSize,
+ offset);
+ SLANG_ASSERT(rawContentSize >= offset);
+
+ List<char> decodedBuffer;
+ CharEncoding::getEncoding(type)->decode(
+ rawContentBegin + offset,
+ int(rawContentSize - offset),
+ decodedBuffer);
+
+ m_contentBlob = RawBlob::create(decodedBuffer.getBuffer(), decodedBuffer.getCount());
+
+ char const* decodedContentBegin = (char const*)m_contentBlob->getBufferPointer();
+ const UInt decodedContentSize = m_contentBlob->getBufferSize();
+ assert(decodedContentSize <= rawContentSize);
+ char const* decodedContentEnd = decodedContentBegin + decodedContentSize;
+
+ m_content = UnownedStringSlice(decodedContentBegin, decodedContentEnd);
}
void SourceFile::setContents(const String& content)