OLD | NEW |
---|---|
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef RUNTIME_VM_KERNEL_BINARY_H_ | 5 #ifndef RUNTIME_VM_KERNEL_BINARY_H_ |
6 #define RUNTIME_VM_KERNEL_BINARY_H_ | 6 #define RUNTIME_VM_KERNEL_BINARY_H_ |
7 | 7 |
8 #if !defined(DART_PRECOMPILED_RUNTIME) | 8 #if !defined(DART_PRECOMPILED_RUNTIME) |
9 | 9 |
10 #include <map> | 10 #include <map> |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
130 kSpecializedVariableGet = 128, | 130 kSpecializedVariableGet = 128, |
131 kSpecializedVariableSet = 136, | 131 kSpecializedVariableSet = 136, |
132 kSpecialIntLiteral = 144, | 132 kSpecialIntLiteral = 144, |
133 }; | 133 }; |
134 | 134 |
135 static const int SpecializedIntLiteralBias = 3; | 135 static const int SpecializedIntLiteralBias = 3; |
136 | 136 |
137 class Reader { | 137 class Reader { |
138 public: | 138 public: |
139 Reader(const uint8_t* buffer, intptr_t size) | 139 Reader(const uint8_t* buffer, intptr_t size) |
140 : buffer_(buffer), size_(size), offset_(0) {} | 140 : raw_buffer_(buffer), typed_data_(NULL), size_(size), offset_(0) {} |
141 | |
142 explicit Reader(const TypedData& typed_data) | |
143 : raw_buffer_(NULL), | |
144 typed_data_(&typed_data), | |
145 size_(typed_data.IsNull() ? 0 : typed_data.Length()), | |
146 offset_(0) {} | |
141 | 147 |
142 uint32_t ReadUInt32() { | 148 uint32_t ReadUInt32() { |
143 ASSERT(offset_ + 4 <= size_); | 149 ASSERT(offset_ + 4 <= size_); |
144 | 150 |
151 const uint8_t* buffer_ = buffer(); | |
Kevin Millikin (Google)
2017/08/09 12:08:51
The underscore (_) suffix is used for member varia
jensj
2017/08/10 07:37:34
Done.
| |
145 uint32_t value = (buffer_[offset_ + 0] << 24) | | 152 uint32_t value = (buffer_[offset_ + 0] << 24) | |
146 (buffer_[offset_ + 1] << 16) | | 153 (buffer_[offset_ + 1] << 16) | |
147 (buffer_[offset_ + 2] << 8) | (buffer_[offset_ + 3] << 0); | 154 (buffer_[offset_ + 2] << 8) | (buffer_[offset_ + 3] << 0); |
148 offset_ += 4; | 155 offset_ += 4; |
149 return value; | 156 return value; |
150 } | 157 } |
151 | 158 |
152 uint32_t ReadUInt() { | 159 uint32_t ReadUInt() { |
153 ASSERT(offset_ + 1 <= size_); | 160 ASSERT(offset_ + 1 <= size_); |
161 | |
162 const uint8_t* buffer_ = buffer(); | |
Kevin Millikin (Google)
2017/08/09 12:08:51
Same here.
jensj
2017/08/10 07:37:34
Done.
| |
154 uint8_t byte0 = buffer_[offset_]; | 163 uint8_t byte0 = buffer_[offset_]; |
155 if ((byte0 & 0x80) == 0) { | 164 if ((byte0 & 0x80) == 0) { |
156 // 0... | 165 // 0... |
157 offset_++; | 166 offset_++; |
158 return byte0; | 167 return byte0; |
159 } else if ((byte0 & 0xc0) == 0x80) { | 168 } else if ((byte0 & 0xc0) == 0x80) { |
160 // 10... | 169 // 10... |
161 ASSERT(offset_ + 2 <= size_); | 170 ASSERT(offset_ + 2 <= size_); |
162 uint32_t value = ((byte0 & ~0x80) << 8) | (buffer_[offset_ + 1]); | 171 uint32_t value = ((byte0 & ~0x80) << 8) | (buffer_[offset_ + 1]); |
163 offset_ += 2; | 172 offset_ += 2; |
164 return value; | 173 return value; |
165 } else { | 174 } else { |
166 // 11... | 175 // 11... |
167 ASSERT(offset_ + 4 <= size_); | 176 ASSERT(offset_ + 4 <= size_); |
168 uint32_t value = ((byte0 & ~0xc0) << 24) | (buffer_[offset_ + 1] << 16) | | 177 uint32_t value = ((byte0 & ~0xc0) << 24) | (buffer_[offset_ + 1] << 16) | |
169 (buffer_[offset_ + 2] << 8) | | 178 (buffer_[offset_ + 2] << 8) | |
170 (buffer_[offset_ + 3] << 0); | 179 (buffer_[offset_ + 3] << 0); |
171 offset_ += 4; | 180 offset_ += 4; |
172 return value; | 181 return value; |
173 } | 182 } |
174 } | 183 } |
175 | 184 |
176 /** | 185 /** |
177 * Read and return a TokenPosition from this reader. | 186 * Read and return a TokenPosition from this reader. |
178 * @param record specifies whether or not the read position is saved as a | |
179 * valid token position in the current script. | |
180 * If not be sure to record it later by calling record_token_position (after | |
181 * setting the correct current_script_id). | |
182 */ | 187 */ |
183 TokenPosition ReadPosition() { | 188 TokenPosition ReadPosition() { |
184 // Position is saved as unsigned, | 189 // Position is saved as unsigned, |
185 // but actually ranges from -1 and up (thus the -1) | 190 // but actually ranges from -1 and up (thus the -1) |
186 intptr_t value = ReadUInt() - 1; | 191 intptr_t value = ReadUInt() - 1; |
187 TokenPosition result = TokenPosition(value); | 192 TokenPosition result = TokenPosition(value); |
188 max_position_ = Utils::Maximum(max_position_, result); | 193 max_position_ = Utils::Maximum(max_position_, result); |
189 if (min_position_.IsNoSource()) { | 194 if (min_position_.IsNoSource()) { |
190 min_position_ = result; | 195 min_position_ = result; |
191 } else if (result.IsReal()) { | 196 } else if (result.IsReal()) { |
192 min_position_ = Utils::Minimum(min_position_, result); | 197 min_position_ = Utils::Minimum(min_position_, result); |
193 } | 198 } |
194 | 199 |
195 return result; | 200 return result; |
196 } | 201 } |
197 | 202 |
198 intptr_t ReadListLength() { return ReadUInt(); } | 203 intptr_t ReadListLength() { return ReadUInt(); } |
199 | 204 |
200 uint8_t ReadByte() { return buffer_[offset_++]; } | 205 uint8_t ReadByte() { return buffer()[offset_++]; } |
201 | 206 |
202 uint8_t PeekByte() { return buffer_[offset_]; } | 207 uint8_t PeekByte() { return buffer()[offset_]; } |
203 | 208 |
204 bool ReadBool() { return (ReadByte() & 1) == 1; } | 209 bool ReadBool() { return (ReadByte() & 1) == 1; } |
205 | 210 |
206 word ReadFlags() { return ReadByte(); } | 211 word ReadFlags() { return ReadByte(); } |
207 | 212 |
208 Tag ReadTag(uint8_t* payload = NULL) { | 213 Tag ReadTag(uint8_t* payload = NULL) { |
209 uint8_t byte = ReadByte(); | 214 uint8_t byte = ReadByte(); |
210 bool has_payload = (byte & kSpecializedTagHighBit) != 0; | 215 bool has_payload = (byte & kSpecializedTagHighBit) != 0; |
211 if (has_payload) { | 216 if (has_payload) { |
212 if (payload != NULL) { | 217 if (payload != NULL) { |
(...skipping 11 matching lines...) Expand all Loading... | |
224 if (has_payload) { | 229 if (has_payload) { |
225 if (payload != NULL) { | 230 if (payload != NULL) { |
226 *payload = byte & kSpecializedPayloadMask; | 231 *payload = byte & kSpecializedPayloadMask; |
227 } | 232 } |
228 return static_cast<Tag>(byte & kSpecializedTagMask); | 233 return static_cast<Tag>(byte & kSpecializedTagMask); |
229 } else { | 234 } else { |
230 return static_cast<Tag>(byte); | 235 return static_cast<Tag>(byte); |
231 } | 236 } |
232 } | 237 } |
233 | 238 |
234 const uint8_t* Consume(int count) { | |
235 ASSERT(offset_ + count <= size_); | |
236 const uint8_t* old = buffer_ + offset_; | |
237 offset_ += count; | |
238 return old; | |
239 } | |
240 | |
241 void EnsureEnd() { | 239 void EnsureEnd() { |
242 if (offset_ != size_) { | 240 if (offset_ != size_) { |
243 FATAL2( | 241 FATAL2( |
244 "Reading Kernel file: Expected to be at EOF " | 242 "Reading Kernel file: Expected to be at EOF " |
245 "(offset: %" Pd ", size: %" Pd ")", | 243 "(offset: %" Pd ", size: %" Pd ")", |
246 offset_, size_); | 244 offset_, size_); |
247 } | 245 } |
248 } | 246 } |
249 | 247 |
250 // The largest position read yet (since last reset). | 248 // The largest position read yet (since last reset). |
251 // This is automatically updated when calling ReadPosition, | 249 // This is automatically updated when calling ReadPosition, |
252 // but can be overwritten (e.g. via the PositionScope class). | 250 // but can be overwritten (e.g. via the PositionScope class). |
253 TokenPosition max_position() { return max_position_; } | 251 TokenPosition max_position() { return max_position_; } |
254 // The smallest position read yet (since last reset). | 252 // The smallest position read yet (since last reset). |
255 // This is automatically updated when calling ReadPosition, | 253 // This is automatically updated when calling ReadPosition, |
256 // but can be overwritten (e.g. via the PositionScope class). | 254 // but can be overwritten (e.g. via the PositionScope class). |
257 TokenPosition min_position() { return min_position_; } | 255 TokenPosition min_position() { return min_position_; } |
258 | 256 |
259 template <typename T, typename RT> | |
260 T* ReadOptional() { | |
261 Tag tag = ReadTag(); | |
262 if (tag == kNothing) { | |
263 return NULL; | |
264 } | |
265 ASSERT(tag == kSomething); | |
266 return RT::ReadFrom(this); | |
267 } | |
268 | |
269 template <typename T> | |
270 T* ReadOptional() { | |
271 return ReadOptional<T, T>(); | |
272 } | |
273 | |
274 // A canonical name reference of -1 indicates none (for optional names), not | 257 // A canonical name reference of -1 indicates none (for optional names), not |
275 // the root name as in the canonical name table. | 258 // the root name as in the canonical name table. |
276 NameIndex ReadCanonicalNameReference() { return NameIndex(ReadUInt() - 1); } | 259 NameIndex ReadCanonicalNameReference() { return NameIndex(ReadUInt() - 1); } |
277 | 260 |
278 intptr_t offset() { return offset_; } | 261 intptr_t offset() { return offset_; } |
279 void set_offset(intptr_t offset) { offset_ = offset; } | 262 void set_offset(intptr_t offset) { offset_ = offset; } |
263 | |
280 intptr_t size() { return size_; } | 264 intptr_t size() { return size_; } |
265 void set_size(intptr_t size) { size_ = size; } | |
281 | 266 |
282 const uint8_t* buffer() { return buffer_; } | 267 const TypedData* typed_data() { return typed_data_; } |
268 void set_typed_data(const TypedData* typed_data) { typed_data_ = typed_data; } | |
269 | |
270 const uint8_t* raw_buffer() { return raw_buffer_; } | |
271 void set_raw_buffer(const uint8_t* raw_buffer) { raw_buffer_ = raw_buffer; } | |
272 | |
273 TypedData& CopyDataToVMHeap(Zone* zone, | |
274 intptr_t from_byte, | |
275 intptr_t to_byte) { | |
276 intptr_t size = to_byte - from_byte; | |
277 TypedData& data = TypedData::Handle( | |
278 zone, TypedData::New(kTypedDataUint8ArrayCid, size, Heap::kOld)); | |
279 { | |
280 NoSafepointScope no_safepoint; | |
281 memmove(data.DataAddr(0), buffer() + from_byte, size); | |
282 } | |
283 return data; | |
284 } | |
285 | |
286 uint8_t* CopyDataIntoZone(Zone* zone, intptr_t offset, intptr_t length) { | |
287 uint8_t* buffer_ = zone->Alloc<uint8_t>(length); | |
288 { | |
289 NoSafepointScope no_safepoint; | |
290 memmove(buffer_, buffer() + offset, length); | |
291 } | |
292 return buffer_; | |
293 } | |
283 | 294 |
284 private: | 295 private: |
285 const uint8_t* buffer_; | 296 const uint8_t* buffer() { |
297 if (raw_buffer_ != NULL) { | |
298 return raw_buffer_; | |
299 } | |
300 NoSafepointScope no_safepoint; | |
301 return reinterpret_cast<uint8_t*>(typed_data_->DataAddr(0)); | |
302 } | |
303 | |
304 const uint8_t* raw_buffer_; | |
305 const TypedData* typed_data_; | |
286 intptr_t size_; | 306 intptr_t size_; |
287 intptr_t offset_; | 307 intptr_t offset_; |
288 TokenPosition max_position_; | 308 TokenPosition max_position_; |
289 TokenPosition min_position_; | 309 TokenPosition min_position_; |
290 intptr_t current_script_id_; | 310 intptr_t current_script_id_; |
291 | 311 |
292 friend class PositionScope; | 312 friend class PositionScope; |
293 friend class Program; | 313 friend class Program; |
294 }; | 314 }; |
295 | 315 |
(...skipping 24 matching lines...) Expand all Loading... | |
320 Reader* reader_; | 340 Reader* reader_; |
321 TokenPosition min_; | 341 TokenPosition min_; |
322 TokenPosition max_; | 342 TokenPosition max_; |
323 }; | 343 }; |
324 | 344 |
325 } // namespace kernel | 345 } // namespace kernel |
326 } // namespace dart | 346 } // namespace dart |
327 | 347 |
328 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 348 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
329 #endif // RUNTIME_VM_KERNEL_BINARY_H_ | 349 #endif // RUNTIME_VM_KERNEL_BINARY_H_ |
OLD | NEW |