summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2022-10-11 14:05:16 -0500
committerGitHub <noreply@github.com>2022-10-11 12:05:16 -0700
commitebe30fd682535e43e54d4a76f3ff5f09a6340d3a (patch)
treea6ab04e97bf7e9b593979ed573dea5be20247b44
parentb83450ed1fd98cec4453024f57f892b31851ea50 (diff)
downloadbinaryen-ebe30fd682535e43e54d4a76f3ff5f09a6340d3a.tar.gz
binaryen-ebe30fd682535e43e54d4a76f3ff5f09a6340d3a.tar.bz2
binaryen-ebe30fd682535e43e54d4a76f3ff5f09a6340d3a.zip
Support null characters in string.const expressions (#5123)
Remove an obsolete error about null characters and test both binary and text round tripping of a string constant containing an escaped zero byte.
-rw-r--r--src/wasm-binary.h2
-rw-r--r--src/wasm/wasm-binary.cpp22
-rw-r--r--test/lit/strings.wast10
3 files changed, 15 insertions, 19 deletions
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index bbcfeda53..e85d67be2 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -1451,7 +1451,7 @@ public:
bool more() { return pos < input.size(); }
- std::pair<const char*, const char*> getByteView(size_t size);
+ std::string_view getByteView(size_t size);
uint8_t getInt8();
uint16_t getInt16();
uint32_t getInt32();
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index b9b8558bb..364942a56 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -1736,17 +1736,16 @@ void WasmBinaryBuilder::readUserSection(size_t payloadLen) {
auto& section = wasm.userSections.back();
section.name = sectionName.str;
auto data = getByteView(payloadLen);
- section.data = {data.first, data.second};
+ section.data = {data.begin(), data.end()};
}
}
-std::pair<const char*, const char*>
-WasmBinaryBuilder::getByteView(size_t size) {
+std::string_view WasmBinaryBuilder::getByteView(size_t size) {
if (size > input.size() || pos > input.size() - size) {
throwError("unexpected end of input");
}
pos += size;
- return {input.data() + (pos - size), input.data() + pos};
+ return {input.data() + (pos - size), size};
}
uint8_t WasmBinaryBuilder::getInt8() {
@@ -2023,17 +2022,10 @@ Type WasmBinaryBuilder::getConcreteType() {
Name WasmBinaryBuilder::getInlineString() {
BYN_TRACE("<==\n");
auto len = getU32LEB();
-
auto data = getByteView(len);
- std::string str(data.first, data.second);
- if (str.find('\0') != std::string::npos) {
- throwError(
- "inline string contains NULL (0). that is technically valid in wasm, "
- "but you shouldn't do it, and it's not supported in binaryen");
- }
- BYN_TRACE("getInlineString: " << str << " ==>\n");
- return Name(str);
+ BYN_TRACE("getInlineString: " << data << " ==>\n");
+ return Name(data);
}
void WasmBinaryBuilder::verifyInt8(int8_t x) {
@@ -3129,7 +3121,7 @@ void WasmBinaryBuilder::readDataSegments() {
}
auto size = getU32LEB();
auto data = getByteView(size);
- curr->data = {data.first, data.second};
+ curr->data = {data.begin(), data.end()};
wasm.addDataSegment(std::move(curr));
}
}
@@ -3662,7 +3654,7 @@ void WasmBinaryBuilder::readDylink0(size_t payloadLen) {
pos = oldPos;
size_t remaining = (sectionPos + payloadLen) - pos;
auto tail = getByteView(remaining);
- wasm.dylinkSection->tail = {tail.first, tail.second};
+ wasm.dylinkSection->tail = {tail.begin(), tail.end()};
break;
}
if (pos != subsectionPos + subsectionSize) {
diff --git a/test/lit/strings.wast b/test/lit/strings.wast
index c950e914b..6b55f2863 100644
--- a/test/lit/strings.wast
+++ b/test/lit/strings.wast
@@ -5,7 +5,11 @@
;; runs --precompute in order to verify no problems occur in the optimizer's
;; invocation of the interpreter.
-;; RUN: foreach %s %t wasm-opt --enable-strings --enable-reference-types --enable-gc --roundtrip --precompute -S -o - | filecheck %s
+;; RUN: wasm-opt %s --enable-strings --enable-reference-types --enable-gc --roundtrip --precompute -S -o - | filecheck %s
+
+;; Check that we can roundtrip through the text format as well.
+
+;; RUN: wasm-opt %s -all -S -o - | wasm-opt -all --precompute -S -o - | filecheck %s
(module
(memory 10 10)
@@ -31,8 +35,8 @@
;; CHECK: (type $stringref_ref|$array|_ref|$array16|_=>_none (func (param stringref (ref $array) (ref $array16))))
- ;; CHECK: (global $string-const stringref (string.const "string in a global \01\ff\t\t\n\n\r\r\"\"\'\'\\\\"))
- (global $string-const stringref (string.const "string in a global \01\ff\t\09\n\0a\r\0d\"\22\'\27\\\5c"))
+ ;; CHECK: (global $string-const stringref (string.const "string in a global \01\ff\00\t\t\n\n\r\r\"\"\'\'\\\\"))
+ (global $string-const stringref (string.const "string in a global \01\ff\00\t\09\n\0a\r\0d\"\22\'\27\\\5c"))
;; CHECK: (memory $0 10 10)