| 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 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 Program* program() { return program_; } | 305 Program* program() { return program_; } |
| 306 void set_program(Program* program) { program_ = program; } | 306 void set_program(Program* program) { program_ = program; } |
| 307 | 307 |
| 308 BlockStack<VariableDeclaration>& variables() { return scope_; } | 308 BlockStack<VariableDeclaration>& variables() { return scope_; } |
| 309 BlockStack<TypeParameter>& type_parameters() { return type_parameters_; } | 309 BlockStack<TypeParameter>& type_parameters() { return type_parameters_; } |
| 310 BlockStack<SwitchCase>& switch_cases() { return switch_cases_; } | 310 BlockStack<SwitchCase>& switch_cases() { return switch_cases_; } |
| 311 | 311 |
| 312 BlockStack<LabeledStatement>* labels() { return labels_; } | 312 BlockStack<LabeledStatement>* labels() { return labels_; } |
| 313 void set_labels(BlockStack<LabeledStatement>* labels) { labels_ = labels; } | 313 void set_labels(BlockStack<LabeledStatement>* labels) { labels_ = labels; } |
| 314 | 314 |
| 315 CanonicalName* GetCanonicalName(int index) { return canonical_names_[index]; } | |
| 316 void SetCanonicalName(int index, CanonicalName* name) { | |
| 317 canonical_names_[index] = name; | |
| 318 } | |
| 319 void SetCanonicalNameCount(int count) { canonical_names_.SetLength(count); } | |
| 320 | |
| 321 private: | 315 private: |
| 322 Program* program_; | 316 Program* program_; |
| 323 MallocGrowableArray<CanonicalName*> canonical_names_; | |
| 324 BlockStack<VariableDeclaration> scope_; | 317 BlockStack<VariableDeclaration> scope_; |
| 325 BlockStack<TypeParameter> type_parameters_; | 318 BlockStack<TypeParameter> type_parameters_; |
| 326 BlockStack<SwitchCase> switch_cases_; | 319 BlockStack<SwitchCase> switch_cases_; |
| 327 BlockStack<LabeledStatement>* labels_; | 320 BlockStack<LabeledStatement>* labels_; |
| 328 }; | 321 }; |
| 329 | 322 |
| 330 | 323 |
| 331 class Reader { | 324 class Reader { |
| 332 public: | 325 public: |
| 333 Reader(const uint8_t* buffer, intptr_t size) | 326 Reader(const uint8_t* buffer, intptr_t size) |
| 334 : buffer_(buffer), | 327 : buffer_(buffer), |
| 335 size_(size), | 328 size_(size), |
| 336 offset_(0), | 329 offset_(0), |
| 337 string_table_offset_(-1), | |
| 338 string_data_offset_(-1), | 330 string_data_offset_(-1), |
| 339 string_offsets_(NULL) {} | 331 string_offsets_(NULL), |
| 332 canonical_name_parents_(NULL), |
| 333 canonical_name_strings_(NULL) {} |
| 340 | 334 |
| 341 ~Reader() { delete[] string_offsets_; } | 335 ~Reader(); |
| 342 | 336 |
| 343 uint32_t ReadUInt32() { | 337 uint32_t ReadUInt32() { |
| 344 ASSERT(offset_ + 4 <= size_); | 338 ASSERT(offset_ + 4 <= size_); |
| 345 | 339 |
| 346 uint32_t value = (buffer_[offset_ + 0] << 24) | | 340 uint32_t value = (buffer_[offset_ + 0] << 24) | |
| 347 (buffer_[offset_ + 1] << 16) | | 341 (buffer_[offset_ + 1] << 16) | |
| 348 (buffer_[offset_ + 2] << 8) | (buffer_[offset_ + 3] << 0); | 342 (buffer_[offset_ + 2] << 8) | (buffer_[offset_ + 3] << 0); |
| 349 offset_ += 4; | 343 offset_ += 4; |
| 350 return value; | 344 return value; |
| 351 } | 345 } |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 return RT::ReadFrom(this); | 484 return RT::ReadFrom(this); |
| 491 } | 485 } |
| 492 | 486 |
| 493 template <typename T> | 487 template <typename T> |
| 494 T* ReadOptional() { | 488 T* ReadOptional() { |
| 495 return ReadOptional<T, T>(); | 489 return ReadOptional<T, T>(); |
| 496 } | 490 } |
| 497 | 491 |
| 498 ReaderHelper* helper() { return &builder_; } | 492 ReaderHelper* helper() { return &builder_; } |
| 499 | 493 |
| 500 CanonicalName* ReadCanonicalNameReference() { | 494 // A canonical name reference of -1 indicates none (for optional names), not |
| 501 int index = ReadUInt(); | 495 // the root name as in the canonical name table. |
| 502 if (index == 0) return NULL; | 496 intptr_t ReadCanonicalNameReference() { return ReadUInt() - 1; } |
| 503 CanonicalName* name = builder_.GetCanonicalName(index - 1); | |
| 504 ASSERT(name != NULL); | |
| 505 return name; | |
| 506 } | |
| 507 | 497 |
| 508 intptr_t offset() { return offset_; } | 498 intptr_t offset() { return offset_; } |
| 509 void set_offset(intptr_t offset) { offset_ = offset; } | 499 void set_offset(intptr_t offset) { offset_ = offset; } |
| 510 intptr_t size() { return size_; } | 500 intptr_t size() { return size_; } |
| 511 | 501 |
| 512 const uint8_t* buffer() { return buffer_; } | 502 const uint8_t* buffer() { return buffer_; } |
| 513 | 503 |
| 514 intptr_t string_table_offset() { return string_table_offset_; } | |
| 515 void MarkStringTableOffset() { | |
| 516 ASSERT(string_table_offset_ == -1); | |
| 517 string_table_offset_ = offset_; | |
| 518 } | |
| 519 | |
| 520 intptr_t string_data_offset() { return string_data_offset_; } | 504 intptr_t string_data_offset() { return string_data_offset_; } |
| 521 void MarkStringDataOffset() { | 505 void MarkStringDataOffset() { |
| 522 ASSERT(string_data_offset_ == -1); | 506 ASSERT(string_data_offset_ == -1); |
| 523 string_data_offset_ = offset_; | 507 string_data_offset_ = offset_; |
| 524 } | 508 } |
| 525 | 509 |
| 526 intptr_t StringLength(intptr_t string_index) { | 510 intptr_t StringLength(intptr_t string_index) { |
| 527 return string_offsets_[string_index + 1] - string_offsets_[string_index]; | 511 return string_offsets_[string_index + 1] - string_offsets_[string_index]; |
| 528 } | 512 } |
| 529 | 513 |
| 530 uint8_t CharacterAt(intptr_t string_index, intptr_t index) { | 514 uint8_t CharacterAt(intptr_t string_index, intptr_t index) { |
| 531 ASSERT(index < StringLength(string_index)); | 515 ASSERT(index < StringLength(string_index)); |
| 532 return buffer_[string_data_offset_ + string_offsets_[string_index] + index]; | 516 return buffer_[string_data_offset_ + string_offsets_[string_index] + index]; |
| 533 } | 517 } |
| 534 | 518 |
| 519 // The canonical name index of a canonical name's parent (-1 indicates that |
| 520 // the parent is the root name). |
| 521 intptr_t CanonicalNameParent(intptr_t name_index) { |
| 522 return canonical_name_parents_[name_index]; |
| 523 } |
| 524 |
| 525 // The string index of a canonical name's name string. |
| 526 intptr_t CanonicalNameString(intptr_t name_index) { |
| 527 return canonical_name_strings_[name_index]; |
| 528 } |
| 529 |
| 535 private: | 530 private: |
| 536 const uint8_t* buffer_; | 531 const uint8_t* buffer_; |
| 537 intptr_t size_; | 532 intptr_t size_; |
| 538 intptr_t offset_; | 533 intptr_t offset_; |
| 539 ReaderHelper builder_; | 534 ReaderHelper builder_; |
| 540 TokenPosition max_position_; | 535 TokenPosition max_position_; |
| 541 TokenPosition min_position_; | 536 TokenPosition min_position_; |
| 542 intptr_t current_script_id_; | 537 intptr_t current_script_id_; |
| 543 | 538 |
| 544 // When the binary is deserialized the offset of the start of the string table | 539 // The offset of the start of the string data is recorded to allow access to |
| 545 // (the length) and the offset of the start of the string data are recorded. | 540 // the strings during deserialization. |
| 546 intptr_t string_table_offset_; | |
| 547 intptr_t string_data_offset_; | 541 intptr_t string_data_offset_; |
| 548 | 542 |
| 549 // The string offsets are decoded to support efficient access to string UTF-8 | 543 // The string offsets are decoded to support efficient access to string UTF-8 |
| 550 // encodings. | 544 // encodings. |
| 551 intptr_t* string_offsets_; | 545 intptr_t* string_offsets_; |
| 552 | 546 |
| 547 // The canonical names are decoded. |
| 548 intptr_t* canonical_name_parents_; |
| 549 intptr_t* canonical_name_strings_; |
| 550 |
| 553 friend class PositionScope; | 551 friend class PositionScope; |
| 554 friend class Program; | 552 friend class Program; |
| 555 }; | 553 }; |
| 556 | 554 |
| 557 | 555 |
| 558 // A helper class that resets the readers min and max positions both upon | 556 // A helper class that resets the readers min and max positions both upon |
| 559 // initialization and upon destruction, i.e. when created the min an max | 557 // initialization and upon destruction, i.e. when created the min an max |
| 560 // positions will be reset to "noSource", when destructing the min and max will | 558 // positions will be reset to "noSource", when destructing the min and max will |
| 561 // be reset to have they value they would have had, if they hadn't been reset in | 559 // be reset to have they value they would have had, if they hadn't been reset in |
| 562 // the first place. | 560 // the first place. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 582 Reader* reader_; | 580 Reader* reader_; |
| 583 TokenPosition min_; | 581 TokenPosition min_; |
| 584 TokenPosition max_; | 582 TokenPosition max_; |
| 585 }; | 583 }; |
| 586 | 584 |
| 587 } // namespace kernel | 585 } // namespace kernel |
| 588 } // namespace dart | 586 } // namespace dart |
| 589 | 587 |
| 590 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 588 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| 591 #endif // RUNTIME_VM_KERNEL_BINARY_H_ | 589 #endif // RUNTIME_VM_KERNEL_BINARY_H_ |
| OLD | NEW |