Index: src/parsing/scanner-character-streams.cc |
diff --git a/src/parsing/scanner-character-streams.cc b/src/parsing/scanner-character-streams.cc |
index 48513c9983a95972f7c7475a81ccb96eaefb36fd..5eed2db34fc92e5e8fbfe6f06f62ab147de6ef3b 100644 |
--- a/src/parsing/scanner-character-streams.cc |
+++ b/src/parsing/scanner-character-streams.cc |
@@ -537,7 +537,7 @@ size_t OneByteExternalStreamingStream::FillBuffer(size_t position) { |
return len; |
} |
-#if !(V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_ARM) |
+#if !(V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64) |
// ---------------------------------------------------------------------------- |
// TwoByteExternalStreamingStream |
// |
@@ -703,6 +703,7 @@ bool TwoByteExternalBufferedStream::ReadBlock() { |
DCHECK_EQ(position, pos()); |
return true; |
} else { |
+ buffer_start_ = buffer_; |
buffer_pos_ = position; |
buffer_cursor_ = buffer_; |
buffer_end_ = buffer_ + FillBuffer(position, chunk_no); |
@@ -714,6 +715,8 @@ bool TwoByteExternalBufferedStream::ReadBlock() { |
size_t TwoByteExternalBufferedStream::FillBuffer(size_t position, |
size_t chunk_no) { |
+ DCHECK_EQ(chunks_[chunk_no].byte_pos % 2, 1); |
+ bool odd_start = true; |
// Align buffer_pos_ to the size of the buffer. |
{ |
size_t new_pos = position / kBufferSize * kBufferSize; |
@@ -722,6 +725,7 @@ size_t TwoByteExternalBufferedStream::FillBuffer(size_t position, |
buffer_pos_ = new_pos; |
buffer_cursor_ = buffer_start_ + (position - buffer_pos_); |
position = new_pos; |
+ odd_start = chunks_[chunk_no].byte_pos % 2; |
} |
} |
@@ -742,18 +746,18 @@ size_t TwoByteExternalBufferedStream::FillBuffer(size_t position, |
} |
// Common case: character is in current chunk. |
- DCHECK_LE(current->byte_pos, 2 * position + 1); |
+ DCHECK_LE(current->byte_pos, 2 * position + odd_start); |
DCHECK_LT(2 * position + 1, current->byte_pos + current->byte_length); |
// Copy characters from current chunk starting from chunk_pos to the end of |
// buffer or chunk. |
size_t chunk_pos = position - current->byte_pos / 2; |
- bool middle_of_chunk = chunk_pos != 0; |
+ size_t start_offset = odd_start && chunk_pos != 0; |
size_t bytes_to_move = |
- i::Min(2 * kBufferSize - !middle_of_chunk, |
- current->byte_length - 2 * chunk_pos + middle_of_chunk); |
- i::MemMove(reinterpret_cast<uint8_t*>(buffer_) + !middle_of_chunk, |
- current->data + 2 * chunk_pos - middle_of_chunk, bytes_to_move); |
+ i::Min(2 * kBufferSize - lonely_byte, |
+ current->byte_length - 2 * chunk_pos + start_offset); |
+ i::MemMove(reinterpret_cast<uint8_t*>(buffer_) + lonely_byte, |
+ current->data + 2 * chunk_pos - start_offset, bytes_to_move); |
// Fill up the rest of the buffer if there is space and data left. |
totalLength += bytes_to_move; |
@@ -761,10 +765,11 @@ size_t TwoByteExternalBufferedStream::FillBuffer(size_t position, |
if (position - buffer_pos_ < kBufferSize) { |
chunk_no = FindChunk(chunks_, source_, 2 * position + 1); |
current = &chunks_[chunk_no]; |
+ odd_start = current->byte_pos % 2; |
bytes_to_move = i::Min(2 * kBufferSize - totalLength, current->byte_length); |
- while (bytes_to_move && current->byte_pos % 2) { |
+ while (bytes_to_move) { |
// Common case: character is in current chunk. |
- DCHECK_LE(current->byte_pos, 2 * position + 1); |
+ DCHECK_LE(current->byte_pos, 2 * position + odd_start); |
DCHECK_LT(2 * position + 1, current->byte_pos + current->byte_length); |
i::MemMove(reinterpret_cast<uint8_t*>(buffer_) + totalLength, |
@@ -773,6 +778,7 @@ size_t TwoByteExternalBufferedStream::FillBuffer(size_t position, |
position = (current->byte_pos + current->byte_length) / 2; |
chunk_no = FindChunk(chunks_, source_, 2 * position + 1); |
current = &chunks_[chunk_no]; |
+ odd_start = current->byte_pos % 2; |
bytes_to_move = |
i::Min(2 * kBufferSize - totalLength, current->byte_length); |
} |
@@ -820,7 +826,7 @@ Utf16CharacterStream* ScannerStream::For( |
v8::ScriptCompiler::StreamedSource::Encoding encoding) { |
switch (encoding) { |
case v8::ScriptCompiler::StreamedSource::TWO_BYTE: |
-#if !(V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_ARM) |
+#if !(V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64) |
return new TwoByteExternalStreamingStream(source_stream); |
#else |
return new TwoByteExternalBufferedStream(source_stream); |