Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Side by Side Diff: runtime/vm/kernel_reader.cc

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

Powered by Google App Engine
This is Rietveld 408576698