| 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 #include "vm/kernel_reader.h" | 5 #include "vm/kernel_reader.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 | 77 |
| 78 private: | 78 private: |
| 79 TranslationHelper translation_helper_; | 79 TranslationHelper translation_helper_; |
| 80 dart::Zone* zone_; | 80 dart::Zone* zone_; |
| 81 bool is_simple_; | 81 bool is_simple_; |
| 82 dart::Instance* simple_value_; | 82 dart::Instance* simple_value_; |
| 83 }; | 83 }; |
| 84 | 84 |
| 85 | 85 |
| 86 RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( | 86 RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( |
| 87 CanonicalName* library) { | 87 Library* library) { |
| 88 return reader_->LookupLibrary(library).raw(); | 88 return reader_->LookupLibrary(library).raw(); |
| 89 } | 89 } |
| 90 | 90 |
| 91 | 91 |
| 92 RawClass* BuildingTranslationHelper::LookupClassByKernelClass( | 92 RawClass* BuildingTranslationHelper::LookupClassByKernelClass(Class* klass) { |
| 93 CanonicalName* klass) { | |
| 94 return reader_->LookupClass(klass).raw(); | 93 return reader_->LookupClass(klass).raw(); |
| 95 } | 94 } |
| 96 | 95 |
| 97 KernelReader::KernelReader(Program* program) | 96 KernelReader::KernelReader(Program* program) |
| 98 : program_(program), | 97 : program_(program), |
| 99 thread_(dart::Thread::Current()), | 98 thread_(dart::Thread::Current()), |
| 100 zone_(thread_->zone()), | 99 zone_(thread_->zone()), |
| 101 isolate_(thread_->isolate()), | 100 isolate_(thread_->isolate()), |
| 102 scripts_(Array::ZoneHandle(zone_)), | 101 scripts_(Array::ZoneHandle(zone_)), |
| 103 translation_helper_(this, thread_), | 102 translation_helper_(this, thread_), |
| 104 type_translator_(&translation_helper_, | 103 type_translator_(&translation_helper_, |
| 105 &active_class_, | 104 &active_class_, |
| 106 /*finalize=*/false) { | 105 /*finalize=*/false) { |
| 107 intptr_t source_file_count = program_->source_table().size(); | 106 intptr_t source_file_count = program_->source_table().size(); |
| 108 scripts_ = Array::New(source_file_count, Heap::kOld); | 107 scripts_ = Array::New(source_file_count, Heap::kOld); |
| 109 } | 108 } |
| 110 | 109 |
| 111 Object& KernelReader::ReadProgram() { | 110 Object& KernelReader::ReadProgram() { |
| 112 LongJumpScope jump; | 111 LongJumpScope jump; |
| 113 if (setjmp(*jump.Set()) == 0) { | 112 if (setjmp(*jump.Set()) == 0) { |
| 113 Procedure* main = program_->main_method(); |
| 114 Library* kernel_main_library = Library::Cast(main->parent()); |
| 115 |
| 114 intptr_t length = program_->libraries().length(); | 116 intptr_t length = program_->libraries().length(); |
| 115 for (intptr_t i = 0; i < length; i++) { | 117 for (intptr_t i = 0; i < length; i++) { |
| 116 Library* kernel_library = program_->libraries()[i]; | 118 Library* kernel_library = program_->libraries()[i]; |
| 117 ReadLibrary(kernel_library); | 119 ReadLibrary(kernel_library); |
| 118 } | 120 } |
| 119 | 121 |
| 120 for (intptr_t i = 0; i < length; i++) { | 122 for (intptr_t i = 0; i < length; i++) { |
| 121 dart::Library& library = | 123 dart::Library& library = LookupLibrary(program_->libraries()[i]); |
| 122 LookupLibrary(program_->libraries()[i]->canonical_name()); | |
| 123 if (!library.Loaded()) library.SetLoaded(); | 124 if (!library.Loaded()) library.SetLoaded(); |
| 124 } | 125 } |
| 125 | 126 |
| 126 if (ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { | 127 if (ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { |
| 127 Procedure* main = program_->main_method(); | 128 dart::Library& library = LookupLibrary(kernel_main_library); |
| 128 Library* kernel_main_library = Library::Cast(main->parent()); | |
| 129 dart::Library& library = | |
| 130 LookupLibrary(kernel_main_library->canonical_name()); | |
| 131 | 129 |
| 132 // Sanity check that we can find the main entrypoint. | 130 // Sanity check that we can find the main entrypoint. |
| 133 Object& main_obj = Object::Handle( | 131 Object& main_obj = Object::Handle( |
| 134 Z, library.LookupObjectAllowPrivate(H.DartSymbol("main"))); | 132 Z, library.LookupObjectAllowPrivate(H.DartSymbol("main"))); |
| 135 ASSERT(!main_obj.IsNull()); | 133 ASSERT(!main_obj.IsNull()); |
| 136 return library; | 134 return library; |
| 137 } | 135 } |
| 138 } | 136 } |
| 139 | 137 |
| 140 // Either class finalization failed or we caught a compile error. | 138 // Either class finalization failed or we caught a compile error. |
| 141 // In both cases sticky error would be set. | 139 // In both cases sticky error would be set. |
| 142 Error& error = Error::Handle(Z); | 140 Error& error = Error::Handle(Z); |
| 143 error = thread_->sticky_error(); | 141 error = thread_->sticky_error(); |
| 144 thread_->clear_sticky_error(); | 142 thread_->clear_sticky_error(); |
| 145 return error; | 143 return error; |
| 146 } | 144 } |
| 147 | 145 |
| 148 | 146 |
| 149 void KernelReader::ReadLibrary(Library* kernel_library) { | 147 void KernelReader::ReadLibrary(Library* kernel_library) { |
| 150 dart::Library& library = LookupLibrary(kernel_library->canonical_name()); | 148 dart::Library& library = LookupLibrary(kernel_library); |
| 151 if (library.Loaded()) return; | 149 if (library.Loaded()) return; |
| 152 | 150 |
| 153 // The bootstrapper will take care of creating the native wrapper classes, but | 151 // The bootstrapper will take care of creating the native wrapper classes, but |
| 154 // we will add the synthetic constructors to them here. | 152 // we will add the synthetic constructors to them here. |
| 155 if (library.name() == | 153 if (library.name() == |
| 156 Symbols::Symbol(Symbols::kDartNativeWrappersLibNameId).raw()) { | 154 Symbols::Symbol(Symbols::kDartNativeWrappersLibNameId).raw()) { |
| 157 ASSERT(library.LoadInProgress()); | 155 ASSERT(library.LoadInProgress()); |
| 158 } else { | 156 } else { |
| 159 library.SetLoadInProgress(); | 157 library.SetLoadInProgress(); |
| 160 } | 158 } |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 interfaces.SetAt(i, type); | 276 interfaces.SetAt(i, type); |
| 279 } | 277 } |
| 280 klass->set_interfaces(interfaces); | 278 klass->set_interfaces(interfaces); |
| 281 if (kernel_klass->is_abstract()) klass->set_is_abstract(); | 279 if (kernel_klass->is_abstract()) klass->set_is_abstract(); |
| 282 } | 280 } |
| 283 | 281 |
| 284 | 282 |
| 285 dart::Class& KernelReader::ReadClass(const dart::Library& library, | 283 dart::Class& KernelReader::ReadClass(const dart::Library& library, |
| 286 const dart::Class& toplevel_class, | 284 const dart::Class& toplevel_class, |
| 287 Class* kernel_klass) { | 285 Class* kernel_klass) { |
| 288 dart::Class& klass = LookupClass(kernel_klass->canonical_name()); | 286 // This will trigger a call to [ReadPreliminaryClass] if not already done. |
| 289 | 287 dart::Class& klass = LookupClass(kernel_klass); |
| 290 // The class needs to have a script because all the functions in the class | |
| 291 // will inherit it. The predicate Function::IsOptimizable uses the absence of | |
| 292 // a script to detect test functions that should not be optimized. | |
| 293 if (klass.script() == Script::null()) { | |
| 294 klass.set_script(ScriptAt(kernel_klass->source_uri_index())); | |
| 295 } | |
| 296 if (klass.token_pos() == TokenPosition::kNoSource) { | |
| 297 klass.set_token_pos(kernel_klass->position()); | |
| 298 } | |
| 299 if (!klass.is_cycle_free()) { | |
| 300 ReadPreliminaryClass(&klass, kernel_klass); | |
| 301 } | |
| 302 | 288 |
| 303 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass); | 289 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass); |
| 304 | 290 |
| 305 if (library.raw() == dart::Library::InternalLibrary() && | 291 if (library.raw() == dart::Library::InternalLibrary() && |
| 306 klass.Name() == Symbols::ClassID().raw()) { | 292 klass.Name() == Symbols::ClassID().raw()) { |
| 307 // If this is a dart:internal.ClassID class ignore field declarations | 293 // If this is a dart:internal.ClassID class ignore field declarations |
| 308 // contained in the Kernel file and instead inject our own const | 294 // contained in the Kernel file and instead inject our own const |
| 309 // fields. | 295 // fields. |
| 310 klass.InjectCIDFields(); | 296 klass.InjectCIDFields(); |
| 311 } else { | 297 } else { |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 function.SetParameterNameAt(pos, Symbols::This()); | 736 function.SetParameterNameAt(pos, Symbols::This()); |
| 751 pos++; | 737 pos++; |
| 752 } | 738 } |
| 753 if (is_setter) { | 739 if (is_setter) { |
| 754 function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); | 740 function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); |
| 755 function.SetParameterNameAt(pos, Symbols::Value()); | 741 function.SetParameterNameAt(pos, Symbols::Value()); |
| 756 pos++; | 742 pos++; |
| 757 } | 743 } |
| 758 } | 744 } |
| 759 | 745 |
| 760 dart::Library& KernelReader::LookupLibrary(CanonicalName* library) { | 746 dart::Library& KernelReader::LookupLibrary(Library* library) { |
| 761 dart::Library* handle = NULL; | 747 dart::Library* handle = NULL; |
| 762 if (!libraries_.Lookup(library, &handle)) { | 748 if (!libraries_.Lookup(library, &handle)) { |
| 763 const dart::String& url = H.DartSymbol(library->name()); | 749 const dart::String& url = H.DartSymbol(library->import_uri()); |
| 764 handle = | 750 handle = |
| 765 &dart::Library::Handle(Z, dart::Library::LookupLibrary(thread_, url)); | 751 &dart::Library::Handle(Z, dart::Library::LookupLibrary(thread_, url)); |
| 766 if (handle->IsNull()) { | 752 if (handle->IsNull()) { |
| 767 *handle = dart::Library::New(url); | 753 *handle = dart::Library::New(url); |
| 768 handle->Register(thread_); | 754 handle->Register(thread_); |
| 769 handle->SetName(H.DartSymbol(library->name())); | 755 handle->SetName(H.DartSymbol(library->name())); |
| 770 } | 756 } |
| 771 ASSERT(!handle->IsNull()); | 757 ASSERT(!handle->IsNull()); |
| 772 libraries_.Insert(library, handle); | 758 libraries_.Insert(library, handle); |
| 773 } | 759 } |
| 774 return *handle; | 760 return *handle; |
| 775 } | 761 } |
| 776 | 762 |
| 777 dart::Class& KernelReader::LookupClass(CanonicalName* klass) { | 763 dart::Class& KernelReader::LookupClass(Class* klass) { |
| 778 dart::Class* handle = NULL; | 764 dart::Class* handle = NULL; |
| 779 if (!classes_.Lookup(klass, &handle)) { | 765 if (!classes_.Lookup(klass, &handle)) { |
| 780 dart::Library& library = LookupLibrary(klass->parent()); | 766 dart::Library& library = LookupLibrary(klass->parent()); |
| 781 const dart::String& name = H.DartClassName(klass); | 767 const dart::String& name = H.DartClassName(klass); |
| 782 handle = &dart::Class::Handle(Z, library.LookupClass(name)); | 768 handle = &dart::Class::Handle(Z, library.LookupClass(name)); |
| 783 if (handle->IsNull()) { | 769 if (handle->IsNull()) { |
| 784 *handle = dart::Class::New(library, name, Script::Handle(Z), | 770 // The class needs to have a script because all the functions in the class |
| 785 TokenPosition::kNoSource); | 771 // will inherit it. The predicate Function::IsOptimizable uses the |
| 772 // absence of a script to detect test functions that should not be |
| 773 // optimized. |
| 774 Script& script = ScriptAt(klass->source_uri_index()); |
| 775 handle = &dart::Class::Handle( |
| 776 Z, dart::Class::New(library, name, script, klass->position())); |
| 786 library.AddClass(*handle); | 777 library.AddClass(*handle); |
| 778 } else if (handle->script() == Script::null()) { |
| 779 // When bootstrapping we can encounter classes that do not yet have a |
| 780 // dummy script. |
| 781 Script& script = ScriptAt(klass->source_uri_index()); |
| 782 handle->set_script(script); |
| 787 } | 783 } |
| 788 // Insert the class in the cache before calling ReadPreliminaryClass so | 784 // Insert the class in the cache before calling ReadPreliminaryClass so |
| 789 // we do not risk allocating the class again by calling LookupClass | 785 // we do not risk allocating the class again by calling LookupClass |
| 790 // recursively from ReadPreliminaryClass for the same class. | 786 // recursively from ReadPreliminaryClass for the same class. |
| 791 classes_.Insert(klass, handle); | 787 classes_.Insert(klass, handle); |
| 788 if (!handle->is_cycle_free()) { |
| 789 ReadPreliminaryClass(handle, klass); |
| 790 } |
| 792 } | 791 } |
| 793 return *handle; | 792 return *handle; |
| 794 } | 793 } |
| 795 | 794 |
| 796 | 795 |
| 797 RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) { | 796 RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) { |
| 798 intptr_t lookuptable[] = { | 797 intptr_t lookuptable[] = { |
| 799 RawFunction::kRegularFunction, // Procedure::kMethod | 798 RawFunction::kRegularFunction, // Procedure::kMethod |
| 800 RawFunction::kGetterFunction, // Procedure::kGetter | 799 RawFunction::kGetterFunction, // Procedure::kGetter |
| 801 RawFunction::kSetterFunction, // Procedure::kSetter | 800 RawFunction::kSetterFunction, // Procedure::kSetter |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 initializer_fun.set_is_debuggable(false); | 836 initializer_fun.set_is_debuggable(false); |
| 838 initializer_fun.set_is_reflectable(false); | 837 initializer_fun.set_is_reflectable(false); |
| 839 initializer_fun.set_is_inlinable(false); | 838 initializer_fun.set_is_inlinable(false); |
| 840 return new (zone) ParsedFunction(thread, initializer_fun); | 839 return new (zone) ParsedFunction(thread, initializer_fun); |
| 841 } | 840 } |
| 842 | 841 |
| 843 | 842 |
| 844 } // namespace kernel | 843 } // namespace kernel |
| 845 } // namespace dart | 844 } // namespace dart |
| 846 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 845 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |