summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm/wasm-binary.cpp19
-rw-r--r--test/gtest/CMakeLists.txt1
-rw-r--r--test/gtest/binary-reader.cpp63
3 files changed, 77 insertions, 6 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 779f1fd6f..574e13aa2 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -2941,13 +2941,20 @@ void WasmBinaryReader::readSourceMapHeader() {
// investigation (if it does, it will assert in readBase64VLQ, so it
// would not be a silent error at least).
uint32_t position = readBase64VLQ(*sourceMap);
- uint32_t fileIndex = readBase64VLQ(*sourceMap);
- uint32_t lineNumber =
- readBase64VLQ(*sourceMap) + 1; // adjust zero-based line number
- uint32_t columnNumber = readBase64VLQ(*sourceMap);
nextDebugPos = position;
- nextDebugLocation = {fileIndex, lineNumber, columnNumber};
- nextDebugLocationHasDebugInfo = true;
+
+ auto peek = sourceMap->peek();
+ if (peek == ',' || peek == '\"') {
+ // This is a 1-length entry, so the next location has no debug info.
+ nextDebugLocationHasDebugInfo = false;
+ } else {
+ uint32_t fileIndex = readBase64VLQ(*sourceMap);
+ uint32_t lineNumber =
+ readBase64VLQ(*sourceMap) + 1; // adjust zero-based line number
+ uint32_t columnNumber = readBase64VLQ(*sourceMap);
+ nextDebugLocation = {fileIndex, lineNumber, columnNumber};
+ nextDebugLocationHasDebugInfo = true;
+ }
}
void WasmBinaryReader::readNextDebugLocation() {
diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt
index e8eec3f1d..17e880a4e 100644
--- a/test/gtest/CMakeLists.txt
+++ b/test/gtest/CMakeLists.txt
@@ -2,6 +2,7 @@ include_directories(../../third_party/googletest/googletest/include)
include_directories(../../src/wasm)
set(unittest_SOURCES
+ binary-reader.cpp
cfg.cpp
dfa_minimization.cpp
disjoint_sets.cpp
diff --git a/test/gtest/binary-reader.cpp b/test/gtest/binary-reader.cpp
new file mode 100644
index 000000000..b73fe55bd
--- /dev/null
+++ b/test/gtest/binary-reader.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2024 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "parser/wat-parser.h"
+#include "print-test.h"
+#include "wasm-binary.h"
+#include "gtest/gtest.h"
+
+using namespace wasm;
+
+using BinaryReaderTest = PrintTest;
+
+// Check that debug location parsers can handle single-segment mappings.
+TEST_F(BinaryReaderTest, SourceMappingSingleSegment) {
+ auto moduleText = "(module)";
+ Module module;
+ parseWast(module, moduleText);
+
+ BufferWithRandomAccess buffer;
+ WasmBinaryWriter(&module, buffer, PassOptions());
+ auto moduleBytes = buffer.getAsChars();
+
+ // A single-segment mapping starting at offset 0.
+ std::string sourceMap = R"(
+ {
+ "version": 3,
+ "sources": [],
+ "names": [],
+ "mappings": "A"
+ }
+ )";
+ std::stringstream sourceMapStream(sourceMap);
+
+ // Test `readSourceMapHeader` (only check for errors, as there is no mapping
+ // to print).
+ {
+ Module module;
+ WasmBinaryReader binaryReader(module, FeatureSet::All, moduleBytes);
+ binaryReader.setDebugLocations(&sourceMapStream);
+ binaryReader.readSourceMapHeader();
+ }
+
+ // Test `readNextDebugLocation`.
+ {
+ Module module;
+ WasmBinaryReader binaryReader(module, FeatureSet::All, moduleBytes);
+ binaryReader.setDebugLocations(&sourceMapStream);
+ binaryReader.readNextDebugLocation();
+ }
+}