blob: 94d8284f14052beb2c3a2e3aaa08fdc1a96e3550 [file] [log] [blame]
Ben Murdoch014dc512016-03-22 12:00:34 +00001// Copyright 2011 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_PARSING_SCANNER_CHARACTER_STREAMS_H_
6#define V8_PARSING_SCANNER_CHARACTER_STREAMS_H_
7
8#include "src/handles.h"
9#include "src/parsing/scanner.h"
10#include "src/vector.h"
11
12namespace v8 {
13namespace internal {
14
15// Forward declarations.
16class ExternalTwoByteString;
Ben Murdochf91f0612016-11-29 16:50:11 +000017class ExternalOneByteString;
Ben Murdoch014dc512016-03-22 12:00:34 +000018
19// A buffered character stream based on a random access character
20// source (ReadBlock can be called with pos_ pointing to any position,
21// even positions before the current).
22class BufferedUtf16CharacterStream: public Utf16CharacterStream {
23 public:
24 BufferedUtf16CharacterStream();
25 ~BufferedUtf16CharacterStream() override;
26
27 void PushBack(uc32 character) override;
28
29 protected:
30 static const size_t kBufferSize = 512;
31 static const size_t kPushBackStepSize = 16;
32
33 size_t SlowSeekForward(size_t delta) override;
34 bool ReadBlock() override;
35 virtual void SlowPushBack(uc16 character);
36
37 virtual size_t BufferSeekForward(size_t delta) = 0;
38 virtual size_t FillBuffer(size_t position) = 0;
39
40 const uc16* pushback_limit_;
41 uc16 buffer_[kBufferSize];
42};
43
44
45// Generic string stream.
46class GenericStringUtf16CharacterStream: public BufferedUtf16CharacterStream {
47 public:
48 GenericStringUtf16CharacterStream(Handle<String> data, size_t start_position,
49 size_t end_position);
50 ~GenericStringUtf16CharacterStream() override;
51
52 bool SetBookmark() override;
53 void ResetToBookmark() override;
54
55 protected:
56 static const size_t kNoBookmark = -1;
57
58 size_t BufferSeekForward(size_t delta) override;
59 size_t FillBuffer(size_t position) override;
60
61 Handle<String> string_;
62 size_t length_;
63 size_t bookmark_;
64};
65
66
Ben Murdoch014dc512016-03-22 12:00:34 +000067// ExternalStreamingStream is a wrapper around an ExternalSourceStream (see
68// include/v8.h) subclass implemented by the embedder.
69class ExternalStreamingStream : public BufferedUtf16CharacterStream {
70 public:
71 ExternalStreamingStream(ScriptCompiler::ExternalSourceStream* source_stream,
72 v8::ScriptCompiler::StreamedSource::Encoding encoding)
73 : source_stream_(source_stream),
74 encoding_(encoding),
75 current_data_(NULL),
76 current_data_offset_(0),
77 current_data_length_(0),
78 utf8_split_char_buffer_length_(0),
79 bookmark_(0),
80 bookmark_data_is_from_current_data_(false),
81 bookmark_data_offset_(0),
82 bookmark_utf8_split_char_buffer_length_(0) {}
83
84 ~ExternalStreamingStream() override {
85 delete[] current_data_;
86 bookmark_buffer_.Dispose();
87 bookmark_data_.Dispose();
88 }
89
90 size_t BufferSeekForward(size_t delta) override {
91 // We never need to seek forward when streaming scripts. We only seek
92 // forward when we want to parse a function whose location we already know,
93 // and when streaming, we don't know the locations of anything we haven't
94 // seen yet.
95 UNREACHABLE();
96 return 0;
97 }
98
99 size_t FillBuffer(size_t position) override;
100
101 bool SetBookmark() override;
102 void ResetToBookmark() override;
103
104 private:
105 void HandleUtf8SplitCharacters(size_t* data_in_buffer);
106 void FlushCurrent();
107
108 ScriptCompiler::ExternalSourceStream* source_stream_;
109 v8::ScriptCompiler::StreamedSource::Encoding encoding_;
110 const uint8_t* current_data_;
111 size_t current_data_offset_;
112 size_t current_data_length_;
113 // For converting UTF-8 characters which are split across two data chunks.
114 uint8_t utf8_split_char_buffer_[4];
115 size_t utf8_split_char_buffer_length_;
116
117 // Bookmark support. See comments in ExternalStreamingStream::SetBookmark
118 // for additional details.
119 size_t bookmark_;
120 Vector<uint16_t> bookmark_buffer_;
121 Vector<uint8_t> bookmark_data_;
122 bool bookmark_data_is_from_current_data_;
123 size_t bookmark_data_offset_;
124 uint8_t bookmark_utf8_split_char_buffer_[4];
125 size_t bookmark_utf8_split_char_buffer_length_;
126};
127
128
129// UTF16 buffer to read characters from an external string.
130class ExternalTwoByteStringUtf16CharacterStream: public Utf16CharacterStream {
131 public:
132 ExternalTwoByteStringUtf16CharacterStream(Handle<ExternalTwoByteString> data,
133 int start_position,
134 int end_position);
135 ~ExternalTwoByteStringUtf16CharacterStream() override;
136
137 void PushBack(uc32 character) override {
138 DCHECK(buffer_cursor_ > raw_data_);
Ben Murdoch014dc512016-03-22 12:00:34 +0000139 pos_--;
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100140 if (character != kEndOfInput) {
141 buffer_cursor_--;
142 }
Ben Murdoch014dc512016-03-22 12:00:34 +0000143 }
144
145 bool SetBookmark() override;
146 void ResetToBookmark() override;
147
Ben Murdochf91f0612016-11-29 16:50:11 +0000148 private:
Ben Murdoch014dc512016-03-22 12:00:34 +0000149 size_t SlowSeekForward(size_t delta) override {
150 // Fast case always handles seeking.
151 return 0;
152 }
153 bool ReadBlock() override {
154 // Entire string is read at start.
155 return false;
156 }
Ben Murdoch014dc512016-03-22 12:00:34 +0000157 const uc16* raw_data_; // Pointer to the actual array of characters.
158
Ben Murdochf91f0612016-11-29 16:50:11 +0000159 static const size_t kNoBookmark = -1;
160
161 size_t bookmark_;
162};
163
164// UTF16 buffer to read characters from an external latin1 string.
165class ExternalOneByteStringUtf16CharacterStream
166 : public BufferedUtf16CharacterStream {
167 public:
168 ExternalOneByteStringUtf16CharacterStream(Handle<ExternalOneByteString> data,
169 int start_position,
170 int end_position);
171 ~ExternalOneByteStringUtf16CharacterStream() override;
172
173 // For testing:
174 explicit ExternalOneByteStringUtf16CharacterStream(const char* data);
175 ExternalOneByteStringUtf16CharacterStream(const char* data, size_t length);
176
177 bool SetBookmark() override;
178 void ResetToBookmark() override;
179
Ben Murdoch014dc512016-03-22 12:00:34 +0000180 private:
181 static const size_t kNoBookmark = -1;
182
Ben Murdochf91f0612016-11-29 16:50:11 +0000183 size_t BufferSeekForward(size_t delta) override;
184 size_t FillBuffer(size_t position) override;
185
186 const uint8_t* raw_data_; // Pointer to the actual array of characters.
187 size_t length_;
Ben Murdoch014dc512016-03-22 12:00:34 +0000188 size_t bookmark_;
189};
190
191} // namespace internal
192} // namespace v8
193
194#endif // V8_PARSING_SCANNER_CHARACTER_STREAMS_H_