|
@@ -4,6 +4,7 @@
|
|
|
|
|
|
#include "shell/common/heap_snapshot.h"
|
|
|
|
|
|
+#include "base/containers/span.h"
|
|
|
#include "base/files/file.h"
|
|
|
#include "base/memory/raw_ptr.h"
|
|
|
#include "v8/include/v8-profiler.h"
|
|
@@ -24,8 +25,13 @@ class HeapSnapshotOutputStream : public v8::OutputStream {
|
|
|
void EndOfStream() override { is_complete_ = true; }
|
|
|
|
|
|
v8::OutputStream::WriteResult WriteAsciiChunk(char* data, int size) override {
|
|
|
- auto bytes_written = file_->WriteAtCurrentPos(data, size);
|
|
|
- return bytes_written == size ? kContinue : kAbort;
|
|
|
+ const uint8_t* udata = reinterpret_cast<const uint8_t*>(data);
|
|
|
+ const size_t usize = static_cast<size_t>(std::max(0, size));
|
|
|
+ // SAFETY: since WriteAsciiChunk() only gives us data + size, our
|
|
|
+ // UNSAFE_BUFFERS macro call is unavoidable here. It can be removed
|
|
|
+ // if/when v8 changes WriteAsciiChunk() to pass a v8::MemorySpan.
|
|
|
+ const auto data_span = UNSAFE_BUFFERS(base::span(udata, usize));
|
|
|
+ return file_->WriteAtCurrentPosAndCheck(data_span) ? kContinue : kAbort;
|
|
|
}
|
|
|
|
|
|
private:
|