| 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_FLOWGRAPH_H_ | 5 #ifndef RUNTIME_VM_KERNEL_BINARY_FLOWGRAPH_H_ |
| 6 #define RUNTIME_VM_KERNEL_BINARY_FLOWGRAPH_H_ | 6 #define RUNTIME_VM_KERNEL_BINARY_FLOWGRAPH_H_ |
| 7 | 7 |
| 8 #if !defined(DART_PRECOMPILED_RUNTIME) | 8 #if !defined(DART_PRECOMPILED_RUNTIME) |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 private: | 44 private: |
| 45 // Can build a malformed type. | 45 // Can build a malformed type. |
| 46 void BuildTypeInternal(); | 46 void BuildTypeInternal(); |
| 47 void BuildInterfaceType(bool simple); | 47 void BuildInterfaceType(bool simple); |
| 48 void BuildFunctionType(bool simple); | 48 void BuildFunctionType(bool simple); |
| 49 void BuildTypeParameterType(); | 49 void BuildTypeParameterType(); |
| 50 | 50 |
| 51 class TypeParameterScope { | 51 class TypeParameterScope { |
| 52 public: | 52 public: |
| 53 TypeParameterScope(StreamingDartTypeTranslator* translator, | 53 TypeParameterScope(StreamingDartTypeTranslator* translator, |
| 54 intptr_t parameters_offset, | 54 intptr_t parameter_count) |
| 55 intptr_t parameters_count) | 55 : parameter_count_(parameter_count), |
| 56 : parameters_offset_(parameters_offset), | |
| 57 parameters_count_(parameters_count), | |
| 58 outer_(translator->type_parameter_scope_), | 56 outer_(translator->type_parameter_scope_), |
| 59 translator_(translator) { | 57 translator_(translator) { |
| 60 outer_parameter_count_ = 0; | 58 outer_parameter_count_ = 0; |
| 61 if (outer_ != NULL) { | 59 if (outer_ != NULL) { |
| 62 outer_parameter_count_ = | 60 outer_parameter_count_ = |
| 63 outer_->outer_parameter_count_ + outer_->parameters_count_; | 61 outer_->outer_parameter_count_ + outer_->parameter_count_; |
| 64 } | 62 } |
| 65 translator_->type_parameter_scope_ = this; | 63 translator_->type_parameter_scope_ = this; |
| 66 } | 64 } |
| 67 ~TypeParameterScope() { translator_->type_parameter_scope_ = outer_; } | 65 ~TypeParameterScope() { translator_->type_parameter_scope_ = outer_; } |
| 68 | 66 |
| 69 TypeParameterScope* outer() const { return outer_; } | 67 TypeParameterScope* outer() const { return outer_; } |
| 70 intptr_t parameters_offset() const { return parameters_offset_; } | 68 intptr_t parameter_count() const { return parameter_count_; } |
| 71 intptr_t parameters_count() const { return parameters_count_; } | |
| 72 intptr_t outer_parameter_count() const { return outer_parameter_count_; } | 69 intptr_t outer_parameter_count() const { return outer_parameter_count_; } |
| 73 | 70 |
| 74 private: | 71 private: |
| 75 intptr_t parameters_offset_; | 72 intptr_t parameter_count_; |
| 76 intptr_t parameters_count_; | |
| 77 intptr_t outer_parameter_count_; | 73 intptr_t outer_parameter_count_; |
| 78 TypeParameterScope* outer_; | 74 TypeParameterScope* outer_; |
| 79 StreamingDartTypeTranslator* translator_; | 75 StreamingDartTypeTranslator* translator_; |
| 80 }; | 76 }; |
| 81 | 77 |
| 82 intptr_t FindTypeParameterIndex(intptr_t parameters_offset, | |
| 83 intptr_t parameters_count, | |
| 84 intptr_t look_for); | |
| 85 | |
| 86 StreamingFlowGraphBuilder* builder_; | 78 StreamingFlowGraphBuilder* builder_; |
| 87 TranslationHelper& translation_helper_; | 79 TranslationHelper& translation_helper_; |
| 88 ActiveClass* active_class_; | 80 ActiveClass* active_class_; |
| 89 TypeParameterScope* type_parameter_scope_; | 81 TypeParameterScope* type_parameter_scope_; |
| 90 Zone* zone_; | 82 Zone* zone_; |
| 91 AbstractType& result_; | 83 AbstractType& result_; |
| 92 bool finalize_; | 84 bool finalize_; |
| 93 | 85 |
| 94 friend class StreamingScopeBuilder; | 86 friend class StreamingScopeBuilder; |
| 95 friend class KernelReader; | 87 friend class KernelReader; |
| 96 }; | 88 }; |
| 97 | 89 |
| 98 class StreamingScopeBuilder { | 90 class StreamingScopeBuilder { |
| 99 public: | 91 public: |
| 100 StreamingScopeBuilder(ParsedFunction* parsed_function, | 92 StreamingScopeBuilder(ParsedFunction* parsed_function, |
| 101 intptr_t kernel_offset, | 93 intptr_t relative_kernel_offset, |
| 102 const uint8_t* buffer, | 94 const TypedData& data); |
| 103 intptr_t buffer_length); | |
| 104 | 95 |
| 105 virtual ~StreamingScopeBuilder(); | 96 virtual ~StreamingScopeBuilder(); |
| 106 | 97 |
| 107 ScopeBuildingResult* BuildScopes(); | 98 ScopeBuildingResult* BuildScopes(); |
| 108 | 99 |
| 109 private: | 100 private: |
| 110 void VisitField(); | 101 void VisitField(); |
| 111 | 102 |
| 112 void VisitProcedure(); | 103 void VisitProcedure(); |
| 113 | 104 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 intptr_t nesting_depth); | 142 intptr_t nesting_depth); |
| 152 | 143 |
| 153 void AddTryVariables(); | 144 void AddTryVariables(); |
| 154 void AddCatchVariables(); | 145 void AddCatchVariables(); |
| 155 void AddIteratorVariable(); | 146 void AddIteratorVariable(); |
| 156 void AddSwitchVariable(); | 147 void AddSwitchVariable(); |
| 157 | 148 |
| 158 // Record an assignment or reference to a variable. If the occurrence is | 149 // Record an assignment or reference to a variable. If the occurrence is |
| 159 // in a nested function, ensure that the variable is handled properly as a | 150 // in a nested function, ensure that the variable is handled properly as a |
| 160 // captured variable. | 151 // captured variable. |
| 161 void LookupVariable(intptr_t declaration_binary_offest); | 152 void LookupVariable(intptr_t declaration_binary_offset); |
| 162 | 153 |
| 163 const dart::String& GenerateName(const char* prefix, intptr_t suffix); | 154 const dart::String& GenerateName(const char* prefix, intptr_t suffix); |
| 164 | 155 |
| 165 void HandleSpecialLoad(LocalVariable** variable, const dart::String& symbol); | 156 void HandleSpecialLoad(LocalVariable** variable, const dart::String& symbol); |
| 166 void LookupCapturedVariableByName(LocalVariable** variable, | 157 void LookupCapturedVariableByName(LocalVariable** variable, |
| 167 const dart::String& name); | 158 const dart::String& name); |
| 168 | 159 |
| 169 struct DepthState { | 160 struct DepthState { |
| 170 explicit DepthState(intptr_t function) | 161 explicit DepthState(intptr_t function) |
| 171 : loop_(0), | 162 : loop_(0), |
| 172 function_(function), | 163 function_(function), |
| 173 try_(0), | 164 try_(0), |
| 174 catch_(0), | 165 catch_(0), |
| 175 finally_(0), | 166 finally_(0), |
| 176 for_in_(0) {} | 167 for_in_(0) {} |
| 177 | 168 |
| 178 intptr_t loop_; | 169 intptr_t loop_; |
| 179 intptr_t function_; | 170 intptr_t function_; |
| 180 intptr_t try_; | 171 intptr_t try_; |
| 181 intptr_t catch_; | 172 intptr_t catch_; |
| 182 intptr_t finally_; | 173 intptr_t finally_; |
| 183 intptr_t for_in_; | 174 intptr_t for_in_; |
| 184 }; | 175 }; |
| 185 | 176 |
| 186 ScopeBuildingResult* result_; | 177 ScopeBuildingResult* result_; |
| 187 ParsedFunction* parsed_function_; | 178 ParsedFunction* parsed_function_; |
| 188 intptr_t kernel_offset_; | 179 intptr_t relative_kernel_offset_; |
| 189 | 180 |
| 190 ActiveClass active_class_; | 181 ActiveClass active_class_; |
| 191 | 182 |
| 192 TranslationHelper translation_helper_; | 183 TranslationHelper translation_helper_; |
| 193 Zone* zone_; | 184 Zone* zone_; |
| 194 | 185 |
| 195 FunctionNode::AsyncMarker current_function_async_marker_; | 186 FunctionNode::AsyncMarker current_function_async_marker_; |
| 196 LocalScope* current_function_scope_; | 187 LocalScope* current_function_scope_; |
| 197 LocalScope* scope_; | 188 LocalScope* scope_; |
| 198 DepthState depth_; | 189 DepthState depth_; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 | 290 |
| 300 Script& script_; | 291 Script& script_; |
| 301 Instance& result_; | 292 Instance& result_; |
| 302 }; | 293 }; |
| 303 | 294 |
| 304 class FunctionNodeHelper; | 295 class FunctionNodeHelper; |
| 305 | 296 |
| 306 class StreamingFlowGraphBuilder { | 297 class StreamingFlowGraphBuilder { |
| 307 public: | 298 public: |
| 308 StreamingFlowGraphBuilder(FlowGraphBuilder* flow_graph_builder, | 299 StreamingFlowGraphBuilder(FlowGraphBuilder* flow_graph_builder, |
| 309 const uint8_t* buffer, | 300 intptr_t relative_kernel_offset, |
| 310 intptr_t buffer_length) | 301 const TypedData& data) |
| 311 : flow_graph_builder_(flow_graph_builder), | 302 : flow_graph_builder_(flow_graph_builder), |
| 312 translation_helper_(flow_graph_builder->translation_helper_), | 303 translation_helper_(flow_graph_builder->translation_helper_), |
| 313 zone_(flow_graph_builder->zone_), | 304 zone_(flow_graph_builder->zone_), |
| 314 reader_(new Reader(buffer, buffer_length)), | 305 reader_(new Reader(data)), |
| 315 constant_evaluator_(this), | 306 constant_evaluator_(this), |
| 316 type_translator_(this, /* finalize= */ true), | 307 type_translator_(this, /* finalize= */ true), |
| 308 relative_kernel_offset_(relative_kernel_offset), |
| 317 current_script_id_(-1), | 309 current_script_id_(-1), |
| 318 record_for_script_id_(-1), | 310 record_for_script_id_(-1), |
| 319 record_token_positions_into_(NULL), | 311 record_token_positions_into_(NULL), |
| 320 record_yield_positions_into_(NULL) {} | 312 record_yield_positions_into_(NULL) {} |
| 321 | 313 |
| 322 StreamingFlowGraphBuilder(TranslationHelper* translation_helper, | 314 StreamingFlowGraphBuilder(TranslationHelper* translation_helper, |
| 323 Zone* zone, | 315 Zone* zone, |
| 324 const uint8_t* buffer, | 316 const uint8_t* buffer, |
| 325 intptr_t buffer_length) | 317 intptr_t buffer_length) |
| 326 : flow_graph_builder_(NULL), | 318 : flow_graph_builder_(NULL), |
| 327 translation_helper_(*translation_helper), | 319 translation_helper_(*translation_helper), |
| 328 zone_(zone), | 320 zone_(zone), |
| 329 reader_(new Reader(buffer, buffer_length)), | 321 reader_(new Reader(buffer, buffer_length)), |
| 330 constant_evaluator_(this), | 322 constant_evaluator_(this), |
| 331 type_translator_(this, /* finalize= */ true), | 323 type_translator_(this, /* finalize= */ true), |
| 324 relative_kernel_offset_(0), |
| 332 current_script_id_(-1), | 325 current_script_id_(-1), |
| 333 record_for_script_id_(-1), | 326 record_for_script_id_(-1), |
| 334 record_token_positions_into_(NULL), | 327 record_token_positions_into_(NULL), |
| 328 record_yield_positions_into_(NULL) {} |
| 329 |
| 330 StreamingFlowGraphBuilder(TranslationHelper* translation_helper, |
| 331 Zone* zone, |
| 332 intptr_t relative_kernel_offset, |
| 333 const TypedData& data) |
| 334 : flow_graph_builder_(NULL), |
| 335 translation_helper_(*translation_helper), |
| 336 zone_(zone), |
| 337 reader_(new Reader(data)), |
| 338 constant_evaluator_(this), |
| 339 type_translator_(this, /* finalize= */ true), |
| 340 relative_kernel_offset_(relative_kernel_offset), |
| 341 current_script_id_(-1), |
| 342 record_for_script_id_(-1), |
| 343 record_token_positions_into_(NULL), |
| 335 record_yield_positions_into_(NULL) {} | 344 record_yield_positions_into_(NULL) {} |
| 336 | 345 |
| 337 ~StreamingFlowGraphBuilder() { delete reader_; } | 346 ~StreamingFlowGraphBuilder() { delete reader_; } |
| 338 | 347 |
| 339 FlowGraph* BuildGraph(intptr_t kernel_offset); | 348 FlowGraph* BuildGraph(intptr_t kernel_offset); |
| 340 | 349 |
| 341 Fragment BuildStatementAt(intptr_t kernel_offset); | 350 Fragment BuildStatementAt(intptr_t kernel_offset); |
| 342 RawObject* BuildParameterDescriptor(intptr_t kernel_offset); | 351 RawObject* BuildParameterDescriptor(intptr_t kernel_offset); |
| 343 RawObject* EvaluateMetadata(intptr_t kernel_offset); | 352 RawObject* EvaluateMetadata(intptr_t kernel_offset); |
| 344 void CollectTokenPositionsFor( | 353 void CollectTokenPositionsFor( |
| 345 intptr_t script_index, | 354 intptr_t script_index, |
| 355 intptr_t initial_script_index, |
| 346 GrowableArray<intptr_t>* record_token_positions_in, | 356 GrowableArray<intptr_t>* record_token_positions_in, |
| 347 GrowableArray<intptr_t>* record_yield_positions_in); | 357 GrowableArray<intptr_t>* record_yield_positions_in); |
| 348 intptr_t SourceTableSize(); | 358 intptr_t SourceTableSize(); |
| 349 String& SourceTableUriFor(intptr_t index); | 359 String& SourceTableUriFor(intptr_t index); |
| 350 String& GetSourceFor(intptr_t index); | 360 String& GetSourceFor(intptr_t index); |
| 351 Array& GetLineStartsFor(intptr_t index); | 361 Array& GetLineStartsFor(intptr_t index); |
| 352 | 362 |
| 353 private: | 363 private: |
| 354 void DiscoverEnclosingElements(Zone* zone, | 364 void DiscoverEnclosingElements(Zone* zone, |
| 355 const Function& function, | 365 const Function& function, |
| 356 Function* outermost_function); | 366 Function* outermost_function); |
| 357 | 367 |
| 358 /** | 368 void ReadUntilFunctionNode(); |
| 359 * Will return kernel offset for parent class if reading a constructor. | 369 StringIndex GetNameFromVariableDeclaration(intptr_t kernel_offset, |
| 360 * Will otherwise return -1. | 370 const Function& function); |
| 361 */ | |
| 362 intptr_t ReadUntilFunctionNode(); | |
| 363 StringIndex GetNameFromVariableDeclaration(intptr_t kernel_offset); | |
| 364 | 371 |
| 365 FlowGraph* BuildGraphOfStaticFieldInitializer(); | 372 FlowGraph* BuildGraphOfStaticFieldInitializer(); |
| 366 FlowGraph* BuildGraphOfFieldAccessor(LocalVariable* setter_value); | 373 FlowGraph* BuildGraphOfFieldAccessor(LocalVariable* setter_value); |
| 367 void SetupDefaultParameterValues(); | 374 void SetupDefaultParameterValues(); |
| 368 Fragment BuildFieldInitializer(NameIndex canonical_name); | 375 Fragment BuildFieldInitializer(NameIndex canonical_name); |
| 369 Fragment BuildInitializers(intptr_t constructor_class_parent_offset); | 376 Fragment BuildInitializers(const Class& parent_class); |
| 370 FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function); | 377 FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function); |
| 371 FlowGraph* BuildGraphOfConvertedClosureFunction(const Function& function); | 378 FlowGraph* BuildGraphOfConvertedClosureFunction(const Function& function); |
| 372 FlowGraph* BuildGraphOfFunction( | 379 FlowGraph* BuildGraphOfFunction(bool constructor); |
| 373 intptr_t constructor_class_parent_offset = -1); | |
| 374 | 380 |
| 375 Fragment BuildExpression(TokenPosition* position = NULL); | 381 Fragment BuildExpression(TokenPosition* position = NULL); |
| 376 Fragment BuildStatement(); | 382 Fragment BuildStatement(); |
| 377 | 383 |
| 378 intptr_t ReaderOffset(); | 384 intptr_t ReaderOffset(); |
| 379 void SetOffset(intptr_t offset); | 385 void SetOffset(intptr_t offset); |
| 380 void SkipBytes(intptr_t skip); | 386 void SkipBytes(intptr_t skip); |
| 381 bool ReadBool(); | 387 bool ReadBool(); |
| 382 uint8_t ReadByte(); | 388 uint8_t ReadByte(); |
| 383 uint32_t ReadUInt(); | 389 uint32_t ReadUInt(); |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 Fragment BuildForInStatement(bool async); | 616 Fragment BuildForInStatement(bool async); |
| 611 Fragment BuildSwitchStatement(); | 617 Fragment BuildSwitchStatement(); |
| 612 Fragment BuildContinueSwitchStatement(); | 618 Fragment BuildContinueSwitchStatement(); |
| 613 Fragment BuildIfStatement(); | 619 Fragment BuildIfStatement(); |
| 614 Fragment BuildReturnStatement(); | 620 Fragment BuildReturnStatement(); |
| 615 Fragment BuildTryCatch(); | 621 Fragment BuildTryCatch(); |
| 616 Fragment BuildTryFinally(); | 622 Fragment BuildTryFinally(); |
| 617 Fragment BuildYieldStatement(); | 623 Fragment BuildYieldStatement(); |
| 618 Fragment BuildVariableDeclaration(); | 624 Fragment BuildVariableDeclaration(); |
| 619 Fragment BuildFunctionDeclaration(); | 625 Fragment BuildFunctionDeclaration(); |
| 620 Fragment BuildFunctionNode(intptr_t parent_kernel_offset, | 626 Fragment BuildFunctionNode(TokenPosition parent_position, |
| 621 TokenPosition parent_position, | 627 StringIndex name_index); |
| 622 bool declaration, | |
| 623 intptr_t variable_offeset); | |
| 624 void SetupFunctionParameters(const dart::Class& klass, | 628 void SetupFunctionParameters(const dart::Class& klass, |
| 625 const dart::Function& function, | 629 const dart::Function& function, |
| 626 bool is_method, | 630 bool is_method, |
| 627 bool is_closure, | 631 bool is_closure, |
| 628 FunctionNodeHelper* function_node_helper); | 632 FunctionNodeHelper* function_node_helper); |
| 629 | 633 |
| 630 FlowGraphBuilder* flow_graph_builder_; | 634 FlowGraphBuilder* flow_graph_builder_; |
| 631 TranslationHelper& translation_helper_; | 635 TranslationHelper& translation_helper_; |
| 632 Zone* zone_; | 636 Zone* zone_; |
| 633 Reader* reader_; | 637 Reader* reader_; |
| 634 StreamingConstantEvaluator constant_evaluator_; | 638 StreamingConstantEvaluator constant_evaluator_; |
| 635 StreamingDartTypeTranslator type_translator_; | 639 StreamingDartTypeTranslator type_translator_; |
| 640 intptr_t relative_kernel_offset_; |
| 636 intptr_t current_script_id_; | 641 intptr_t current_script_id_; |
| 637 intptr_t record_for_script_id_; | 642 intptr_t record_for_script_id_; |
| 638 GrowableArray<intptr_t>* record_token_positions_into_; | 643 GrowableArray<intptr_t>* record_token_positions_into_; |
| 639 GrowableArray<intptr_t>* record_yield_positions_into_; | 644 GrowableArray<intptr_t>* record_yield_positions_into_; |
| 640 | 645 |
| 641 friend class StreamingConstantEvaluator; | 646 friend class StreamingConstantEvaluator; |
| 642 friend class StreamingDartTypeTranslator; | 647 friend class StreamingDartTypeTranslator; |
| 643 friend class StreamingScopeBuilder; | 648 friend class StreamingScopeBuilder; |
| 644 friend class FunctionNodeHelper; | 649 friend class FunctionNodeHelper; |
| 645 friend class VariableDeclarationHelper; | 650 friend class VariableDeclarationHelper; |
| 646 friend class FieldHelper; | 651 friend class FieldHelper; |
| 647 friend class ProcedureHelper; | 652 friend class ProcedureHelper; |
| 648 friend class ClassHelper; | 653 friend class ClassHelper; |
| 649 friend class LibraryHelper; | 654 friend class LibraryHelper; |
| 650 friend class ConstructorHelper; | 655 friend class ConstructorHelper; |
| 651 friend class SimpleExpressionConverter; | 656 friend class SimpleExpressionConverter; |
| 652 friend class KernelReader; | 657 friend class KernelReader; |
| 653 }; | 658 }; |
| 654 | 659 |
| 655 // A helper class that saves the current reader position, goes to another reader | 660 // A helper class that saves the current reader position, goes to another reader |
| 656 // position, and upon destruction, resets to the original reader position. | 661 // position, and upon destruction, resets to the original reader position. |
| 657 class AlternativeReadingScope { | 662 class AlternativeReadingScope { |
| 658 public: | 663 public: |
| 659 AlternativeReadingScope(Reader* reader, intptr_t new_position) | 664 AlternativeReadingScope(Reader* reader, intptr_t new_position) |
| 660 : reader_(reader), saved_offset_(reader_->offset()) { | 665 : reader_(reader), |
| 666 saved_size_(reader_->size()), |
| 667 saved_raw_buffer_(reader_->raw_buffer()), |
| 668 saved_typed_data_(reader_->typed_data()), |
| 669 saved_offset_(reader_->offset()) { |
| 670 reader_->set_offset(new_position); |
| 671 } |
| 672 |
| 673 AlternativeReadingScope(Reader* reader, |
| 674 const TypedData* new_typed_data, |
| 675 intptr_t new_position) |
| 676 : reader_(reader), |
| 677 saved_size_(reader_->size()), |
| 678 saved_raw_buffer_(reader_->raw_buffer()), |
| 679 saved_typed_data_(reader_->typed_data()), |
| 680 saved_offset_(reader_->offset()) { |
| 681 reader_->set_raw_buffer(NULL); |
| 682 reader_->set_typed_data(new_typed_data); |
| 683 reader_->set_size(new_typed_data->Length()); |
| 661 reader_->set_offset(new_position); | 684 reader_->set_offset(new_position); |
| 662 } | 685 } |
| 663 | 686 |
| 664 explicit AlternativeReadingScope(Reader* reader) | 687 explicit AlternativeReadingScope(Reader* reader) |
| 665 : reader_(reader), saved_offset_(reader_->offset()) {} | 688 : reader_(reader), |
| 689 saved_size_(reader_->size()), |
| 690 saved_raw_buffer_(reader_->raw_buffer()), |
| 691 saved_typed_data_(reader_->typed_data()), |
| 692 saved_offset_(reader_->offset()) {} |
| 666 | 693 |
| 667 ~AlternativeReadingScope() { reader_->set_offset(saved_offset_); } | 694 ~AlternativeReadingScope() { |
| 695 reader_->set_raw_buffer(saved_raw_buffer_); |
| 696 reader_->set_typed_data(saved_typed_data_); |
| 697 reader_->set_size(saved_size_); |
| 698 reader_->set_offset(saved_offset_); |
| 699 } |
| 668 | 700 |
| 669 intptr_t saved_offset() { return saved_offset_; } | 701 intptr_t saved_offset() { return saved_offset_; } |
| 670 | 702 |
| 671 private: | 703 private: |
| 672 Reader* reader_; | 704 Reader* reader_; |
| 705 intptr_t saved_size_; |
| 706 const uint8_t* saved_raw_buffer_; |
| 707 const TypedData* saved_typed_data_; |
| 673 intptr_t saved_offset_; | 708 intptr_t saved_offset_; |
| 674 }; | 709 }; |
| 675 | 710 |
| 676 // Helper class that reads a kernel FunctionNode from binary. | 711 // Helper class that reads a kernel FunctionNode from binary. |
| 677 // | 712 // |
| 678 // Use ReadUntilExcluding to read up to but not including a field. | 713 // Use ReadUntilExcluding to read up to but not including a field. |
| 679 // One can then for instance read the field from the call-site (and remember to | 714 // One can then for instance read the field from the call-site (and remember to |
| 680 // call SetAt to inform this helper class), and then use this to read more. | 715 // call SetAt to inform this helper class), and then use this to read more. |
| 681 // "Dumb" fields are stored (e.g. integers) and can be fetched from this class. | 716 // "Dumb" fields are stored (e.g. integers) and can be fetched from this class. |
| 682 // If asked to read a "non-dumb" field (e.g. an expression) it will be skipped. | 717 // If asked to read a "non-dumb" field (e.g. an expression) it will be skipped. |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 // "Dumb" fields are stored (e.g. integers) and can be fetched from this class. | 903 // "Dumb" fields are stored (e.g. integers) and can be fetched from this class. |
| 869 // If asked to read a "non-dumb" field (e.g. an expression) it will be skipped. | 904 // If asked to read a "non-dumb" field (e.g. an expression) it will be skipped. |
| 870 class FieldHelper { | 905 class FieldHelper { |
| 871 public: | 906 public: |
| 872 enum Fields { | 907 enum Fields { |
| 873 kStart, // tag. | 908 kStart, // tag. |
| 874 kCanonicalName, | 909 kCanonicalName, |
| 875 kPosition, | 910 kPosition, |
| 876 kEndPosition, | 911 kEndPosition, |
| 877 kFlags, | 912 kFlags, |
| 878 kParentClassBinaryOffset, | |
| 879 kName, | 913 kName, |
| 880 kSourceUriIndex, | 914 kSourceUriIndex, |
| 881 kDocumentationCommentIndex, | 915 kDocumentationCommentIndex, |
| 882 kAnnotations, | 916 kAnnotations, |
| 883 kType, | 917 kType, |
| 884 kInitializer, | 918 kInitializer, |
| 885 kEnd | 919 kEnd |
| 886 }; | 920 }; |
| 887 | 921 |
| 888 explicit FieldHelper(StreamingFlowGraphBuilder* builder) | 922 explicit FieldHelper(StreamingFlowGraphBuilder* builder) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 918 if (++next_read_ == field) return; | 952 if (++next_read_ == field) return; |
| 919 case kPosition: | 953 case kPosition: |
| 920 position_ = builder_->ReadPosition(false); // read position. | 954 position_ = builder_->ReadPosition(false); // read position. |
| 921 if (++next_read_ == field) return; | 955 if (++next_read_ == field) return; |
| 922 case kEndPosition: | 956 case kEndPosition: |
| 923 end_position_ = builder_->ReadPosition(false); // read end position. | 957 end_position_ = builder_->ReadPosition(false); // read end position. |
| 924 if (++next_read_ == field) return; | 958 if (++next_read_ == field) return; |
| 925 case kFlags: | 959 case kFlags: |
| 926 flags_ = builder_->ReadFlags(); // read flags. | 960 flags_ = builder_->ReadFlags(); // read flags. |
| 927 if (++next_read_ == field) return; | 961 if (++next_read_ == field) return; |
| 928 case kParentClassBinaryOffset: | |
| 929 parent_class_binary_offset_ = | |
| 930 builder_->ReadUInt(); // read parent class binary offset. | |
| 931 if (++next_read_ == field) return; | |
| 932 case kName: | 962 case kName: |
| 933 builder_->SkipName(); // read name. | 963 builder_->SkipName(); // read name. |
| 934 if (++next_read_ == field) return; | 964 if (++next_read_ == field) return; |
| 935 case kSourceUriIndex: | 965 case kSourceUriIndex: |
| 936 source_uri_index_ = builder_->ReadUInt(); // read source_uri_index. | 966 source_uri_index_ = builder_->ReadUInt(); // read source_uri_index. |
| 937 builder_->current_script_id_ = source_uri_index_; | 967 builder_->current_script_id_ = source_uri_index_; |
| 938 builder_->record_token_position(position_); | 968 builder_->record_token_position(position_); |
| 939 builder_->record_token_position(end_position_); | 969 builder_->record_token_position(end_position_); |
| 940 if (++next_read_ == field) return; | 970 if (++next_read_ == field) return; |
| 941 case kDocumentationCommentIndex: | 971 case kDocumentationCommentIndex: |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 992 *start = function_literal_start_; | 1022 *start = function_literal_start_; |
| 993 *end = function_literal_end_; | 1023 *end = function_literal_end_; |
| 994 } | 1024 } |
| 995 return has_function_literal_initializer_; | 1025 return has_function_literal_initializer_; |
| 996 } | 1026 } |
| 997 | 1027 |
| 998 NameIndex canonical_name_; | 1028 NameIndex canonical_name_; |
| 999 TokenPosition position_; | 1029 TokenPosition position_; |
| 1000 TokenPosition end_position_; | 1030 TokenPosition end_position_; |
| 1001 word flags_; | 1031 word flags_; |
| 1002 intptr_t parent_class_binary_offset_; | |
| 1003 intptr_t source_uri_index_; | 1032 intptr_t source_uri_index_; |
| 1004 intptr_t annotation_count_; | 1033 intptr_t annotation_count_; |
| 1005 | 1034 |
| 1006 private: | 1035 private: |
| 1007 StreamingFlowGraphBuilder* builder_; | 1036 StreamingFlowGraphBuilder* builder_; |
| 1008 intptr_t next_read_; | 1037 intptr_t next_read_; |
| 1009 | 1038 |
| 1010 bool has_function_literal_initializer_; | 1039 bool has_function_literal_initializer_; |
| 1011 TokenPosition function_literal_start_; | 1040 TokenPosition function_literal_start_; |
| 1012 TokenPosition function_literal_end_; | 1041 TokenPosition function_literal_end_; |
| 1013 }; | 1042 }; |
| 1014 | 1043 |
| 1015 // Helper class that reads a kernel Procedure from binary. | 1044 // Helper class that reads a kernel Procedure from binary. |
| 1016 // | 1045 // |
| 1017 // Use ReadUntilExcluding to read up to but not including a field. | 1046 // Use ReadUntilExcluding to read up to but not including a field. |
| 1018 // One can then for instance read the field from the call-site (and remember to | 1047 // One can then for instance read the field from the call-site (and remember to |
| 1019 // call SetAt to inform this helper class), and then use this to read more. | 1048 // call SetAt to inform this helper class), and then use this to read more. |
| 1020 // "Dumb" fields are stored (e.g. integers) and can be fetched from this class. | 1049 // "Dumb" fields are stored (e.g. integers) and can be fetched from this class. |
| 1021 // If asked to read a "non-dumb" field (e.g. an expression) it will be skipped. | 1050 // If asked to read a "non-dumb" field (e.g. an expression) it will be skipped. |
| 1022 class ProcedureHelper { | 1051 class ProcedureHelper { |
| 1023 public: | 1052 public: |
| 1024 enum Fields { | 1053 enum Fields { |
| 1025 kStart, // tag. | 1054 kStart, // tag. |
| 1026 kCanonicalName, | 1055 kCanonicalName, |
| 1027 kPosition, | 1056 kPosition, |
| 1028 kEndPosition, | 1057 kEndPosition, |
| 1029 kKind, | 1058 kKind, |
| 1030 kFlags, | 1059 kFlags, |
| 1031 kParentClassBinaryOffset, | |
| 1032 kName, | 1060 kName, |
| 1033 kSourceUriIndex, | 1061 kSourceUriIndex, |
| 1034 kDocumentationCommentIndex, | 1062 kDocumentationCommentIndex, |
| 1035 kAnnotations, | 1063 kAnnotations, |
| 1036 kFunction, | 1064 kFunction, |
| 1037 kEnd | 1065 kEnd |
| 1038 }; | 1066 }; |
| 1039 | 1067 |
| 1040 explicit ProcedureHelper(StreamingFlowGraphBuilder* builder) { | 1068 explicit ProcedureHelper(StreamingFlowGraphBuilder* builder) { |
| 1041 builder_ = builder; | 1069 builder_ = builder; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1066 case kEndPosition: | 1094 case kEndPosition: |
| 1067 end_position_ = builder_->ReadPosition(false); // read end position. | 1095 end_position_ = builder_->ReadPosition(false); // read end position. |
| 1068 if (++next_read_ == field) return; | 1096 if (++next_read_ == field) return; |
| 1069 case kKind: | 1097 case kKind: |
| 1070 kind_ = static_cast<Procedure::ProcedureKind>( | 1098 kind_ = static_cast<Procedure::ProcedureKind>( |
| 1071 builder_->ReadByte()); // read kind. | 1099 builder_->ReadByte()); // read kind. |
| 1072 if (++next_read_ == field) return; | 1100 if (++next_read_ == field) return; |
| 1073 case kFlags: | 1101 case kFlags: |
| 1074 flags_ = builder_->ReadFlags(); // read flags. | 1102 flags_ = builder_->ReadFlags(); // read flags. |
| 1075 if (++next_read_ == field) return; | 1103 if (++next_read_ == field) return; |
| 1076 case kParentClassBinaryOffset: | |
| 1077 parent_class_binary_offset_ = | |
| 1078 builder_->ReadUInt(); // read parent class binary offset. | |
| 1079 if (++next_read_ == field) return; | |
| 1080 case kName: | 1104 case kName: |
| 1081 builder_->SkipName(); // read name. | 1105 builder_->SkipName(); // read name. |
| 1082 if (++next_read_ == field) return; | 1106 if (++next_read_ == field) return; |
| 1083 case kSourceUriIndex: | 1107 case kSourceUriIndex: |
| 1084 source_uri_index_ = builder_->ReadUInt(); // read source_uri_index. | 1108 source_uri_index_ = builder_->ReadUInt(); // read source_uri_index. |
| 1085 builder_->current_script_id_ = source_uri_index_; | 1109 builder_->current_script_id_ = source_uri_index_; |
| 1086 builder_->record_token_position(position_); | 1110 builder_->record_token_position(position_); |
| 1087 builder_->record_token_position(end_position_); | 1111 builder_->record_token_position(end_position_); |
| 1088 if (++next_read_ == field) return; | 1112 if (++next_read_ == field) return; |
| 1089 case kDocumentationCommentIndex: | 1113 case kDocumentationCommentIndex: |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1122 } | 1146 } |
| 1123 bool IsConst() { | 1147 bool IsConst() { |
| 1124 return (flags_ & Procedure::kFlagConst) == Procedure::kFlagConst; | 1148 return (flags_ & Procedure::kFlagConst) == Procedure::kFlagConst; |
| 1125 } | 1149 } |
| 1126 | 1150 |
| 1127 NameIndex canonical_name_; | 1151 NameIndex canonical_name_; |
| 1128 TokenPosition position_; | 1152 TokenPosition position_; |
| 1129 TokenPosition end_position_; | 1153 TokenPosition end_position_; |
| 1130 Procedure::ProcedureKind kind_; | 1154 Procedure::ProcedureKind kind_; |
| 1131 word flags_; | 1155 word flags_; |
| 1132 intptr_t parent_class_binary_offset_; | |
| 1133 intptr_t source_uri_index_; | 1156 intptr_t source_uri_index_; |
| 1134 intptr_t annotation_count_; | 1157 intptr_t annotation_count_; |
| 1135 | 1158 |
| 1136 private: | 1159 private: |
| 1137 StreamingFlowGraphBuilder* builder_; | 1160 StreamingFlowGraphBuilder* builder_; |
| 1138 intptr_t next_read_; | 1161 intptr_t next_read_; |
| 1139 }; | 1162 }; |
| 1140 | 1163 |
| 1141 // Helper class that reads a kernel Constructor from binary. | 1164 // Helper class that reads a kernel Constructor from binary. |
| 1142 // | 1165 // |
| 1143 // Use ReadUntilExcluding to read up to but not including a field. | 1166 // Use ReadUntilExcluding to read up to but not including a field. |
| 1144 // One can then for instance read the field from the call-site (and remember to | 1167 // One can then for instance read the field from the call-site (and remember to |
| 1145 // call SetAt to inform this helper class), and then use this to read more. | 1168 // call SetAt to inform this helper class), and then use this to read more. |
| 1146 // "Dumb" fields are stored (e.g. integers) and can be fetched from this class. | 1169 // "Dumb" fields are stored (e.g. integers) and can be fetched from this class. |
| 1147 // If asked to read a "non-dumb" field (e.g. an expression) it will be skipped. | 1170 // If asked to read a "non-dumb" field (e.g. an expression) it will be skipped. |
| 1148 class ConstructorHelper { | 1171 class ConstructorHelper { |
| 1149 public: | 1172 public: |
| 1150 enum Fields { | 1173 enum Fields { |
| 1151 kStart, // tag. | 1174 kStart, // tag. |
| 1152 kCanonicalName, | 1175 kCanonicalName, |
| 1153 kPosition, | 1176 kPosition, |
| 1154 kEndPosition, | 1177 kEndPosition, |
| 1155 kFlags, | 1178 kFlags, |
| 1156 kParentClassBinaryOffset, | |
| 1157 kName, | 1179 kName, |
| 1158 kDocumentationCommentIndex, | 1180 kDocumentationCommentIndex, |
| 1159 kAnnotations, | 1181 kAnnotations, |
| 1160 kFunction, | 1182 kFunction, |
| 1161 kInitializers, | 1183 kInitializers, |
| 1162 kEnd | 1184 kEnd |
| 1163 }; | 1185 }; |
| 1164 | 1186 |
| 1165 explicit ConstructorHelper(StreamingFlowGraphBuilder* builder) { | 1187 explicit ConstructorHelper(StreamingFlowGraphBuilder* builder) { |
| 1166 builder_ = builder; | 1188 builder_ = builder; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1187 if (++next_read_ == field) return; | 1209 if (++next_read_ == field) return; |
| 1188 case kPosition: | 1210 case kPosition: |
| 1189 position_ = builder_->ReadPosition(); // read position. | 1211 position_ = builder_->ReadPosition(); // read position. |
| 1190 if (++next_read_ == field) return; | 1212 if (++next_read_ == field) return; |
| 1191 case kEndPosition: | 1213 case kEndPosition: |
| 1192 end_position_ = builder_->ReadPosition(); // read end position. | 1214 end_position_ = builder_->ReadPosition(); // read end position. |
| 1193 if (++next_read_ == field) return; | 1215 if (++next_read_ == field) return; |
| 1194 case kFlags: | 1216 case kFlags: |
| 1195 flags_ = builder_->ReadFlags(); // read flags. | 1217 flags_ = builder_->ReadFlags(); // read flags. |
| 1196 if (++next_read_ == field) return; | 1218 if (++next_read_ == field) return; |
| 1197 case kParentClassBinaryOffset: | |
| 1198 parent_class_binary_offset_ = | |
| 1199 builder_->ReadUInt(); // read parent class binary offset. | |
| 1200 if (++next_read_ == field) return; | |
| 1201 case kName: | 1219 case kName: |
| 1202 builder_->SkipName(); // read name. | 1220 builder_->SkipName(); // read name. |
| 1203 if (++next_read_ == field) return; | 1221 if (++next_read_ == field) return; |
| 1204 case kDocumentationCommentIndex: | 1222 case kDocumentationCommentIndex: |
| 1205 builder_->ReadStringReference(); | 1223 builder_->ReadStringReference(); |
| 1206 if (++next_read_ == field) return; | 1224 if (++next_read_ == field) return; |
| 1207 case kAnnotations: { | 1225 case kAnnotations: { |
| 1208 annotation_count_ = builder_->ReadListLength(); // read list length. | 1226 annotation_count_ = builder_->ReadListLength(); // read list length. |
| 1209 for (intptr_t i = 0; i < annotation_count_; ++i) { | 1227 for (intptr_t i = 0; i < annotation_count_; ++i) { |
| 1210 builder_->SkipExpression(); // read ith expression. | 1228 builder_->SkipExpression(); // read ith expression. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1259 return (flags_ & Constructor::kFlagExternal) == Constructor::kFlagExternal; | 1277 return (flags_ & Constructor::kFlagExternal) == Constructor::kFlagExternal; |
| 1260 } | 1278 } |
| 1261 bool IsConst() { | 1279 bool IsConst() { |
| 1262 return (flags_ & Constructor::kFlagConst) == Constructor::kFlagConst; | 1280 return (flags_ & Constructor::kFlagConst) == Constructor::kFlagConst; |
| 1263 } | 1281 } |
| 1264 | 1282 |
| 1265 NameIndex canonical_name_; | 1283 NameIndex canonical_name_; |
| 1266 TokenPosition position_; | 1284 TokenPosition position_; |
| 1267 TokenPosition end_position_; | 1285 TokenPosition end_position_; |
| 1268 word flags_; | 1286 word flags_; |
| 1269 intptr_t parent_class_binary_offset_; | |
| 1270 intptr_t annotation_count_; | 1287 intptr_t annotation_count_; |
| 1271 | 1288 |
| 1272 private: | 1289 private: |
| 1273 StreamingFlowGraphBuilder* builder_; | 1290 StreamingFlowGraphBuilder* builder_; |
| 1274 intptr_t next_read_; | 1291 intptr_t next_read_; |
| 1275 }; | 1292 }; |
| 1276 | 1293 |
| 1277 // Helper class that reads a kernel Class from binary. | 1294 // Helper class that reads a kernel Class from binary. |
| 1278 // | 1295 // |
| 1279 // Use ReadUntilExcluding to read up to but not including a field. | 1296 // Use ReadUntilExcluding to read up to but not including a field. |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1548 private: | 1565 private: |
| 1549 StreamingFlowGraphBuilder* builder_; | 1566 StreamingFlowGraphBuilder* builder_; |
| 1550 intptr_t next_read_; | 1567 intptr_t next_read_; |
| 1551 }; | 1568 }; |
| 1552 | 1569 |
| 1553 } // namespace kernel | 1570 } // namespace kernel |
| 1554 } // namespace dart | 1571 } // namespace dart |
| 1555 | 1572 |
| 1556 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1573 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| 1557 #endif // RUNTIME_VM_KERNEL_BINARY_FLOWGRAPH_H_ | 1574 #endif // RUNTIME_VM_KERNEL_BINARY_FLOWGRAPH_H_ |
| OLD | NEW |