Index: runtime/vm/kernel_reader.cc |
diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc |
index f9f22777b7ae86993842f9d91b210ed5645c5efc..6c669e4d745470a16444b0acf6f0211d5e6f2fc5 100644 |
--- a/runtime/vm/kernel_reader.cc |
+++ b/runtime/vm/kernel_reader.cc |
@@ -12,6 +12,7 @@ |
#include "vm/parser.h" |
#include "vm/symbols.h" |
+#if !defined(DART_PRECOMPILED_RUNTIME) |
namespace dart { |
namespace kernel { |
@@ -81,19 +82,18 @@ class SimpleExpressionConverter : public ExpressionVisitor { |
dart::Instance* simple_value_; |
}; |
-void BuildingTranslationHelper::SetFinalize(bool finalize) { |
- reader_->finalize_ = finalize; |
-} |
RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( |
Library* library) { |
return reader_->LookupLibrary(library).raw(); |
} |
+ |
RawClass* BuildingTranslationHelper::LookupClassByKernelClass(Class* klass) { |
return reader_->LookupClass(klass).raw(); |
} |
+ |
Object& KernelReader::ReadProgram() { |
ASSERT(!bootstrapping_); |
Program* program = ReadPrecompiledKernelFromBuffer(buffer_, buffer_length_); |
@@ -113,29 +113,13 @@ Object& KernelReader::ReadProgram() { |
ReadLibrary(kernel_library); |
} |
- // We finalize classes after we've constructed all classes since we |
- // currently don't construct them in pre-order of the class hierarchy (and |
- // finalization of a class needs all of its superclasses to be finalized). |
- dart::String& name = dart::String::Handle(Z); |
for (intptr_t i = 0; i < length; i++) { |
- Library* kernel_library = program->libraries()[i]; |
- dart::Library& library = LookupLibrary(kernel_library); |
- name = library.url(); |
- |
- // TODO(27590) unskip this library when we fix underlying issue. |
- if (name.Equals("dart:vmservice_io")) { |
- continue; |
- } |
+ dart::Library& library = LookupLibrary(program->libraries()[i]); |
+ if (!library.Loaded()) library.SetLoaded(); |
+ } |
- if (!library.Loaded()) { |
- dart::Class& klass = dart::Class::Handle(Z); |
- for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { |
- klass = LookupClass(kernel_library->classes()[i]).raw(); |
- ClassFinalizer::FinalizeTypesInClass(klass); |
- ClassFinalizer::FinalizeClass(klass); |
- } |
- library.SetLoaded(); |
- } |
+ if (!ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { |
+ FATAL("Error in class finalization during bootstrapping."); |
} |
dart::Library& library = LookupLibrary(kernel_main_library); |
@@ -161,6 +145,7 @@ Object& KernelReader::ReadProgram() { |
} |
} |
+ |
void KernelReader::ReadLibrary(Library* kernel_library) { |
dart::Library& library = LookupLibrary(kernel_library); |
if (library.Loaded()) return; |
@@ -217,13 +202,17 @@ void KernelReader::ReadLibrary(Library* kernel_library) { |
ReadProcedure(library, toplevel_class, kernel_procedure); |
} |
+ const GrowableObjectArray& classes = |
+ GrowableObjectArray::Handle(I->object_store()->pending_classes()); |
+ |
// Load all classes. |
for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { |
Class* kernel_klass = kernel_library->classes()[i]; |
- ReadClass(library, kernel_klass); |
+ classes.Add(ReadClass(library, kernel_klass), Heap::kOld); |
} |
} |
+ |
void KernelReader::ReadPreliminaryClass(dart::Class* klass, |
Class* kernel_klass) { |
ASSERT(kernel_klass->IsNormalClass()); |
@@ -284,7 +273,6 @@ void KernelReader::ReadPreliminaryClass(dart::Class* klass, |
intptr_t interface_count = kernel_klass->implemented_classes().length(); |
const dart::Array& interfaces = |
dart::Array::Handle(Z, dart::Array::New(interface_count)); |
- dart::Class& interface_class = dart::Class::Handle(Z); |
for (intptr_t i = 0; i < interface_count; i++) { |
InterfaceType* kernel_interface_type = |
kernel_klass->implemented_classes()[i]; |
@@ -292,33 +280,14 @@ void KernelReader::ReadPreliminaryClass(dart::Class* klass, |
T.TranslateTypeWithoutFinalization(kernel_interface_type); |
if (type.IsMalformed()) H.ReportError("Malformed interface type."); |
interfaces.SetAt(i, type); |
- |
- // NOTE: Normally the DartVM keeps a list of pending classes and iterates |
- // through them later on using `ClassFinalizer::ProcessPendingClasses()`. |
- // This involes calling `ClassFinalizer::ResolveSuperTypeAndInterfaces()` |
- // which does a lot of error validation (e.g. cycle checks) which we don't |
- // need here. But we do need to do one thing which this resolving phase |
- // normally does for us: set the `is_implemented` boolean. |
- |
- // TODO(27590): Maybe we can do this differently once we have |
- // "bootstrapping from kernel"-support. |
- interface_class = type.type_class(); |
- interface_class.set_is_implemented(); |
} |
klass->set_interfaces(interfaces); |
if (kernel_klass->is_abstract()) klass->set_is_abstract(); |
- klass->set_is_cycle_free(); |
- |
- // When bootstrapping we should not finalize types yet because they will be |
- // finalized when the object store's pending_classes list is drained by |
- // ClassFinalizer::ProcessPendingClasses. Even when not bootstrapping we are |
- // careful not to eagerly finalize types that may introduce a circularity |
- // (such as type arguments, interface types, field types, etc.). |
- if (finalize_) ClassFinalizer::FinalizeTypesInClass(*klass); |
} |
-void KernelReader::ReadClass(const dart::Library& library, |
- Class* kernel_klass) { |
+ |
+dart::Class& KernelReader::ReadClass(const dart::Library& library, |
+ Class* kernel_klass) { |
// This will trigger a call to [ReadPreliminaryClass] if not already done. |
dart::Class& klass = LookupClass(kernel_klass); |
@@ -383,8 +352,11 @@ void KernelReader::ReadClass(const dart::Library& library, |
GrowableObjectArray::Handle(Z, I->object_store()->pending_classes()) |
.Add(klass, Heap::kOld); |
} |
+ |
+ return klass; |
} |
+ |
void KernelReader::ReadProcedure(const dart::Library& library, |
const dart::Class& owner, |
Procedure* kernel_procedure, |
@@ -524,6 +496,7 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass, |
} |
} |
+ |
void KernelReader::SetupFunctionParameters(TranslationHelper translation_helper, |
DartTypeTranslator type_translator, |
const dart::Class& klass, |
@@ -594,6 +567,7 @@ void KernelReader::SetupFunctionParameters(TranslationHelper translation_helper, |
: return_type); |
} |
+ |
void KernelReader::SetupFieldAccessorFunction(const dart::Class& klass, |
const dart::Function& function) { |
bool is_setter = function.IsImplicitSetterFunction(); |
@@ -679,6 +653,7 @@ dart::Class& KernelReader::LookupClass(Class* klass) { |
return *handle; |
} |
+ |
RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) { |
intptr_t lookuptable[] = { |
RawFunction::kRegularFunction, // Procedure::kMethod |
@@ -696,5 +671,7 @@ RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) { |
} |
} |
+ |
} // namespace kernel |
} // namespace dart |
+#endif // !defined(DART_PRECOMPILED_RUNTIME) |