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

Unified Diff: runtime/vm/kernel_reader.cc

Issue 2931813002: [kernel] Stream kernel_reader (Closed)
Patch Set: Feedback Created 3 years, 6 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/kernel_reader.cc
diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc
index f2923d5623bcea97b86d82bf68734d46bad99900..3c6aaa0b63f1c7b7a83a5452da4a938509c92264 100644
--- a/runtime/vm/kernel_reader.cc
+++ b/runtime/vm/kernel_reader.cc
@@ -8,6 +8,7 @@
#include "vm/dart_api_impl.h"
#include "vm/kernel_binary.h"
+#include "vm/kernel_binary_flowgraph.h"
#include "vm/longjump.h"
#include "vm/object_store.h"
#include "vm/parser.h"
@@ -19,58 +20,72 @@ namespace kernel {
#define Z (zone_)
#define I (isolate_)
-#define T (type_translator_)
+#define T (builder_.type_translator_)
#define H (translation_helper_)
-class SimpleExpressionConverter : public ExpressionVisitor {
+class SimpleExpressionConverter {
public:
- explicit SimpleExpressionConverter(TranslationHelper* helper)
+ SimpleExpressionConverter(TranslationHelper* helper,
+ StreamingFlowGraphBuilder* builder)
: translation_helper_(*helper),
zone_(translation_helper_.zone()),
- is_simple_(false),
- simple_value_(NULL) {}
-
- virtual void VisitDefaultExpression(Expression* node) { is_simple_ = false; }
-
- virtual void VisitIntLiteral(IntLiteral* node) {
- is_simple_ = true;
- simple_value_ =
- &Integer::ZoneHandle(Z, Integer::New(node->value(), Heap::kOld));
- *simple_value_ = H.Canonicalize(*simple_value_);
- }
-
- virtual void VisitBigintLiteral(BigintLiteral* node) {
- is_simple_ = true;
- simple_value_ = &Integer::ZoneHandle(
- Z, Integer::New(H.DartString(node->value(), Heap::kOld)));
- *simple_value_ = H.Canonicalize(*simple_value_);
- }
-
- virtual void VisitDoubleLiteral(DoubleLiteral* node) {
- is_simple_ = true;
- simple_value_ = &Double::ZoneHandle(
- Z, Double::New(H.DartString(node->value()), Heap::kOld));
- *simple_value_ = H.Canonicalize(*simple_value_);
- }
-
- virtual void VisitBoolLiteral(BoolLiteral* node) {
- is_simple_ = true;
- simple_value_ = &Bool::Handle(Z, Bool::Get(node->value()).raw());
- }
-
- virtual void VisitNullLiteral(NullLiteral* node) {
- is_simple_ = true;
- simple_value_ = &dart::Instance::ZoneHandle(Z, dart::Instance::null());
- }
-
- virtual void VisitStringLiteral(StringLiteral* node) {
- is_simple_ = true;
- simple_value_ = &H.DartSymbol(node->value());
- }
-
- bool IsSimple(Expression* expression) {
- expression->AcceptExpressionVisitor(this);
- return is_simple_;
+ simple_value_(NULL),
+ builder_(builder) {}
+
+
+ bool IsSimple(intptr_t kernel_offset) {
+ AlternativeReadingScope alt(builder_->reader_, kernel_offset);
+ uint8_t payload = 0;
+ Tag tag = builder_->ReadTag(&payload); // read tag.
+ switch (tag) {
+ case kBigIntLiteral:
+ simple_value_ = &Integer::ZoneHandle(
+ Z, Integer::New(
+ H.DartString(builder_->ReadStringReference(),
+ Heap::kOld))); // read index into string table.
+ *simple_value_ = H.Canonicalize(*simple_value_);
+ return true;
+ case kStringLiteral:
+ simple_value_ = &H.DartSymbol(
+ builder_->ReadStringReference()); // read index into string table.
+ return true;
+ case kSpecialIntLiteral:
+ simple_value_ =
+ &Integer::ZoneHandle(Z, Integer::New(static_cast<int32_t>(payload) -
+ SpecializedIntLiteralBias,
+ Heap::kOld));
+ *simple_value_ = H.Canonicalize(*simple_value_);
+ return true;
+ case kNegativeIntLiteral:
+ simple_value_ = &Integer::ZoneHandle(
+ Z, Integer::New(-static_cast<int64_t>(builder_->ReadUInt()),
+ Heap::kOld)); // read value.
+ *simple_value_ = H.Canonicalize(*simple_value_);
+ return true;
+ case kPositiveIntLiteral:
+ simple_value_ = &Integer::ZoneHandle(
+ Z, Integer::New(static_cast<int64_t>(builder_->ReadUInt()),
+ Heap::kOld)); // read value.
+ *simple_value_ = H.Canonicalize(*simple_value_);
+ return true;
+ case kDoubleLiteral:
+ simple_value_ = &Double::ZoneHandle(
+ Z, Double::New(H.DartString(builder_->ReadStringReference()),
+ Heap::kOld)); // read string reference.
+ *simple_value_ = H.Canonicalize(*simple_value_);
+ return true;
+ case kTrueLiteral:
+ simple_value_ = &Bool::Handle(Z, Bool::Get(true).raw());
+ return true;
+ case kFalseLiteral:
+ simple_value_ = &Bool::Handle(Z, Bool::Get(false).raw());
+ return true;
+ case kNullLiteral:
+ simple_value_ = &dart::Instance::ZoneHandle(Z, dart::Instance::null());
+ return true;
+ default:
+ return false;
+ }
}
const dart::Instance& SimpleValue() { return *simple_value_; }
@@ -79,8 +94,8 @@ class SimpleExpressionConverter : public ExpressionVisitor {
private:
TranslationHelper& translation_helper_;
dart::Zone* zone_;
- bool is_simple_;
dart::Instance* simple_value_;
+ StreamingFlowGraphBuilder* builder_;
};
@@ -112,9 +127,13 @@ KernelReader::KernelReader(Program* program)
isolate_(thread_->isolate()),
scripts_(Array::ZoneHandle(zone_)),
translation_helper_(this, thread_),
- type_translator_(&translation_helper_,
- &active_class_,
- /*finalize=*/false) {
+ builder_(&translation_helper_,
+ zone_,
+ program_->libraries()[0]->kernel_data(),
+ program_->libraries()[0]->kernel_data_size()) {
+ T.active_class_ = &active_class_;
+ T.finalize_ = false;
+
intptr_t source_file_count = program->source_table().size();
scripts_ = Array::New(source_file_count, Heap::kOld);
@@ -166,7 +185,7 @@ Object& KernelReader::ReadProgram() {
intptr_t length = program_->libraries().length();
for (intptr_t i = 0; i < length; i++) {
Library* kernel_library = program_->libraries()[i];
- ReadLibrary(kernel_library);
+ ReadLibrary(kernel_library->kernel_offset());
}
for (intptr_t i = 0; i < length; i++) {
@@ -201,10 +220,18 @@ Object& KernelReader::ReadProgram() {
}
-void KernelReader::ReadLibrary(Library* kernel_library) {
- dart::Library& library = LookupLibrary(kernel_library->canonical_name());
+void KernelReader::ReadLibrary(intptr_t kernel_offset) {
+ builder_.SetOffset(kernel_offset);
+
+ int flags = builder_.ReadFlags();
+ ASSERT(flags == 0); // external libraries not supported
+
+ NameIndex canonical_name =
+ builder_.ReadCanonicalNameReference(); // read canonical name.
+ dart::Library& library = LookupLibrary(canonical_name);
if (library.Loaded()) return;
- library.SetName(H.DartSymbol(kernel_library->name()));
+ StringIndex name = builder_.ReadStringReference(); // read name.
+ library.SetName(H.DartSymbol(name));
// The bootstrapper will take care of creating the native wrapper classes, but
// we will add the synthetic constructors to them here.
@@ -216,152 +243,224 @@ void KernelReader::ReadLibrary(Library* kernel_library) {
}
// Setup toplevel class (which contains library fields/procedures).
- Script& script = ScriptAt(kernel_library->source_uri_index(),
- kernel_library->import_uri());
+ StringIndex import_uri_index = H.CanonicalNameString(canonical_name);
+ intptr_t source_uri_index = builder_.ReadUInt(); // read source uri index.
+
+ Script& script = ScriptAt(source_uri_index, import_uri_index);
dart::Class& toplevel_class = dart::Class::Handle(
Z, dart::Class::New(library, Symbols::TopLevel(), script,
TokenPosition::kNoSource));
toplevel_class.set_is_cycle_free();
library.set_toplevel_class(toplevel_class);
+ intptr_t annotation_count = builder_.ReadUInt(); // read list length.
+ for (intptr_t i = 0; i < annotation_count; ++i) {
+ builder_.SkipExpression(); // read ith annotation expression.
+ }
+
+ intptr_t dependency_count = builder_.ReadUInt(); // read list length.
+ for (intptr_t i = 0; i < dependency_count; ++i) {
+ builder_.ReadFlags(); // read flags.
+ annotation_count = builder_.ReadUInt(); // read list length.
+ for (intptr_t i = 0; i < annotation_count; ++i) {
+ builder_.SkipExpression(); // read ith annotation expression.
+ }
+ builder_.ReadCanonicalNameReference(); // read target_reference.
+ builder_.ReadStringReference(); // read name_index.
+ intptr_t combinator_count = builder_.ReadListLength(); // read list length.
+ for (intptr_t i = 0; i < combinator_count; ++i) {
+ builder_.ReadBool(); // read is_show.
+ intptr_t name_count = builder_.ReadUInt(); // read list length.
+ for (intptr_t j = 0; j < name_count; ++j) {
+ builder_.ReadUInt(); // read ith entry of name_indices.
+ }
+ }
+ }
+
+ // Skip typedefs.
+ intptr_t typedef_count = builder_.ReadListLength(); // read list length.
+ for (intptr_t i = 0; i < typedef_count; i++) {
+ builder_.SkipCanonicalNameReference(); // read canonical name.
+ builder_.ReadPosition(); // read position.
+ builder_.SkipStringReference(); // read name index.
+ builder_.ReadUInt(); // read source_uri_index.
+ builder_.SkipListOfDartTypes(); // read type parameters.
+ builder_.SkipDartType(); // read type.
+ }
+
+ const GrowableObjectArray& classes =
+ GrowableObjectArray::Handle(Z, I->object_store()->pending_classes());
+
+ // Load all classes.
+ int class_count = builder_.ReadListLength(); // read list length.
+ for (intptr_t i = 0; i < class_count; ++i) {
+ classes.Add(ReadClass(library, toplevel_class), Heap::kOld);
+ }
+
fields_.Clear();
functions_.Clear();
- ActiveClassScope active_class_scope(&active_class_, NULL, &toplevel_class);
+ ActiveClassScope active_class_scope(&active_class_, 0, -1, &toplevel_class);
// Load toplevel fields.
- for (intptr_t i = 0; i < kernel_library->fields().length(); i++) {
- Field* kernel_field = kernel_library->fields()[i];
-
- ActiveMemberScope active_member_scope(&active_class_, kernel_field);
- const dart::String& name = H.DartFieldName(kernel_field->name());
+ intptr_t field_count = builder_.ReadListLength(); // read list length.
+ for (intptr_t i = 0; i < field_count; ++i) {
+ intptr_t field_offset = builder_.ReaderOffset();
+ ActiveMemberScope active_member_scope(&active_class_, false, false, 0, -1);
+ FieldHelper field_helper(&builder_);
+ field_helper.ReadUntilExcluding(FieldHelper::kName);
+
+ const dart::String& name = builder_.ReadNameAsFieldName();
+ field_helper.SetJustRead(FieldHelper::kName);
+ field_helper.ReadUntilExcluding(FieldHelper::kType);
const Object& script_class =
- ClassForScriptAt(toplevel_class, kernel_field->source_uri_index());
+ ClassForScriptAt(toplevel_class, field_helper.source_uri_index_);
dart::Field& field = dart::Field::Handle(
- Z, dart::Field::NewTopLevel(name, kernel_field->IsFinal(),
- kernel_field->IsConst(), script_class,
- kernel_field->position()));
- field.set_kernel_offset(kernel_field->kernel_offset());
- const AbstractType& type = T.TranslateType(kernel_field->type());
+ Z, dart::Field::NewTopLevel(name, field_helper.IsFinal(),
+ field_helper.IsConst(), script_class,
+ field_helper.position_));
+ field.set_kernel_offset(field_offset);
+ const AbstractType& type = T.BuildType(); // read type.
field.SetFieldType(type);
- field.set_has_initializer(kernel_field->initializer() != NULL);
- GenerateFieldAccessors(toplevel_class, field, kernel_field);
+ field_helper.SetJustRead(FieldHelper::kType);
+ field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
+ field.set_has_initializer(builder_.PeekTag() == kSomething);
+ GenerateFieldAccessors(toplevel_class, field, &field_helper, field_offset);
+ field_helper.ReadUntilExcluding(FieldHelper::kEnd);
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);
+ intptr_t procedure_count = builder_.ReadListLength(); // read list length.
+ for (intptr_t i = 0; i < procedure_count; ++i) {
+ ReadProcedure(library, toplevel_class, false);
}
toplevel_class.SetFunctions(Array::Handle(MakeFunctionsArray()));
- const GrowableObjectArray& classes =
- GrowableObjectArray::Handle(Z, 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];
- classes.Add(ReadClass(library, toplevel_class, kernel_klass), Heap::kOld);
- }
-
classes.Add(toplevel_class, Heap::kOld);
}
void KernelReader::ReadPreliminaryClass(dart::Class* klass,
- Class* kernel_klass) {
- ASSERT(kernel_klass->IsNormalClass());
- NormalClass* kernel_normal_class = NormalClass::Cast(kernel_klass);
-
- ActiveClassScope active_class_scope(&active_class_, kernel_klass, klass);
+ ClassHelper* class_helper,
+ intptr_t type_parameter_count) {
+ // Note: This assumes that ClassHelper is exactly at the position where
+ // the length of the type parameters have been read, and that the order in
+ // the binary is as follows: [...], kTypeParameters, kSuperClass, kMixinType,
+ // kImplementedClasses, [...].
// First setup the type parameters, so if any of the following code uses it
// (in a recursive way) we're fine.
TypeArguments& type_parameters =
TypeArguments::Handle(Z, TypeArguments::null());
- intptr_t num_type_parameters = kernel_klass->type_parameters().length();
- if (num_type_parameters > 0) {
+ if (type_parameter_count > 0) {
dart::TypeParameter& parameter = dart::TypeParameter::Handle(Z);
Type& null_bound = Type::Handle(Z, Type::null());
// Step a) Create array of [TypeParameter] objects (without bound).
- type_parameters = TypeArguments::New(num_type_parameters);
- for (intptr_t i = 0; i < num_type_parameters; i++) {
- parameter = dart::TypeParameter::New(
- *klass, Function::Handle(Z), i,
- H.DartSymbol(kernel_klass->type_parameters()[i]->name()), null_bound,
- TokenPosition::kNoSource);
- type_parameters.SetTypeAt(i, parameter);
+ type_parameters = TypeArguments::New(type_parameter_count);
+ {
+ AlternativeReadingScope alt(builder_.reader_);
+ for (intptr_t i = 0; i < type_parameter_count; i++) {
+ parameter = dart::TypeParameter::New(
+ *klass, Function::Handle(Z), i,
+ H.DartSymbol(
+ builder_.ReadStringReference()), // read ith name index.
+ null_bound, TokenPosition::kNoSource);
+ type_parameters.SetTypeAt(i, parameter);
+ builder_.SkipDartType(); // read guard.
+ }
}
klass->set_type_parameters(type_parameters);
// Step b) Fill in the bounds of all [TypeParameter]s.
- for (intptr_t i = 0; i < num_type_parameters; i++) {
- TypeParameter* kernel_parameter = kernel_klass->type_parameters()[i];
+ for (intptr_t i = 0; i < type_parameter_count; i++) {
+ builder_.SkipStringReference(); // read ith name index.
+
// TODO(github.com/dart-lang/kernel/issues/42): This should be handled
// by the frontend.
- if (kernel_parameter->bound()->IsDynamicType()) {
- parameter ^= type_parameters.TypeAt(i);
+ parameter ^= type_parameters.TypeAt(i);
+ Tag tag = builder_.PeekTag(); // peek ith bound type.
+ if (tag == kDynamicType) {
+ builder_.SkipDartType(); // read ith bound.
parameter.set_bound(Type::Handle(Z, I->object_store()->object_type()));
} else {
AbstractType& bound =
- T.TranslateTypeWithoutFinalization(kernel_parameter->bound());
+ T.BuildTypeWithoutFinalization(); // read ith bound.
if (bound.IsMalformedOrMalbounded()) {
bound = I->object_store()->object_type();
}
-
- parameter ^= type_parameters.TypeAt(i);
parameter.set_bound(bound);
}
}
}
// Set super type. Some classes (e.g., Object) do not have one.
- if (kernel_normal_class->super_class() != NULL) {
+ Tag type_tag = builder_.ReadTag(); // read super class type (part 1).
+ if (type_tag == kSomething) {
AbstractType& super_type =
- T.TranslateTypeWithoutFinalization(kernel_normal_class->super_class());
+ T.BuildTypeWithoutFinalization(); // read super class type (part 2).
if (super_type.IsMalformed()) H.ReportError("Malformed super type");
klass->set_super_type(super_type);
}
+ class_helper->SetJustRead(ClassHelper::kSuperClass);
+ class_helper->ReadUntilIncluding(ClassHelper::kMixinType);
+
// Build implemented interface types
- intptr_t interface_count = kernel_klass->implemented_classes().length();
+ intptr_t interface_count = builder_.ReadListLength();
const dart::Array& interfaces =
dart::Array::Handle(Z, dart::Array::New(interface_count, Heap::kOld));
for (intptr_t i = 0; i < interface_count; i++) {
- InterfaceType* kernel_interface_type =
- kernel_klass->implemented_classes()[i];
const AbstractType& type =
- T.TranslateTypeWithoutFinalization(kernel_interface_type);
+ T.BuildTypeWithoutFinalization(); // read ith type.
if (type.IsMalformed()) H.ReportError("Malformed interface type.");
interfaces.SetAt(i, type);
}
+ class_helper->SetJustRead(ClassHelper::kImplementedClasses);
klass->set_interfaces(interfaces);
- if (kernel_klass->is_abstract()) klass->set_is_abstract();
+
+ if (class_helper->is_abstract_) klass->set_is_abstract();
}
dart::Class& KernelReader::ReadClass(const dart::Library& library,
- const dart::Class& toplevel_class,
- Class* kernel_klass) {
- dart::Class& klass = LookupClass(kernel_klass->canonical_name());
+ const dart::Class& toplevel_class) {
+ ClassHelper class_helper(&builder_);
+ intptr_t class_offset = builder_.ReaderOffset();
+ class_helper.ReadUntilIncluding(ClassHelper::kCanonicalName);
+ dart::Class& klass = LookupClass(class_helper.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()));
+ class_helper.ReadUntilIncluding(ClassHelper::kSourceUriIndex);
+ klass.set_script(ScriptAt(class_helper.source_uri_index_));
}
if (klass.token_pos() == TokenPosition::kNoSource) {
- klass.set_token_pos(kernel_klass->position());
+ class_helper.ReadUntilIncluding(ClassHelper::kPosition);
+ klass.set_token_pos(class_helper.position_);
}
+
+ class_helper.ReadUntilExcluding(ClassHelper::kTypeParameters);
+ intptr_t type_paremeter_counts =
+ builder_.ReadListLength(); // read type_parameters list length.
+ intptr_t type_paremeter_offset = builder_.ReaderOffset();
+
+ ActiveClassScope active_class_scope(&active_class_, type_paremeter_counts,
+ type_paremeter_offset, &klass);
if (!klass.is_cycle_free()) {
- ReadPreliminaryClass(&klass, kernel_klass);
+ ReadPreliminaryClass(&klass, &class_helper, type_paremeter_counts);
+ } else {
+ for (intptr_t i = 0; i < type_paremeter_counts; ++i) {
+ builder_.SkipStringReference(); // read ith name index.
+ builder_.SkipDartType(); // read ith bound.
+ }
+ class_helper.SetJustRead(ClassHelper::kTypeParameters);
}
- ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass);
fields_.Clear();
functions_.Clear();
@@ -372,67 +471,90 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
// fields.
klass.InjectCIDFields();
} else {
- for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) {
- Field* kernel_field = kernel_klass->fields()[i];
- ActiveMemberScope active_member_scope(&active_class_, kernel_field);
-
- const dart::String& name = H.DartFieldName(kernel_field->name());
+ class_helper.ReadUntilExcluding(ClassHelper::kFields);
+ int field_count = builder_.ReadListLength(); // read list length.
+ for (intptr_t i = 0; i < field_count; ++i) {
+ intptr_t field_offset = builder_.ReaderOffset();
+ ActiveMemberScope active_member(&active_class_, false, false, 0, -1);
+ FieldHelper field_helper(&builder_);
+ field_helper.ReadUntilExcluding(FieldHelper::kName);
+
+ const dart::String& name = builder_.ReadNameAsFieldName();
+ field_helper.SetJustRead(FieldHelper::kName);
+ field_helper.ReadUntilExcluding(FieldHelper::kType);
const AbstractType& type =
- T.TranslateTypeWithoutFinalization(kernel_field->type());
+ T.BuildTypeWithoutFinalization(); // read type.
+ field_helper.SetJustRead(FieldHelper::kType);
const Object& script_class =
- ClassForScriptAt(klass, kernel_field->source_uri_index());
+ ClassForScriptAt(klass, field_helper.source_uri_index_);
dart::Field& field = dart::Field::Handle(
Z,
- dart::Field::New(name, kernel_field->IsStatic(),
+ dart::Field::New(name, field_helper.IsStatic(),
// In the VM all const fields are implicitly final
// whereas in Kernel they are not final because they
// are not explicitly declared that way.
- kernel_field->IsFinal() || kernel_field->IsConst(),
- kernel_field->IsConst(),
+ field_helper.IsFinal() || field_helper.IsConst(),
+ field_helper.IsConst(),
false, // is_reflectable
- script_class, type, kernel_field->position()));
- field.set_kernel_offset(kernel_field->kernel_offset());
- field.set_has_initializer(kernel_field->initializer() != NULL);
- GenerateFieldAccessors(klass, field, kernel_field);
+ script_class, type, field_helper.position_));
+ field.set_kernel_offset(field_offset);
+ field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
+ field.set_has_initializer(builder_.PeekTag() == kSomething);
+ GenerateFieldAccessors(klass, field, &field_helper, field_offset);
+ field_helper.ReadUntilExcluding(FieldHelper::kEnd);
fields_.Add(&field);
}
klass.AddFields(fields_);
+ class_helper.SetJustRead(ClassHelper::kFields);
}
- for (intptr_t i = 0; i < kernel_klass->constructors().length(); i++) {
- Constructor* kernel_constructor = kernel_klass->constructors()[i];
- ActiveMemberScope active_member_scope(&active_class_, kernel_constructor);
+ class_helper.ReadUntilExcluding(ClassHelper::kConstructors);
+ int constructor_count = builder_.ReadListLength(); // read list length.
+ for (intptr_t i = 0; i < constructor_count; ++i) {
+ intptr_t constructor_offset = builder_.ReaderOffset();
+ ActiveMemberScope active_member_scope(&active_class_, false, false, 0, -1);
+ ConstructorHelper constructor_helper(&builder_);
+ constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
const dart::String& name =
- H.DartConstructorName(kernel_constructor->canonical_name());
+ H.DartConstructorName(constructor_helper.canonical_name_);
Function& function = dart::Function::ZoneHandle(
Z, dart::Function::New(name, RawFunction::kConstructor,
false, // is_static
- kernel_constructor->IsConst(),
+ constructor_helper.IsConst(),
false, // is_abstract
- kernel_constructor->IsExternal(),
+ constructor_helper.IsExternal(),
false, // is_native
- klass, kernel_constructor->position()));
- function.set_end_token_pos(kernel_constructor->end_position());
+ klass, constructor_helper.position_));
+ function.set_end_token_pos(constructor_helper.end_position_);
functions_.Add(&function);
- function.set_kernel_offset(kernel_constructor->kernel_offset());
+ function.set_kernel_offset(constructor_offset);
function.set_result_type(T.ReceiverType(klass));
- SetupFunctionParameters(H, T, klass, function,
- kernel_constructor->function(),
- true, // is_method
- false); // is_closure
+
+ FunctionNodeHelper function_node_helper(&builder_);
+ function_node_helper.ReadUntilExcluding(
+ FunctionNodeHelper::kRequiredParameterCount);
+ builder_.SetupFunctionParameters(klass, function,
+ true, // is_method
+ false, // is_closure
+ &function_node_helper);
+ function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
+ constructor_helper.SetJustRead(ConstructorHelper::kFunction);
+ constructor_helper.ReadUntilExcluding(ConstructorHelper::kEnd);
if (FLAG_enable_mirrors) {
library.AddFunctionMetadata(function, TokenPosition::kNoSource,
- kernel_constructor->kernel_offset());
+ constructor_offset);
}
}
+ class_helper.SetJustRead(ClassHelper::kConstructors);
- 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);
+ class_helper.ReadUntilExcluding(ClassHelper::kProcedures);
+ int procedure_count = builder_.ReadListLength(); // read list length.
+ for (intptr_t i = 0; i < procedure_count; ++i) {
+ ReadProcedure(library, klass, true);
}
+ class_helper.SetJustRead(ClassHelper::kProcedures);
klass.SetFunctions(Array::Handle(MakeFunctionsArray()));
@@ -442,70 +564,116 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
if (FLAG_enable_mirrors) {
library.AddClassMetadata(klass, toplevel_class, TokenPosition::kNoSource,
- kernel_klass->kernel_offset());
+ class_offset);
}
+ class_helper.ReadUntilExcluding(ClassHelper::kEnd);
+
return klass;
}
void KernelReader::ReadProcedure(const dart::Library& library,
const dart::Class& owner,
- Procedure* kernel_procedure,
- Class* kernel_klass) {
- ActiveClassScope active_class_scope(&active_class_, kernel_klass, &owner);
- ActiveMemberScope active_member_scope(&active_class_, kernel_procedure);
-
+ bool in_class) {
+ intptr_t procedure_offset = builder_.ReaderOffset();
+ ProcedureHelper procedure_helper(&builder_);
+
+ bool member_is_procedure = false;
+ bool is_factory_procedure = false;
+ intptr_t member_type_parameters = 0;
+ intptr_t member_type_parameters_offset_start = -1;
+ builder_.GetTypeParameterInfoForPossibleProcedure(
+ builder_.ReaderOffset(), &member_is_procedure, &is_factory_procedure,
+ &member_type_parameters, &member_type_parameters_offset_start);
+
+ ActiveMemberScope active_member(&active_class_, member_is_procedure,
+ is_factory_procedure, member_type_parameters,
+ member_type_parameters_offset_start);
+
+ procedure_helper.ReadUntilExcluding(ProcedureHelper::kAnnotations);
const dart::String& name =
- H.DartProcedureName(kernel_procedure->canonical_name());
- bool is_method = kernel_klass != NULL && !kernel_procedure->IsStatic();
- bool is_abstract = kernel_procedure->IsAbstract();
- bool is_external = kernel_procedure->IsExternal();
+ H.DartProcedureName(procedure_helper.canonical_name_);
+ bool is_method = in_class && !procedure_helper.IsStatic();
+ bool is_abstract = procedure_helper.IsAbstract();
+ bool is_external = procedure_helper.IsExternal();
dart::String* native_name = NULL;
if (is_external) {
// Maybe it has a native implementation, which is not external as far as
// the VM is concerned because it does have an implementation. Check for
// an ExternalName annotation and extract the string from it.
- for (int i = 0; i < kernel_procedure->annotations().length(); ++i) {
- Expression* annotation = kernel_procedure->annotations()[i];
- if (!annotation->IsConstructorInvocation()) continue;
- ConstructorInvocation* invocation =
- ConstructorInvocation::Cast(annotation);
- NameIndex annotation_class = H.EnclosingName(invocation->target());
+ intptr_t annotation_count = builder_.ReadListLength(); // read list length.
+ for (int i = 0; i < annotation_count; ++i) {
+ if (builder_.PeekTag() != kConstructorInvocation &&
+ builder_.PeekTag() != kConstConstructorInvocation) {
+ builder_.SkipExpression();
+ continue;
+ }
+ builder_.ReadTag();
+ builder_.ReadPosition();
+ NameIndex annotation_class = H.EnclosingName(
+ builder_.ReadCanonicalNameReference()); // read target reference,
ASSERT(H.IsClass(annotation_class));
StringIndex class_name_index = H.CanonicalNameString(annotation_class);
// Just compare by name, do not generate the annotation class.
- if (!H.StringEquals(class_name_index, "ExternalName")) continue;
+ if (!H.StringEquals(class_name_index, "ExternalName")) {
+ builder_.SkipArguments();
+ continue;
+ }
ASSERT(H.IsLibrary(H.CanonicalNameParent(annotation_class)));
StringIndex library_name_index =
H.CanonicalNameString(H.CanonicalNameParent(annotation_class));
- if (!H.StringEquals(library_name_index, "dart:_internal")) continue;
+ if (!H.StringEquals(library_name_index, "dart:_internal")) {
+ builder_.SkipArguments();
+ continue;
+ }
is_external = false;
- ASSERT(invocation->arguments()->positional().length() == 1 &&
- invocation->arguments()->named().length() == 0);
- StringLiteral* literal =
- StringLiteral::Cast(invocation->arguments()->positional()[0]);
- native_name = &H.DartSymbol(literal->value());
+ // Read arguments:
+ intptr_t total_arguments = builder_.ReadUInt(); // read argument count.
+ builder_.SkipListOfDartTypes(); // read list of types.
+ intptr_t positional_arguments = builder_.ReadListLength();
+ ASSERT(total_arguments == 1 && positional_arguments == 1);
+
+ Tag tag = builder_.ReadTag();
+ ASSERT(tag == kStringLiteral);
+ native_name = &H.DartSymbol(
+ builder_.ReadStringReference()); // read index into string table.
+
+ // List of named.
+ intptr_t list_length = builder_.ReadListLength(); // read list length.
+ ASSERT(list_length == 0);
+
+ // Skip remaining annotations
+ for (++i; i < annotation_count; ++i) {
+ builder_.SkipExpression(); // read ith annotation.
+ }
+
break;
}
+ procedure_helper.SetJustRead(ProcedureHelper::kAnnotations);
}
const Object& script_class =
- ClassForScriptAt(owner, kernel_procedure->source_uri_index());
+ ClassForScriptAt(owner, procedure_helper.source_uri_index_);
dart::Function& function = dart::Function::ZoneHandle(
- Z, Function::New(name, GetFunctionType(kernel_procedure),
+ Z, Function::New(name, GetFunctionType(procedure_helper.kind_),
!is_method, // is_static
false, // is_const
is_abstract, is_external,
native_name != NULL, // is_native
- script_class, kernel_procedure->position()));
- function.set_end_token_pos(kernel_procedure->end_position());
+ script_class, procedure_helper.position_));
+ function.set_end_token_pos(procedure_helper.end_position_);
functions_.Add(&function);
- function.set_kernel_offset(kernel_procedure->kernel_offset());
-
- function.set_is_debuggable(
- kernel_procedure->function()->dart_async_marker() == FunctionNode::kSync);
- switch (kernel_procedure->function()->dart_async_marker()) {
+ function.set_kernel_offset(procedure_offset);
+
+ procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
+ Tag function_node_tag = builder_.ReadTag();
+ ASSERT(function_node_tag == kSomething);
+ FunctionNodeHelper function_node_helper(&builder_);
+ function_node_helper.ReadUntilIncluding(FunctionNodeHelper::kDartAsyncMarker);
+ function.set_is_debuggable(function_node_helper.dart_async_marker_ ==
+ FunctionNode::kSync);
+ switch (function_node_helper.dart_async_marker_) {
case FunctionNode::kSyncStar:
function.set_modifier(RawFunction::kSyncGen);
break;
@@ -521,27 +689,33 @@ void KernelReader::ReadProcedure(const dart::Library& library,
// no special modifier
break;
}
- ASSERT(kernel_procedure->function()->async_marker() == FunctionNode::kSync);
+ ASSERT(function_node_helper.async_marker_ == FunctionNode::kSync);
if (native_name != NULL) {
function.set_native_name(*native_name);
}
- SetupFunctionParameters(H, T, owner, function, kernel_procedure->function(),
- is_method,
- false); // is_closure
+ function_node_helper.ReadUntilExcluding(
+ FunctionNodeHelper::kRequiredParameterCount);
+ builder_.SetupFunctionParameters(owner, function, is_method,
+ false, // is_closure
+ &function_node_helper);
+ function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
+ procedure_helper.SetJustRead(ProcedureHelper::kFunction);
- if (kernel_klass == NULL) {
+ if (!in_class) {
library.AddObject(function, name);
ASSERT(!Object::Handle(
Z, library.LookupObjectAllowPrivate(
- H.DartProcedureName(kernel_procedure->canonical_name())))
+ H.DartProcedureName(procedure_helper.canonical_name_)))
.IsNull());
}
if (FLAG_enable_mirrors) {
library.AddFunctionMetadata(function, TokenPosition::kNoSource,
- kernel_procedure->kernel_offset());
+ procedure_offset);
}
+
+ procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
}
const Object& KernelReader::ClassForScriptAt(const dart::Class& klass,
@@ -643,18 +817,20 @@ Script& KernelReader::ScriptAt(intptr_t index, StringIndex import_uri) {
void KernelReader::GenerateFieldAccessors(const dart::Class& klass,
const dart::Field& field,
- Field* kernel_field) {
- if (kernel_field->IsStatic() && kernel_field->initializer() == NULL) {
+ FieldHelper* field_helper,
+ intptr_t field_offset) {
+ Tag tag = builder_.PeekTag();
+ if (field_helper->IsStatic() && tag == kNothing) {
// Static fields without an initializer are implicitly initialized to null.
// We do not need a getter.
field.SetStaticValue(Instance::Handle(Z), true);
return;
}
- if (kernel_field->initializer() != NULL) {
- SimpleExpressionConverter converter(&H);
+ if (tag == kSomething) {
+ SimpleExpressionConverter converter(&H, &builder_);
const bool has_simple_initializer =
- converter.IsSimple(kernel_field->initializer());
- if (kernel_field->IsStatic()) {
+ converter.IsSimple(builder_.ReaderOffset() + 1); // ignore the tag.
+ if (field_helper->IsStatic()) {
// Static fields with initializers either have the static value set to the
// initializer value if it is simple enough or else set to an
// uninitialized sentinel.
@@ -677,38 +853,38 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass,
}
const dart::String& getter_name =
- H.DartGetterName(kernel_field->canonical_name());
+ H.DartGetterName(field_helper->canonical_name_);
const Object& script_class =
- ClassForScriptAt(klass, kernel_field->source_uri_index());
+ ClassForScriptAt(klass, field_helper->source_uri_index_);
Function& getter = Function::ZoneHandle(
Z,
Function::New(
getter_name,
- kernel_field->IsStatic() ? RawFunction::kImplicitStaticFinalGetter
+ field_helper->IsStatic() ? RawFunction::kImplicitStaticFinalGetter
: RawFunction::kImplicitGetter,
- kernel_field->IsStatic(),
+ field_helper->IsStatic(),
// The functions created by the parser have is_const for static fields
// that are const (not just final) and they have is_const for
// non-static
// fields that are final.
- kernel_field->IsStatic() ? kernel_field->IsConst()
- : kernel_field->IsFinal(),
+ field_helper->IsStatic() ? field_helper->IsConst()
+ : field_helper->IsFinal(),
false, // is_abstract
false, // is_external
false, // is_native
- script_class, kernel_field->position()));
+ script_class, field_helper->position_));
functions_.Add(&getter);
- getter.set_end_token_pos(kernel_field->end_position());
- getter.set_kernel_offset(kernel_field->kernel_offset());
+ getter.set_end_token_pos(field_helper->end_position_);
+ getter.set_kernel_offset(field_offset);
getter.set_result_type(AbstractType::Handle(Z, field.type()));
getter.set_is_debuggable(false);
SetupFieldAccessorFunction(klass, getter);
- if (!kernel_field->IsStatic() && !kernel_field->IsFinal()) {
+ if (!field_helper->IsStatic() && !field_helper->IsFinal()) {
// Only static fields can be const.
- ASSERT(!kernel_field->IsConst());
+ ASSERT(!field_helper->IsConst());
const dart::String& setter_name =
- H.DartSetterName(kernel_field->canonical_name());
+ H.DartSetterName(field_helper->canonical_name_);
Function& setter = Function::ZoneHandle(
Z, Function::New(setter_name, RawFunction::kImplicitSetter,
false, // is_static
@@ -716,10 +892,10 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass,
false, // is_abstract
false, // is_external
false, // is_native
- script_class, kernel_field->position()));
+ script_class, field_helper->position_));
functions_.Add(&setter);
- setter.set_end_token_pos(kernel_field->end_position());
- setter.set_kernel_offset(kernel_field->kernel_offset());
+ setter.set_end_token_pos(field_helper->end_position_);
+ setter.set_kernel_offset(field_offset);
setter.set_result_type(Object::void_type());
setter.set_is_debuggable(false);
SetupFieldAccessorFunction(klass, setter);
@@ -727,80 +903,6 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass,
}
-void KernelReader::SetupFunctionParameters(TranslationHelper translation_helper,
- DartTypeTranslator type_translator,
- const dart::Class& klass,
- const dart::Function& function,
- FunctionNode* node,
- bool is_method,
- bool is_closure) {
- dart::Zone* zone = translation_helper.zone();
-
- ASSERT(!(is_method && is_closure));
- bool is_factory = function.IsFactory();
- intptr_t extra_parameters = (is_method || is_closure || is_factory) ? 1 : 0;
-
- function.set_num_fixed_parameters(extra_parameters +
- node->required_parameter_count());
- if (node->named_parameters().length() > 0) {
- function.SetNumOptionalParameters(node->named_parameters().length(), false);
- } else {
- function.SetNumOptionalParameters(node->positional_parameters().length() -
- node->required_parameter_count(),
- true);
- }
- intptr_t num_parameters = extra_parameters +
- node->positional_parameters().length() +
- node->named_parameters().length();
- function.set_parameter_types(
- Array::Handle(zone, Array::New(num_parameters, Heap::kOld)));
- function.set_parameter_names(
- Array::Handle(zone, Array::New(num_parameters, Heap::kOld)));
- intptr_t pos = 0;
- if (is_method) {
- ASSERT(!klass.IsNull());
- function.SetParameterTypeAt(pos,
- translation_helper.GetCanonicalType(klass));
- function.SetParameterNameAt(pos, Symbols::This());
- pos++;
- } else if (is_closure) {
- function.SetParameterTypeAt(pos, AbstractType::dynamic_type());
- function.SetParameterNameAt(pos, Symbols::ClosureParameter());
- pos++;
- } else if (is_factory) {
- function.SetParameterTypeAt(pos, AbstractType::dynamic_type());
- function.SetParameterNameAt(pos, Symbols::TypeArgumentsParameter());
- pos++;
- }
- for (intptr_t i = 0; i < node->positional_parameters().length(); i++, pos++) {
- VariableDeclaration* kernel_variable = node->positional_parameters()[i];
- const AbstractType& type = type_translator.TranslateTypeWithoutFinalization(
- kernel_variable->type());
- function.SetParameterTypeAt(
- pos, type.IsMalformed() ? Type::dynamic_type() : type);
- function.SetParameterNameAt(
- pos, translation_helper.DartSymbol(kernel_variable->name()));
- }
- for (intptr_t i = 0; i < node->named_parameters().length(); i++, pos++) {
- VariableDeclaration* named_expression = node->named_parameters()[i];
- const AbstractType& type = type_translator.TranslateTypeWithoutFinalization(
- named_expression->type());
- function.SetParameterTypeAt(
- pos, type.IsMalformed() ? Type::dynamic_type() : type);
- function.SetParameterNameAt(
- pos, translation_helper.DartSymbol(named_expression->name()));
- }
-
- // The result type for generative constructors has already been set.
- if (!function.IsGenerativeConstructor()) {
- const AbstractType& return_type =
- type_translator.TranslateTypeWithoutFinalization(node->return_type());
- function.set_result_type(return_type.IsMalformed() ? Type::dynamic_type()
- : return_type);
- }
-}
-
-
void KernelReader::SetupFieldAccessorFunction(const dart::Class& klass,
const dart::Function& function) {
bool is_setter = function.IsImplicitSetterFunction();
@@ -865,7 +967,8 @@ dart::Class& KernelReader::LookupClass(NameIndex klass) {
}
-RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) {
+RawFunction::Kind KernelReader::GetFunctionType(
+ Procedure::ProcedureKind procedure_kind) {
intptr_t lookuptable[] = {
RawFunction::kRegularFunction, // Procedure::kMethod
RawFunction::kGetterFunction, // Procedure::kGetter
@@ -873,7 +976,7 @@ RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) {
RawFunction::kRegularFunction, // Procedure::kOperator
RawFunction::kConstructor, // Procedure::kFactory
};
- intptr_t kind = static_cast<int>(kernel_procedure->kind());
+ intptr_t kind = static_cast<int>(procedure_kind);
if (kind == Procedure::kIncompleteProcedure) {
return RawFunction::kSignatureFunction;
} else {
« 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