diff options
author | Thomas Lively <tlively@google.com> | 2022-10-11 14:05:16 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-11 12:05:16 -0700 |
commit | ebe30fd682535e43e54d4a76f3ff5f09a6340d3a (patch) | |
tree | a6ab04e97bf7e9b593979ed573dea5be20247b44 /src | |
parent | b83450ed1fd98cec4453024f57f892b31851ea50 (diff) | |
download | binaryen-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-binary.h | 2 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 22 |
2 files changed, 8 insertions, 16 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) { |