diff options
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index d48e48585..ef41dec93 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -3049,7 +3049,17 @@ Expression* SExpressionWasmBuilder::makeStringNew(Element& s, StringNewOp op) { } Expression* SExpressionWasmBuilder::makeStringConst(Element& s) { - return Builder(wasm).makeStringConst(s[1]->str()); + Name rawStr = s[1]->str(); + size_t len = rawStr.size(); + std::vector<char> data; + stringToBinary(rawStr.c_str(), len, data); + data.push_back('\0'); + Name str = data.empty() ? "" : &data[0]; + if (str.size() != data.size() - 1) { + throw ParseException( + "zero bytes not yet supported in string constants", s.line, s.col); + } + return Builder(wasm).makeStringConst(str); } Expression* SExpressionWasmBuilder::makeStringMeasure(Element& s, @@ -3157,7 +3167,19 @@ void SExpressionWasmBuilder::stringToBinary(const char* input, break; } if (input[0] == '\\') { - if (input[1] == '"') { + if (input[1] == 't') { + *write++ = '\t'; + input += 2; + continue; + } else if (input[1] == 'n') { + *write++ = '\n'; + input += 2; + continue; + } else if (input[1] == 'r') { + *write++ = '\r'; + input += 2; + continue; + } else if (input[1] == '"') { *write++ = '"'; input += 2; continue; @@ -3169,14 +3191,6 @@ void SExpressionWasmBuilder::stringToBinary(const char* input, *write++ = '\\'; input += 2; continue; - } else if (input[1] == 'n') { - *write++ = '\n'; - input += 2; - continue; - } else if (input[1] == 't') { - *write++ = '\t'; - input += 2; - continue; } else { *write++ = (char)(unhex(input[1]) * 16 + unhex(input[2])); input += 3; |