OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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_TO_IL_H_ | 5 #ifndef RUNTIME_VM_KERNEL_TO_IL_H_ |
6 #define RUNTIME_VM_KERNEL_TO_IL_H_ | 6 #define RUNTIME_VM_KERNEL_TO_IL_H_ |
7 | 7 |
8 #if !defined(DART_PRECOMPILED_RUNTIME) | 8 #if !defined(DART_PRECOMPILED_RUNTIME) |
9 | 9 |
10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 typedef ZoneGrowableArray<PushArgumentInstr*>* ArgumentArray; | 192 typedef ZoneGrowableArray<PushArgumentInstr*>* ArgumentArray; |
193 | 193 |
194 | 194 |
195 class ActiveClass { | 195 class ActiveClass { |
196 public: | 196 public: |
197 ActiveClass() | 197 ActiveClass() |
198 : kernel_class(NULL), | 198 : kernel_class(NULL), |
199 class_type_parameters(0), | 199 class_type_parameters(0), |
200 class_type_parameters_offset_start(-1), | 200 class_type_parameters_offset_start(-1), |
201 klass(NULL), | 201 klass(NULL), |
202 member(NULL), | |
203 member_is_procedure(false), | 202 member_is_procedure(false), |
204 member_is_factory_procedure(false), | 203 member_is_factory_procedure(false), |
205 member_type_parameters(0), | 204 member_type_parameters(0), |
206 member_type_parameters_offset_start(-1) {} | 205 member_type_parameters_offset_start(-1) {} |
207 | 206 |
208 // The current enclosing kernel class (if available, otherwise NULL). | 207 // The current enclosing kernel class (if available, otherwise NULL). |
209 Class* kernel_class; | 208 Class* kernel_class; |
210 intptr_t class_type_parameters; | 209 intptr_t class_type_parameters; |
211 intptr_t class_type_parameters_offset_start; | 210 intptr_t class_type_parameters_offset_start; |
212 | 211 |
213 // The current enclosing class (or the library top-level class). When this is | 212 // The current enclosing class (or the library top-level class). When this is |
214 // a library's top-level class, the kernel_class will be NULL. | 213 // a library's top-level class, the kernel_class will be NULL. |
215 const dart::Class* klass; | 214 const dart::Class* klass; |
216 | 215 |
217 // The enclosing member (e.g., Constructor, Procedure, or Field) if there | |
218 // is one. | |
219 Member* member; | |
220 bool member_is_procedure; | 216 bool member_is_procedure; |
221 bool member_is_factory_procedure; | 217 bool member_is_factory_procedure; |
222 intptr_t member_type_parameters; | 218 intptr_t member_type_parameters; |
223 intptr_t member_type_parameters_offset_start; | 219 intptr_t member_type_parameters_offset_start; |
224 }; | 220 }; |
225 | 221 |
226 | 222 |
227 class ActiveClassScope { | 223 class ActiveClassScope { |
228 public: | 224 public: |
229 ActiveClassScope(ActiveClass* active_class, | 225 ActiveClassScope(ActiveClass* active_class, |
230 intptr_t class_type_parameters, | 226 intptr_t class_type_parameters, |
231 intptr_t class_type_parameters_offset_start, | 227 intptr_t class_type_parameters_offset_start, |
232 const dart::Class* klass) | 228 const dart::Class* klass) |
233 : active_class_(active_class), saved_(*active_class) { | 229 : active_class_(active_class), saved_(*active_class) { |
234 active_class_->kernel_class = NULL; | 230 active_class_->kernel_class = NULL; |
235 active_class_->class_type_parameters = class_type_parameters; | 231 active_class_->class_type_parameters = class_type_parameters; |
236 active_class_->class_type_parameters_offset_start = | 232 active_class_->class_type_parameters_offset_start = |
237 class_type_parameters_offset_start; | 233 class_type_parameters_offset_start; |
238 active_class_->klass = klass; | 234 active_class_->klass = klass; |
239 active_class_->member = NULL; | |
240 } | 235 } |
241 | 236 |
242 ~ActiveClassScope() { *active_class_ = saved_; } | 237 ~ActiveClassScope() { *active_class_ = saved_; } |
243 | 238 |
244 private: | 239 private: |
245 ActiveClass* active_class_; | 240 ActiveClass* active_class_; |
246 ActiveClass saved_; | 241 ActiveClass saved_; |
247 }; | 242 }; |
248 | 243 |
249 | 244 |
250 class ActiveMemberScope { | 245 class ActiveMemberScope { |
251 public: | 246 public: |
252 ActiveMemberScope(ActiveClass* active_class, | 247 ActiveMemberScope(ActiveClass* active_class, |
253 bool member_is_procedure, | 248 bool member_is_procedure, |
254 bool member_is_factory_procedure, | 249 bool member_is_factory_procedure, |
255 intptr_t member_type_parameters, | 250 intptr_t member_type_parameters, |
256 intptr_t member_type_parameters_offset_start) | 251 intptr_t member_type_parameters_offset_start) |
257 : active_class_(active_class), saved_(*active_class) { | 252 : active_class_(active_class), saved_(*active_class) { |
258 // The class and kernel_class is inherited. | 253 // The class and kernel_class is inherited. |
259 active_class_->member = NULL; | |
260 active_class_->member_is_procedure = member_is_procedure; | 254 active_class_->member_is_procedure = member_is_procedure; |
261 active_class_->member_is_factory_procedure = member_is_factory_procedure; | 255 active_class_->member_is_factory_procedure = member_is_factory_procedure; |
262 active_class_->member_type_parameters = member_type_parameters; | 256 active_class_->member_type_parameters = member_type_parameters; |
263 active_class_->member_type_parameters_offset_start = | 257 active_class_->member_type_parameters_offset_start = |
264 member_type_parameters_offset_start; | 258 member_type_parameters_offset_start; |
265 } | 259 } |
266 | 260 |
267 ~ActiveMemberScope() { *active_class_ = saved_; } | 261 ~ActiveMemberScope() { *active_class_ = saved_; } |
268 | 262 |
269 private: | 263 private: |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 dart::String& DartSymbol(StringIndex string_index) const; | 338 dart::String& DartSymbol(StringIndex string_index) const; |
345 dart::String& DartSymbol(const uint8_t* utf8_array, intptr_t len) const; | 339 dart::String& DartSymbol(const uint8_t* utf8_array, intptr_t len) const; |
346 | 340 |
347 const dart::String& DartClassName(NameIndex kernel_class); | 341 const dart::String& DartClassName(NameIndex kernel_class); |
348 | 342 |
349 const dart::String& DartConstructorName(NameIndex constructor); | 343 const dart::String& DartConstructorName(NameIndex constructor); |
350 | 344 |
351 const dart::String& DartProcedureName(NameIndex procedure); | 345 const dart::String& DartProcedureName(NameIndex procedure); |
352 | 346 |
353 const dart::String& DartSetterName(NameIndex setter); | 347 const dart::String& DartSetterName(NameIndex setter); |
354 const dart::String& DartSetterName(Name* setter_name); | |
355 const dart::String& DartSetterName(NameIndex parent, StringIndex setter); | 348 const dart::String& DartSetterName(NameIndex parent, StringIndex setter); |
356 | 349 |
357 const dart::String& DartGetterName(NameIndex getter); | 350 const dart::String& DartGetterName(NameIndex getter); |
358 const dart::String& DartGetterName(Name* getter_name); | |
359 const dart::String& DartGetterName(NameIndex parent, StringIndex getter); | 351 const dart::String& DartGetterName(NameIndex parent, StringIndex getter); |
360 | 352 |
361 const dart::String& DartFieldName(Name* kernel_name); | |
362 const dart::String& DartFieldName(NameIndex parent, StringIndex field); | 353 const dart::String& DartFieldName(NameIndex parent, StringIndex field); |
363 | 354 |
364 const dart::String& DartInitializerName(Name* kernel_name); | |
365 | |
366 const dart::String& DartMethodName(NameIndex method); | 355 const dart::String& DartMethodName(NameIndex method); |
367 const dart::String& DartMethodName(Name* method_name); | |
368 const dart::String& DartMethodName(NameIndex parent, StringIndex method); | 356 const dart::String& DartMethodName(NameIndex parent, StringIndex method); |
369 | 357 |
370 const dart::String& DartFactoryName(NameIndex factory); | 358 const dart::String& DartFactoryName(NameIndex factory); |
371 | 359 |
372 const Array& ArgumentNames(List<NamedExpression>* named); | |
373 | |
374 // A subclass overrides these when reading in the Kernel program in order to | 360 // A subclass overrides these when reading in the Kernel program in order to |
375 // support recursive type expressions (e.g. for "implements X" ... | 361 // support recursive type expressions (e.g. for "implements X" ... |
376 // annotations). | 362 // annotations). |
377 virtual RawLibrary* LookupLibraryByKernelLibrary(NameIndex library); | 363 virtual RawLibrary* LookupLibraryByKernelLibrary(NameIndex library); |
378 virtual RawClass* LookupClassByKernelClass(NameIndex klass); | 364 virtual RawClass* LookupClassByKernelClass(NameIndex klass); |
379 | 365 |
380 RawField* LookupFieldByKernelField(NameIndex field); | 366 RawField* LookupFieldByKernelField(NameIndex field); |
381 RawFunction* LookupStaticMethodByKernelProcedure(NameIndex procedure); | 367 RawFunction* LookupStaticMethodByKernelProcedure(NameIndex procedure); |
382 RawFunction* LookupConstructorByKernelConstructor(NameIndex constructor); | 368 RawFunction* LookupConstructorByKernelConstructor(NameIndex constructor); |
383 dart::RawFunction* LookupConstructorByKernelConstructor( | 369 dart::RawFunction* LookupConstructorByKernelConstructor( |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 Fragment CheckStackOverflow(); | 537 Fragment CheckStackOverflow(); |
552 Fragment CloneContext(); | 538 Fragment CloneContext(); |
553 Fragment Constant(const Object& value); | 539 Fragment Constant(const Object& value); |
554 Fragment CreateArray(); | 540 Fragment CreateArray(); |
555 Fragment Goto(JoinEntryInstr* destination); | 541 Fragment Goto(JoinEntryInstr* destination); |
556 Fragment IntConstant(int64_t value); | 542 Fragment IntConstant(int64_t value); |
557 Fragment InstanceCall(TokenPosition position, | 543 Fragment InstanceCall(TokenPosition position, |
558 const dart::String& name, | 544 const dart::String& name, |
559 Token::Kind kind, | 545 Token::Kind kind, |
560 intptr_t argument_count, | 546 intptr_t argument_count, |
561 intptr_t num_args_checked = 1); | 547 intptr_t checked_argument_count = 1); |
562 Fragment InstanceCall(TokenPosition position, | 548 Fragment InstanceCall(TokenPosition position, |
563 const dart::String& name, | 549 const dart::String& name, |
564 Token::Kind kind, | 550 Token::Kind kind, |
565 intptr_t argument_count, | 551 intptr_t argument_count, |
566 const Array& argument_names, | 552 const Array& argument_names, |
567 intptr_t num_args_checked = 1); | 553 intptr_t checked_argument_count = 1); |
568 Fragment ClosureCall(intptr_t type_args_len, | 554 Fragment ClosureCall(intptr_t type_args_len, |
569 intptr_t argument_count, | 555 intptr_t argument_count, |
570 const Array& argument_names); | 556 const Array& argument_names); |
571 Fragment ThrowException(TokenPosition position); | 557 Fragment ThrowException(TokenPosition position); |
572 Fragment RethrowException(TokenPosition position, int catch_try_index); | 558 Fragment RethrowException(TokenPosition position, int catch_try_index); |
573 Fragment LoadClassId(); | 559 Fragment LoadClassId(); |
574 Fragment LoadField(const dart::Field& field); | 560 Fragment LoadField(const dart::Field& field); |
575 Fragment LoadField(intptr_t offset, intptr_t class_id = kDynamicCid); | 561 Fragment LoadField(intptr_t offset, intptr_t class_id = kDynamicCid); |
576 Fragment LoadNativeField(MethodRecognizer::Kind kind, | 562 Fragment LoadNativeField(MethodRecognizer::Kind kind, |
577 intptr_t offset, | 563 intptr_t offset, |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 friend class StreamingFlowGraphBuilder; | 724 friend class StreamingFlowGraphBuilder; |
739 friend class ScopeBuilder; | 725 friend class ScopeBuilder; |
740 friend class SwitchBlock; | 726 friend class SwitchBlock; |
741 friend class TryCatchBlock; | 727 friend class TryCatchBlock; |
742 friend class TryFinallyBlock; | 728 friend class TryFinallyBlock; |
743 }; | 729 }; |
744 | 730 |
745 | 731 |
746 class SwitchBlock { | 732 class SwitchBlock { |
747 public: | 733 public: |
748 SwitchBlock(FlowGraphBuilder* builder, intptr_t num_cases) | 734 SwitchBlock(FlowGraphBuilder* builder, intptr_t case_count) |
749 : builder_(builder), | 735 : builder_(builder), |
750 outer_(builder->switch_block_), | 736 outer_(builder->switch_block_), |
751 outer_finally_(builder->try_finally_block_), | 737 outer_finally_(builder->try_finally_block_), |
752 num_cases_(num_cases), | 738 case_count_(case_count), |
753 context_depth_(builder->context_depth_), | 739 context_depth_(builder->context_depth_), |
754 try_index_(builder->CurrentTryIndex()) { | 740 try_index_(builder->CurrentTryIndex()) { |
755 builder_->switch_block_ = this; | 741 builder_->switch_block_ = this; |
756 if (outer_ != NULL) { | 742 if (outer_ != NULL) { |
757 depth_ = outer_->depth_ + outer_->num_cases_; | 743 depth_ = outer_->depth_ + outer_->case_count_; |
758 } else { | 744 } else { |
759 depth_ = 0; | 745 depth_ = 0; |
760 } | 746 } |
761 } | 747 } |
762 ~SwitchBlock() { builder_->switch_block_ = outer_; } | 748 ~SwitchBlock() { builder_->switch_block_ = outer_; } |
763 | 749 |
764 bool HadJumper(intptr_t case_num) { | 750 bool HadJumper(intptr_t case_num) { |
765 return destinations_.Lookup(case_num) != NULL; | 751 return destinations_.Lookup(case_num) != NULL; |
766 } | 752 } |
767 | 753 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 } | 797 } |
812 return cached_inst; | 798 return cached_inst; |
813 } | 799 } |
814 | 800 |
815 FlowGraphBuilder* builder_; | 801 FlowGraphBuilder* builder_; |
816 SwitchBlock* outer_; | 802 SwitchBlock* outer_; |
817 | 803 |
818 IntMap<JoinEntryInstr*> destinations_; | 804 IntMap<JoinEntryInstr*> destinations_; |
819 | 805 |
820 TryFinallyBlock* outer_finally_; | 806 TryFinallyBlock* outer_finally_; |
821 intptr_t num_cases_; | 807 intptr_t case_count_; |
822 intptr_t depth_; | 808 intptr_t depth_; |
823 intptr_t context_depth_; | 809 intptr_t context_depth_; |
824 intptr_t try_index_; | 810 intptr_t try_index_; |
825 }; | 811 }; |
826 | 812 |
827 | 813 |
828 class TryCatchBlock { | 814 class TryCatchBlock { |
829 public: | 815 public: |
830 explicit TryCatchBlock(FlowGraphBuilder* builder, | 816 explicit TryCatchBlock(FlowGraphBuilder* builder, |
831 intptr_t try_handler_index = -1) | 817 intptr_t try_handler_index = -1) |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 FlowGraphBuilder* builder_; | 941 FlowGraphBuilder* builder_; |
956 CatchBlock* outer_; | 942 CatchBlock* outer_; |
957 LocalVariable* exception_var_; | 943 LocalVariable* exception_var_; |
958 LocalVariable* stack_trace_var_; | 944 LocalVariable* stack_trace_var_; |
959 intptr_t catch_try_index_; | 945 intptr_t catch_try_index_; |
960 }; | 946 }; |
961 | 947 |
962 | 948 |
963 RawObject* EvaluateMetadata(const dart::Field& metadata_field); | 949 RawObject* EvaluateMetadata(const dart::Field& metadata_field); |
964 RawObject* BuildParameterDescriptor(const Function& function); | 950 RawObject* BuildParameterDescriptor(const Function& function); |
| 951 void CollectTokenPositionsFor(const Script& script); |
| 952 String& GetSourceFor(const Script& script); |
| 953 Array& GetLineStartsFor(const Script& script); |
965 | 954 |
966 | 955 |
967 } // namespace kernel | 956 } // namespace kernel |
968 } // namespace dart | 957 } // namespace dart |
969 | 958 |
970 #else // !defined(DART_PRECOMPILED_RUNTIME) | 959 #else // !defined(DART_PRECOMPILED_RUNTIME) |
971 | 960 |
972 #include "vm/object.h" | 961 #include "vm/object.h" |
973 #include "vm/kernel.h" | 962 #include "vm/kernel.h" |
974 | 963 |
975 namespace dart { | 964 namespace dart { |
976 namespace kernel { | 965 namespace kernel { |
977 | 966 |
978 RawObject* EvaluateMetadata(const dart::Field& metadata_field); | 967 RawObject* EvaluateMetadata(const dart::Field& metadata_field); |
979 RawObject* BuildParameterDescriptor(const Function& function); | 968 RawObject* BuildParameterDescriptor(const Function& function); |
980 | 969 |
981 } // namespace kernel | 970 } // namespace kernel |
982 } // namespace dart | 971 } // namespace dart |
983 | 972 |
984 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 973 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
985 #endif // RUNTIME_VM_KERNEL_TO_IL_H_ | 974 #endif // RUNTIME_VM_KERNEL_TO_IL_H_ |
OLD | NEW |