| Index: src/parsing/scanner-character-streams.cc
|
| diff --git a/src/parsing/scanner-character-streams.cc b/src/parsing/scanner-character-streams.cc
|
| index 7ebf2fe724cc8409d9fa530e74f9e7c55e6ca327..b5e9c171da0561ee81dcdd5be0a388cce419c883 100644
|
| --- a/src/parsing/scanner-character-streams.cc
|
| +++ b/src/parsing/scanner-character-streams.cc
|
| @@ -5,6 +5,7 @@
|
| #include "src/parsing/scanner-character-streams.h"
|
|
|
| #include "include/v8.h"
|
| +#include "src/counters.h"
|
| #include "src/globals.h"
|
| #include "src/handles.h"
|
| #include "src/objects-inl.h"
|
| @@ -190,9 +191,11 @@ size_t ExternalOneByteStringUtf16CharacterStream::FillBuffer(size_t from_pos) {
|
| class Utf8ExternalStreamingStream : public BufferedUtf16CharacterStream {
|
| public:
|
| Utf8ExternalStreamingStream(
|
| - ScriptCompiler::ExternalSourceStream* source_stream)
|
| + ScriptCompiler::ExternalSourceStream* source_stream,
|
| + RuntimeCallStats* stats)
|
| : current_({0, {0, 0, unibrow::Utf8::Utf8IncrementalBuffer(0)}}),
|
| - source_stream_(source_stream) {}
|
| + source_stream_(source_stream),
|
| + stats_(stats) {}
|
| ~Utf8ExternalStreamingStream() override {
|
| for (size_t i = 0; i < chunks_.size(); i++) delete[] chunks_[i].data;
|
| }
|
| @@ -241,6 +244,7 @@ class Utf8ExternalStreamingStream : public BufferedUtf16CharacterStream {
|
| std::vector<Chunk> chunks_;
|
| Position current_;
|
| ScriptCompiler::ExternalSourceStream* source_stream_;
|
| + RuntimeCallStats* stats_;
|
| };
|
|
|
| bool Utf8ExternalStreamingStream::SkipToPosition(size_t position) {
|
| @@ -331,6 +335,7 @@ void Utf8ExternalStreamingStream::FillBufferFromCurrentChunk() {
|
| }
|
|
|
| bool Utf8ExternalStreamingStream::FetchChunk() {
|
| + RuntimeCallTimerScope scope(stats_, &RuntimeCallStats::GetMoreDataCallback);
|
| DCHECK_EQ(current_.chunk_no, chunks_.size());
|
| DCHECK(chunks_.empty() || chunks_.back().length != 0);
|
|
|
| @@ -462,20 +467,23 @@ void DeleteChunks(Chunks& chunks) {
|
| // Return the chunk index for the chunk containing position.
|
| // If position is behind the end of the stream, the index of the last,
|
| // zero-length chunk is returned.
|
| -size_t FindChunk(Chunks& chunks, ScriptCompiler::ExternalSourceStream* source_,
|
| - size_t position) {
|
| +size_t FindChunk(Chunks& chunks, ScriptCompiler::ExternalSourceStream* source,
|
| + size_t position, RuntimeCallStats* stats) {
|
| size_t end_pos =
|
| chunks.empty() ? 0 : (chunks.back().byte_pos + chunks.back().byte_length);
|
|
|
| // Get more data if needed. We usually won't enter the loop body.
|
| bool out_of_data = !chunks.empty() && chunks.back().byte_length == 0;
|
| - while (!out_of_data && end_pos <= position + 1) {
|
| - const uint8_t* chunk = nullptr;
|
| - size_t len = source_->GetMoreData(&chunk);
|
| -
|
| - chunks.push_back({chunk, len, end_pos});
|
| - end_pos += len;
|
| - out_of_data = (len == 0);
|
| + {
|
| + RuntimeCallTimerScope scope(stats, &RuntimeCallStats::GetMoreDataCallback);
|
| + while (!out_of_data && end_pos <= position + 1) {
|
| + const uint8_t* chunk = nullptr;
|
| + size_t len = source->GetMoreData(&chunk);
|
| +
|
| + chunks.push_back({chunk, len, end_pos});
|
| + end_pos += len;
|
| + out_of_data = (len == 0);
|
| + }
|
| }
|
|
|
| // Here, we should always have at least one chunk, and we either have the
|
| @@ -516,8 +524,8 @@ size_t FindChunk(Chunks& chunks, ScriptCompiler::ExternalSourceStream* source_,
|
| class OneByteExternalStreamingStream : public BufferedUtf16CharacterStream {
|
| public:
|
| explicit OneByteExternalStreamingStream(
|
| - ScriptCompiler::ExternalSourceStream* source)
|
| - : source_(source) {}
|
| + ScriptCompiler::ExternalSourceStream* source, RuntimeCallStats* stats)
|
| + : source_(source), stats_(stats) {}
|
| ~OneByteExternalStreamingStream() override { DeleteChunks(chunks_); }
|
|
|
| protected:
|
| @@ -526,10 +534,11 @@ class OneByteExternalStreamingStream : public BufferedUtf16CharacterStream {
|
| private:
|
| Chunks chunks_;
|
| ScriptCompiler::ExternalSourceStream* source_;
|
| + RuntimeCallStats* stats_;
|
| };
|
|
|
| size_t OneByteExternalStreamingStream::FillBuffer(size_t position) {
|
| - const Chunk& chunk = chunks_[FindChunk(chunks_, source_, position)];
|
| + const Chunk& chunk = chunks_[FindChunk(chunks_, source_, position, stats_)];
|
| if (chunk.byte_length == 0) return 0;
|
|
|
| size_t start_pos = position - chunk.byte_pos;
|
| @@ -550,7 +559,7 @@ size_t OneByteExternalStreamingStream::FillBuffer(size_t position) {
|
| class TwoByteExternalStreamingStream : public Utf16CharacterStream {
|
| public:
|
| explicit TwoByteExternalStreamingStream(
|
| - ScriptCompiler::ExternalSourceStream* source);
|
| + ScriptCompiler::ExternalSourceStream* source, RuntimeCallStats* stats);
|
| ~TwoByteExternalStreamingStream() override;
|
|
|
| protected:
|
| @@ -558,14 +567,16 @@ class TwoByteExternalStreamingStream : public Utf16CharacterStream {
|
|
|
| Chunks chunks_;
|
| ScriptCompiler::ExternalSourceStream* source_;
|
| + RuntimeCallStats* stats_;
|
| uc16 one_char_buffer_;
|
| };
|
|
|
| TwoByteExternalStreamingStream::TwoByteExternalStreamingStream(
|
| - ScriptCompiler::ExternalSourceStream* source)
|
| + ScriptCompiler::ExternalSourceStream* source, RuntimeCallStats* stats)
|
| : Utf16CharacterStream(&one_char_buffer_, &one_char_buffer_,
|
| &one_char_buffer_, 0),
|
| source_(source),
|
| + stats_(stats),
|
| one_char_buffer_(0) {}
|
|
|
| TwoByteExternalStreamingStream::~TwoByteExternalStreamingStream() {
|
| @@ -577,7 +588,7 @@ bool TwoByteExternalStreamingStream::ReadBlock() {
|
|
|
| // We'll search for the 2nd byte of our character, to make sure we
|
| // have enough data for at least one character.
|
| - size_t chunk_no = FindChunk(chunks_, source_, 2 * position + 1);
|
| + size_t chunk_no = FindChunk(chunks_, source_, 2 * position + 1, stats_);
|
|
|
| // Out of data? Return 0.
|
| if (chunks_[chunk_no].byte_length == 0) {
|
| @@ -645,7 +656,7 @@ bool TwoByteExternalStreamingStream::ReadBlock() {
|
| class TwoByteExternalBufferedStream : public Utf16CharacterStream {
|
| public:
|
| explicit TwoByteExternalBufferedStream(
|
| - ScriptCompiler::ExternalSourceStream* source);
|
| + ScriptCompiler::ExternalSourceStream* source, RuntimeCallStats* stats);
|
| ~TwoByteExternalBufferedStream();
|
|
|
| protected:
|
| @@ -663,11 +674,14 @@ class TwoByteExternalBufferedStream : public Utf16CharacterStream {
|
|
|
| Chunks chunks_;
|
| ScriptCompiler::ExternalSourceStream* source_;
|
| + RuntimeCallStats* stats_;
|
| };
|
|
|
| TwoByteExternalBufferedStream::TwoByteExternalBufferedStream(
|
| - ScriptCompiler::ExternalSourceStream* source)
|
| - : Utf16CharacterStream(buffer_, buffer_, buffer_, 0), source_(source) {}
|
| + ScriptCompiler::ExternalSourceStream* source, RuntimeCallStats* stats)
|
| + : Utf16CharacterStream(buffer_, buffer_, buffer_, 0),
|
| + source_(source),
|
| + stats_(stats) {}
|
|
|
| TwoByteExternalBufferedStream::~TwoByteExternalBufferedStream() {
|
| DeleteChunks(chunks_);
|
| @@ -676,7 +690,7 @@ TwoByteExternalBufferedStream::~TwoByteExternalBufferedStream() {
|
| bool TwoByteExternalBufferedStream::ReadBlock() {
|
| size_t position = pos();
|
| // Find chunk in which the position belongs
|
| - size_t chunk_no = FindChunk(chunks_, source_, 2 * position + 1);
|
| + size_t chunk_no = FindChunk(chunks_, source_, 2 * position + 1, stats_);
|
|
|
| // Out of data? Return 0.
|
| if (chunks_[chunk_no].byte_length == 0) {
|
| @@ -722,7 +736,7 @@ size_t TwoByteExternalBufferedStream::FillBuffer(size_t position,
|
| {
|
| size_t new_pos = position / kBufferSize * kBufferSize;
|
| if (new_pos != position) {
|
| - chunk_no = FindChunk(chunks_, source_, 2 * new_pos + 1);
|
| + chunk_no = FindChunk(chunks_, source_, 2 * new_pos + 1, stats_);
|
| buffer_pos_ = new_pos;
|
| buffer_cursor_ = buffer_start_ + (position - buffer_pos_);
|
| position = new_pos;
|
| @@ -764,7 +778,7 @@ size_t TwoByteExternalBufferedStream::FillBuffer(size_t position,
|
| totalLength += bytes_to_move;
|
| position = (current->byte_pos + current->byte_length) / 2;
|
| if (position - buffer_pos_ < kBufferSize) {
|
| - chunk_no = FindChunk(chunks_, source_, 2 * position + 1);
|
| + chunk_no = FindChunk(chunks_, source_, 2 * position + 1, stats_);
|
| current = &chunks_[chunk_no];
|
| odd_start = current->byte_pos % 2;
|
| bytes_to_move = i::Min(2 * kBufferSize - totalLength, current->byte_length);
|
| @@ -777,7 +791,7 @@ size_t TwoByteExternalBufferedStream::FillBuffer(size_t position,
|
| current->data, bytes_to_move);
|
| totalLength += bytes_to_move;
|
| position = (current->byte_pos + current->byte_length) / 2;
|
| - chunk_no = FindChunk(chunks_, source_, 2 * position + 1);
|
| + chunk_no = FindChunk(chunks_, source_, 2 * position + 1, stats_);
|
| current = &chunks_[chunk_no];
|
| odd_start = current->byte_pos % 2;
|
| bytes_to_move =
|
| @@ -824,18 +838,19 @@ std::unique_ptr<Utf16CharacterStream> ScannerStream::ForTesting(
|
|
|
| Utf16CharacterStream* ScannerStream::For(
|
| ScriptCompiler::ExternalSourceStream* source_stream,
|
| - v8::ScriptCompiler::StreamedSource::Encoding encoding) {
|
| + v8::ScriptCompiler::StreamedSource::Encoding encoding,
|
| + RuntimeCallStats* stats) {
|
| switch (encoding) {
|
| case v8::ScriptCompiler::StreamedSource::TWO_BYTE:
|
| #if !(V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64)
|
| - return new TwoByteExternalStreamingStream(source_stream);
|
| + return new TwoByteExternalStreamingStream(source_stream, stats);
|
| #else
|
| - return new TwoByteExternalBufferedStream(source_stream);
|
| + return new TwoByteExternalBufferedStream(source_stream, stats);
|
| #endif
|
| case v8::ScriptCompiler::StreamedSource::ONE_BYTE:
|
| - return new OneByteExternalStreamingStream(source_stream);
|
| + return new OneByteExternalStreamingStream(source_stream, stats);
|
| case v8::ScriptCompiler::StreamedSource::UTF8:
|
| - return new Utf8ExternalStreamingStream(source_stream);
|
| + return new Utf8ExternalStreamingStream(source_stream, stats);
|
| }
|
| UNREACHABLE();
|
| return nullptr;
|
|
|