Index: runtime/vm/kernel_reader.cc |
diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc |
index 05fecbfb0f7b82299bcdfcbf19f874f4ab9ae5d0..09f1c71e47aacf5d6603152ea317c83c5296bbe4 100644 |
--- a/runtime/vm/kernel_reader.cc |
+++ b/runtime/vm/kernel_reader.cc |
@@ -83,6 +83,17 @@ class SimpleExpressionConverter : public ExpressionVisitor { |
}; |
+RawArray* KernelReader::MakeFunctionsArray( |
+ GrowableArray<const dart::Function*>* functions) { |
+ const intptr_t len = functions->length(); |
+ const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld)); |
+ for (intptr_t i = 0; i < len; i++) { |
+ res.SetAt(i, *functions->At(i)); |
+ } |
+ return res.raw(); |
+} |
+ |
+ |
RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( |
CanonicalName* library) { |
return reader_->LookupLibrary(library).raw(); |
@@ -169,9 +180,12 @@ void KernelReader::ReadLibrary(Library* kernel_library) { |
toplevel_class.set_is_cycle_free(); |
library.set_toplevel_class(toplevel_class); |
+ GrowableArray<const dart::Function*> functions; |
Vyacheslav Egorov (Google)
2017/03/27 17:31:55
Maybe make
functions_ and fields_ members of the
Dmitry Olshansky
2017/03/27 18:08:47
Done.
|
+ intptr_t num_fields = kernel_library->fields().length(); |
+ GrowableArray<const dart::Field*> fields(num_fields); |
ActiveClassScope active_class_scope(&active_class_, NULL, &toplevel_class); |
// Load toplevel fields. |
- for (intptr_t i = 0; i < kernel_library->fields().length(); i++) { |
+ for (intptr_t i = 0; i < num_fields; i++) { |
Field* kernel_field = kernel_library->fields()[i]; |
ActiveMemberScope active_member_scope(&active_class_, kernel_field); |
@@ -186,17 +200,20 @@ void KernelReader::ReadLibrary(Library* kernel_library) { |
const AbstractType& type = T.TranslateType(kernel_field->type()); |
field.SetFieldType(type); |
field.set_has_initializer(kernel_field->initializer() != NULL); |
- GenerateFieldAccessors(toplevel_class, field, kernel_field); |
- toplevel_class.AddField(field); |
+ GenerateFieldAccessors(toplevel_class, field, kernel_field, &functions); |
+ fields.Add(&field); |
library.AddObject(field, name); |
} |
+ toplevel_class.AddFields(fields); |
// Load toplevel procedures. |
for (intptr_t i = 0; i < kernel_library->procedures().length(); i++) { |
Procedure* kernel_procedure = kernel_library->procedures()[i]; |
- ReadProcedure(library, toplevel_class, kernel_procedure); |
+ ReadProcedure(library, toplevel_class, kernel_procedure, NULL, &functions); |
} |
+ toplevel_class.SetFunctions(Array::Handle(MakeFunctionsArray(&functions))); |
+ |
const GrowableObjectArray& classes = |
GrowableObjectArray::Handle(I->object_store()->pending_classes()); |
@@ -302,6 +319,7 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library, |
} |
ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass); |
+ GrowableArray<const dart::Function*> functions; |
if (library.raw() == dart::Library::InternalLibrary() && |
klass.Name() == Symbols::ClassID().raw()) { |
@@ -310,7 +328,9 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library, |
// fields. |
klass.InjectCIDFields(); |
} else { |
- for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) { |
+ intptr_t num_fields = kernel_klass->fields().length(); |
+ GrowableArray<const dart::Field*> fields(num_fields); |
+ for (intptr_t i = 0; i < num_fields; i++) { |
Field* kernel_field = kernel_klass->fields()[i]; |
ActiveMemberScope active_member_scope(&active_class_, kernel_field); |
@@ -331,9 +351,10 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library, |
script_class, type, kernel_field->position())); |
field.set_kernel_field(kernel_field); |
field.set_has_initializer(kernel_field->initializer() != NULL); |
- GenerateFieldAccessors(klass, field, kernel_field); |
- klass.AddField(field); |
+ GenerateFieldAccessors(klass, field, kernel_field, &functions); |
+ fields.Add(&field); |
} |
+ klass.AddFields(fields); |
} |
for (intptr_t i = 0; i < kernel_klass->constructors().length(); i++) { |
@@ -352,7 +373,7 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library, |
false, // is_native |
klass, kernel_constructor->position())); |
function.set_end_token_pos(kernel_constructor->end_position()); |
- klass.AddFunction(function); |
+ functions.Add(&function); |
function.set_kernel_function(kernel_constructor); |
function.set_result_type(T.ReceiverType(klass)); |
SetupFunctionParameters(H, T, klass, function, |
@@ -369,9 +390,11 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library, |
for (intptr_t i = 0; i < kernel_klass->procedures().length(); i++) { |
Procedure* kernel_procedure = kernel_klass->procedures()[i]; |
ActiveMemberScope active_member_scope(&active_class_, kernel_procedure); |
- ReadProcedure(library, klass, kernel_procedure, kernel_klass); |
+ ReadProcedure(library, klass, kernel_procedure, kernel_klass, &functions); |
} |
+ klass.SetFunctions(Array::Handle(MakeFunctionsArray(&functions))); |
+ |
if (!klass.is_marked_for_parsing()) { |
klass.set_is_marked_for_parsing(); |
} |
@@ -385,10 +408,12 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library, |
} |
-void KernelReader::ReadProcedure(const dart::Library& library, |
- const dart::Class& owner, |
- Procedure* kernel_procedure, |
- Class* kernel_klass) { |
+void KernelReader::ReadProcedure( |
+ const dart::Library& library, |
+ const dart::Class& owner, |
+ Procedure* kernel_procedure, |
+ Class* kernel_klass, |
+ GrowableArray<const dart::Function*>* functions) { |
ActiveClassScope active_class_scope(&active_class_, kernel_klass, &owner); |
ActiveMemberScope active_member_scope(&active_class_, kernel_procedure); |
ActiveFunctionScope active_function_scope(&active_class_, |
@@ -440,7 +465,7 @@ void KernelReader::ReadProcedure(const dart::Library& library, |
native_name != NULL, // is_native |
script_class, kernel_procedure->position())); |
function.set_end_token_pos(kernel_procedure->end_position()); |
- owner.AddFunction(function); |
+ functions->Add(&function); |
function.set_kernel_function(kernel_procedure); |
function.set_is_debuggable( |
@@ -574,9 +599,11 @@ Script& KernelReader::ScriptAt(intptr_t source_uri_index, String* import_uri) { |
return script; |
} |
-void KernelReader::GenerateFieldAccessors(const dart::Class& klass, |
- const dart::Field& field, |
- Field* kernel_field) { |
+void KernelReader::GenerateFieldAccessors( |
+ const dart::Class& klass, |
+ const dart::Field& field, |
+ Field* kernel_field, |
+ GrowableArray<const dart::Function*>* functions) { |
if (kernel_field->IsStatic() && kernel_field->initializer() == NULL) { |
// Static fields without an initializer are implicitly initialized to null. |
// We do not need a getter. |
@@ -629,7 +656,7 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass, |
false, // is_external |
false, // is_native |
script_class, kernel_field->position())); |
- klass.AddFunction(getter); |
+ functions->Add(&getter); |
getter.set_end_token_pos(kernel_field->end_position()); |
getter.set_kernel_function(kernel_field); |
getter.set_result_type(AbstractType::Handle(Z, field.type())); |
@@ -648,7 +675,7 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass, |
false, // is_external |
false, // is_native |
script_class, kernel_field->position())); |
- klass.AddFunction(setter); |
+ functions->Add(&setter); |
setter.set_end_token_pos(kernel_field->end_position()); |
setter.set_kernel_function(kernel_field); |
setter.set_result_type(Object::void_type()); |