From b3fea30f84fef3ff7aa77775e00b83ba62d997cc Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Fri, 22 Mar 2024 16:56:33 -0700 Subject: [Strings] Represent string values as WTF-16 internally (#6418) WTF-16, i.e. arbitrary sequences of 16-bit values, is the encoding of Java and JavaScript strings, and using the same encoding makes the interpretation of string operations trivial, even when accounting for non-ascii characters. Specifically, use little-endian WTF-16. Re-encode string constants from WTF-8 to WTF-16 in the parsers, then back to WTF-8 in the writers. Update the constructor for string `Literal`s to interpret the string as WTF-16 and store a sequence of WTF-16 code units, i.e. 16-bit integers. Update `Builder::makeConstantExpression` accordingly to convert from the new `Literal` string representation back to a WTF-16 string. Update the interpreter to remove the logic for detecting non-ascii characters and bailing out. The naive implementations of all the string operations are correct now that our string encoding matches the JS string encoding. --- src/parser/contexts.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/parser/contexts.h') 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 { Result<> makeStringConst(Index pos, const std::vector& 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, -- cgit v1.2.3