Index: runtime/vm/kernel_reader.cc |
diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc |
index 6e04260cfad0c142c1515f7bde4eb4c601782136..1377f7ca66e62c2ceb00cec41d9d45fd27945c9a 100644 |
--- a/runtime/vm/kernel_reader.cc |
+++ b/runtime/vm/kernel_reader.cc |
@@ -84,13 +84,12 @@ class SimpleExpressionConverter : public ExpressionVisitor { |
RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( |
- CanonicalName* library) { |
+ Library* library) { |
return reader_->LookupLibrary(library).raw(); |
} |
-RawClass* BuildingTranslationHelper::LookupClassByKernelClass( |
- CanonicalName* klass) { |
+RawClass* BuildingTranslationHelper::LookupClassByKernelClass(Class* klass) { |
return reader_->LookupClass(klass).raw(); |
} |
@@ -111,6 +110,9 @@ KernelReader::KernelReader(Program* program) |
Object& KernelReader::ReadProgram() { |
LongJumpScope jump; |
if (setjmp(*jump.Set()) == 0) { |
+ Procedure* main = program_->main_method(); |
+ Library* kernel_main_library = Library::Cast(main->parent()); |
+ |
intptr_t length = program_->libraries().length(); |
for (intptr_t i = 0; i < length; i++) { |
Library* kernel_library = program_->libraries()[i]; |
@@ -118,16 +120,12 @@ Object& KernelReader::ReadProgram() { |
} |
for (intptr_t i = 0; i < length; i++) { |
- dart::Library& library = |
- LookupLibrary(program_->libraries()[i]->canonical_name()); |
+ dart::Library& library = LookupLibrary(program_->libraries()[i]); |
if (!library.Loaded()) library.SetLoaded(); |
} |
if (ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { |
- Procedure* main = program_->main_method(); |
- Library* kernel_main_library = Library::Cast(main->parent()); |
- dart::Library& library = |
- LookupLibrary(kernel_main_library->canonical_name()); |
+ dart::Library& library = LookupLibrary(kernel_main_library); |
// Sanity check that we can find the main entrypoint. |
Object& main_obj = Object::Handle( |
@@ -147,7 +145,7 @@ Object& KernelReader::ReadProgram() { |
void KernelReader::ReadLibrary(Library* kernel_library) { |
- dart::Library& library = LookupLibrary(kernel_library->canonical_name()); |
+ dart::Library& library = LookupLibrary(kernel_library); |
if (library.Loaded()) return; |
// The bootstrapper will take care of creating the native wrapper classes, but |
@@ -285,20 +283,8 @@ void KernelReader::ReadPreliminaryClass(dart::Class* klass, |
dart::Class& KernelReader::ReadClass(const dart::Library& library, |
const dart::Class& toplevel_class, |
Class* kernel_klass) { |
- dart::Class& klass = LookupClass(kernel_klass->canonical_name()); |
- |
- // The class needs to have a script because all the functions in the class |
- // will inherit it. The predicate Function::IsOptimizable uses the absence of |
- // a script to detect test functions that should not be optimized. |
- if (klass.script() == Script::null()) { |
- klass.set_script(ScriptAt(kernel_klass->source_uri_index())); |
- } |
- if (klass.token_pos() == TokenPosition::kNoSource) { |
- klass.set_token_pos(kernel_klass->position()); |
- } |
- if (!klass.is_cycle_free()) { |
- ReadPreliminaryClass(&klass, kernel_klass); |
- } |
+ // This will trigger a call to [ReadPreliminaryClass] if not already done. |
+ dart::Class& klass = LookupClass(kernel_klass); |
ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass); |
@@ -757,10 +743,10 @@ void KernelReader::SetupFieldAccessorFunction(const dart::Class& klass, |
} |
} |
-dart::Library& KernelReader::LookupLibrary(CanonicalName* library) { |
+dart::Library& KernelReader::LookupLibrary(Library* library) { |
dart::Library* handle = NULL; |
if (!libraries_.Lookup(library, &handle)) { |
- const dart::String& url = H.DartSymbol(library->name()); |
+ const dart::String& url = H.DartSymbol(library->import_uri()); |
handle = |
&dart::Library::Handle(Z, dart::Library::LookupLibrary(thread_, url)); |
if (handle->IsNull()) { |
@@ -774,21 +760,34 @@ dart::Library& KernelReader::LookupLibrary(CanonicalName* library) { |
return *handle; |
} |
-dart::Class& KernelReader::LookupClass(CanonicalName* klass) { |
+dart::Class& KernelReader::LookupClass(Class* klass) { |
dart::Class* handle = NULL; |
if (!classes_.Lookup(klass, &handle)) { |
dart::Library& library = LookupLibrary(klass->parent()); |
const dart::String& name = H.DartClassName(klass); |
handle = &dart::Class::Handle(Z, library.LookupClass(name)); |
if (handle->IsNull()) { |
- *handle = dart::Class::New(library, name, Script::Handle(Z), |
- TokenPosition::kNoSource); |
+ // The class needs to have a script because all the functions in the class |
+ // will inherit it. The predicate Function::IsOptimizable uses the |
+ // absence of a script to detect test functions that should not be |
+ // optimized. |
+ Script& script = ScriptAt(klass->source_uri_index()); |
+ handle = &dart::Class::Handle( |
+ Z, dart::Class::New(library, name, script, klass->position())); |
library.AddClass(*handle); |
+ } else if (handle->script() == Script::null()) { |
+ // When bootstrapping we can encounter classes that do not yet have a |
+ // dummy script. |
+ Script& script = ScriptAt(klass->source_uri_index()); |
+ handle->set_script(script); |
} |
// Insert the class in the cache before calling ReadPreliminaryClass so |
// we do not risk allocating the class again by calling LookupClass |
// recursively from ReadPreliminaryClass for the same class. |
classes_.Insert(klass, handle); |
+ if (!handle->is_cycle_free()) { |
+ ReadPreliminaryClass(handle, klass); |
+ } |
} |
return *handle; |
} |