summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-s-parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r--src/wasm/wasm-s-parser.cpp34
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;