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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 explicit TypeParameterScope(T* builder) : builder_(builder) { | 260 explicit TypeParameterScope(T* builder) : builder_(builder) { |
261 builder_->type_parameters().EnterScope(); | 261 builder_->type_parameters().EnterScope(); |
262 } | 262 } |
263 ~TypeParameterScope() { builder_->type_parameters().LeaveScope(); } | 263 ~TypeParameterScope() { builder_->type_parameters().LeaveScope(); } |
264 | 264 |
265 private: | 265 private: |
266 T* builder_; | 266 T* builder_; |
267 }; | 267 }; |
268 | 268 |
269 | 269 |
270 template <typename T> | |
271 class SwitchCaseScope { | |
272 public: | |
273 explicit SwitchCaseScope(T* builder) : builder_(builder) { | |
274 builder_->switch_cases().EnterScope(); | |
275 } | |
276 ~SwitchCaseScope() { builder_->switch_cases().LeaveScope(); } | |
277 | |
278 private: | |
279 T* builder_; | |
280 }; | |
281 | |
282 | |
283 // Unlike other scopes, labels from enclosing functions are not visible in | 270 // Unlike other scopes, labels from enclosing functions are not visible in |
284 // nested functions. The LabelScope class is used to hide outer labels. | 271 // nested functions. The LabelScope class is used to hide outer labels. |
285 template <typename Builder, typename Block> | 272 template <typename Builder, typename Block> |
286 class LabelScope { | 273 class LabelScope { |
287 public: | 274 public: |
288 explicit LabelScope(Builder* builder) : builder_(builder) { | 275 explicit LabelScope(Builder* builder) : builder_(builder) { |
289 outer_block_ = builder_->labels(); | 276 outer_block_ = builder_->labels(); |
290 builder_->set_labels(&block_); | 277 builder_->set_labels(&block_); |
291 } | 278 } |
292 ~LabelScope() { builder_->set_labels(outer_block_); } | 279 ~LabelScope() { builder_->set_labels(outer_block_); } |
293 | 280 |
294 private: | 281 private: |
295 Builder* builder_; | 282 Builder* builder_; |
296 Block block_; | 283 Block block_; |
297 Block* outer_block_; | 284 Block* outer_block_; |
298 }; | 285 }; |
299 | 286 |
300 | 287 |
301 class ReaderHelper { | 288 class ReaderHelper { |
302 public: | 289 public: |
303 ReaderHelper() : program_(NULL), labels_(NULL) {} | 290 ReaderHelper() : program_(NULL), labels_(NULL) {} |
304 | 291 |
305 Program* program() { return program_; } | 292 Program* program() { return program_; } |
306 void set_program(Program* program) { program_ = program; } | 293 void set_program(Program* program) { program_ = program; } |
307 | 294 |
308 BlockStack<VariableDeclaration>& variables() { return scope_; } | 295 BlockStack<VariableDeclaration>& variables() { return scope_; } |
309 BlockStack<TypeParameter>& type_parameters() { return type_parameters_; } | 296 BlockStack<TypeParameter>& type_parameters() { return type_parameters_; } |
310 BlockStack<SwitchCase>& switch_cases() { return switch_cases_; } | |
311 | 297 |
312 BlockStack<LabeledStatement>* labels() { return labels_; } | 298 BlockStack<LabeledStatement>* labels() { return labels_; } |
313 void set_labels(BlockStack<LabeledStatement>* labels) { labels_ = labels; } | 299 void set_labels(BlockStack<LabeledStatement>* labels) { labels_ = labels; } |
314 | 300 |
315 CanonicalName* GetCanonicalName(int index) { return canonical_names_[index]; } | 301 CanonicalName* GetCanonicalName(int index) { return canonical_names_[index]; } |
316 void SetCanonicalName(int index, CanonicalName* name) { | 302 void SetCanonicalName(int index, CanonicalName* name) { |
317 canonical_names_[index] = name; | 303 canonical_names_[index] = name; |
318 } | 304 } |
319 void SetCanonicalNameCount(int count) { canonical_names_.SetLength(count); } | 305 void SetCanonicalNameCount(int count) { canonical_names_.SetLength(count); } |
320 | 306 |
321 private: | 307 private: |
322 Program* program_; | 308 Program* program_; |
323 MallocGrowableArray<CanonicalName*> canonical_names_; | 309 MallocGrowableArray<CanonicalName*> canonical_names_; |
324 BlockStack<VariableDeclaration> scope_; | 310 BlockStack<VariableDeclaration> scope_; |
325 BlockStack<TypeParameter> type_parameters_; | 311 BlockStack<TypeParameter> type_parameters_; |
326 BlockStack<SwitchCase> switch_cases_; | |
327 BlockStack<LabeledStatement>* labels_; | 312 BlockStack<LabeledStatement>* labels_; |
328 }; | 313 }; |
329 | 314 |
330 | 315 |
331 class Reader { | 316 class Reader { |
332 public: | 317 public: |
333 Reader(const uint8_t* buffer, intptr_t size) | 318 Reader(const uint8_t* buffer, intptr_t size) |
334 : buffer_(buffer), | 319 : buffer_(buffer), |
335 size_(size), | 320 size_(size), |
336 offset_(0), | 321 offset_(0), |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 if (record) { | 405 if (record) { |
421 record_token_position(result); | 406 record_token_position(result); |
422 } | 407 } |
423 return result; | 408 return result; |
424 } | 409 } |
425 | 410 |
426 intptr_t ReadListLength() { return ReadUInt(); } | 411 intptr_t ReadListLength() { return ReadUInt(); } |
427 | 412 |
428 uint8_t ReadByte() { return buffer_[offset_++]; } | 413 uint8_t ReadByte() { return buffer_[offset_++]; } |
429 | 414 |
| 415 uint8_t PeekByte() { return buffer_[offset_]; } |
| 416 |
430 bool ReadBool() { return (ReadByte() & 1) == 1; } | 417 bool ReadBool() { return (ReadByte() & 1) == 1; } |
431 | 418 |
432 word ReadFlags() { return ReadByte(); } | 419 word ReadFlags() { return ReadByte(); } |
433 | 420 |
434 Tag ReadTag(uint8_t* payload = NULL) { | 421 Tag ReadTag(uint8_t* payload = NULL) { |
435 uint8_t byte = ReadByte(); | 422 uint8_t byte = ReadByte(); |
436 bool has_payload = (byte & kSpecializedTagHighBit) != 0; | 423 bool has_payload = (byte & kSpecializedTagHighBit) != 0; |
437 if (has_payload) { | 424 if (has_payload) { |
438 if (payload != NULL) { | 425 if (payload != NULL) { |
439 *payload = byte & kSpecializedPayloadMask; | 426 *payload = byte & kSpecializedPayloadMask; |
440 } | 427 } |
441 return static_cast<Tag>(byte & kSpecializedTagMask); | 428 return static_cast<Tag>(byte & kSpecializedTagMask); |
442 } else { | 429 } else { |
443 return static_cast<Tag>(byte); | 430 return static_cast<Tag>(byte); |
444 } | 431 } |
445 } | 432 } |
446 | 433 |
| 434 Tag PeekTag(uint8_t* payload = NULL) { |
| 435 uint8_t byte = PeekByte(); |
| 436 bool has_payload = (byte & kSpecializedTagHighBit) != 0; |
| 437 if (has_payload) { |
| 438 if (payload != NULL) { |
| 439 *payload = byte & kSpecializedPayloadMask; |
| 440 } |
| 441 return static_cast<Tag>(byte & kSpecializedTagMask); |
| 442 } else { |
| 443 return static_cast<Tag>(byte); |
| 444 } |
| 445 } |
| 446 |
447 const uint8_t* Consume(int count) { | 447 const uint8_t* Consume(int count) { |
448 ASSERT(offset_ + count <= size_); | 448 ASSERT(offset_ + count <= size_); |
449 const uint8_t* old = buffer_ + offset_; | 449 const uint8_t* old = buffer_ + offset_; |
450 offset_ += count; | 450 offset_ += count; |
451 return old; | 451 return old; |
452 } | 452 } |
453 | 453 |
454 void EnsureEnd() { | 454 void EnsureEnd() { |
455 if (offset_ != size_) { | 455 if (offset_ != size_) { |
456 FATAL2( | 456 FATAL2( |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 Reader* reader_; | 582 Reader* reader_; |
583 TokenPosition min_; | 583 TokenPosition min_; |
584 TokenPosition max_; | 584 TokenPosition max_; |
585 }; | 585 }; |
586 | 586 |
587 } // namespace kernel | 587 } // namespace kernel |
588 } // namespace dart | 588 } // namespace dart |
589 | 589 |
590 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 590 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
591 #endif // RUNTIME_VM_KERNEL_BINARY_H_ | 591 #endif // RUNTIME_VM_KERNEL_BINARY_H_ |
OLD | NEW |