diff options
Diffstat (limited to 'src/parser')
-rw-r--r-- | src/parser/contexts.h | 9 | ||||
-rw-r--r-- | src/parser/lexer.cpp | 21 |
2 files changed, 10 insertions, 20 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h index 8b59ab40b..0979461a0 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -22,6 +22,7 @@ #include "lexer.h" #include "support/name.h" #include "support/result.h" +#include "support/string.h" #include "wasm-builder.h" #include "wasm-ir-builder.h" #include "wasm.h" @@ -2491,7 +2492,13 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { Result<> makeStringConst(Index pos, const std::vector<Annotation>& annotations, std::string_view str) { - return withLoc(pos, irBuilder.makeStringConst(Name(str))); + // Re-encode from WTF-8 to WTF-16. + std::stringstream wtf16; + if (!String::convertWTF8ToWTF16(wtf16, str)) { + return in.err(pos, "invalid string constant"); + } + // TODO: Use wtf16.view() once we have C++20. + return withLoc(pos, irBuilder.makeStringConst(wtf16.str())); } Result<> makeStringMeasure(Index pos, diff --git a/src/parser/lexer.cpp b/src/parser/lexer.cpp index 8c7542dd7..48da163e1 100644 --- a/src/parser/lexer.cpp +++ b/src/parser/lexer.cpp @@ -23,6 +23,7 @@ #include <variant> #include "lexer.h" +#include "support/string.h" using namespace std::string_view_literals; @@ -308,25 +309,7 @@ public: if ((0xd800 <= u && u < 0xe000) || 0x110000 <= u) { return false; } - if (u < 0x80) { - // 0xxxxxxx - *escapeBuilder << uint8_t(u); - } else if (u < 0x800) { - // 110xxxxx 10xxxxxx - *escapeBuilder << uint8_t(0b11000000 | ((u >> 6) & 0b00011111)); - *escapeBuilder << uint8_t(0b10000000 | ((u >> 0) & 0b00111111)); - } else if (u < 0x10000) { - // 1110xxxx 10xxxxxx 10xxxxxx - *escapeBuilder << uint8_t(0b11100000 | ((u >> 12) & 0b00001111)); - *escapeBuilder << uint8_t(0b10000000 | ((u >> 6) & 0b00111111)); - *escapeBuilder << uint8_t(0b10000000 | ((u >> 0) & 0b00111111)); - } else { - // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - *escapeBuilder << uint8_t(0b11110000 | ((u >> 18) & 0b00000111)); - *escapeBuilder << uint8_t(0b10000000 | ((u >> 12) & 0b00111111)); - *escapeBuilder << uint8_t(0b10000000 | ((u >> 6) & 0b00111111)); - *escapeBuilder << uint8_t(0b10000000 | ((u >> 0) & 0b00111111)); - } + String::writeWTF8CodePoint(*escapeBuilder, u); return true; } }; |