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

Unified Diff: runtime/vm/kernel_reader.cc

Issue 2973633002: [kernel] Change how TypeParameterType is calculated. (Closed)
Patch Set: longjmp instead of UNREACHABLE (+ rebase) Created 3 years, 4 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 ddc0aae30a1fe8d329092e2458f467a134c7b96d..3fcbf5bc7ff1c6a6be3a48b1f2b3a415fae58537 100644
--- a/runtime/vm/kernel_reader.cc
+++ b/runtime/vm/kernel_reader.cc
@@ -259,12 +259,12 @@ void KernelReader::ReadLibrary(intptr_t kernel_offset) {
fields_.Clear();
functions_.Clear();
- ActiveClassScope active_class_scope(&active_class_, 0, -1, &toplevel_class);
+ ActiveClassScope active_class_scope(&active_class_, &toplevel_class);
// Load toplevel fields.
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);
+ ActiveMemberScope active_member_scope(&active_class_, NULL);
FieldHelper field_helper(&builder_);
field_helper.ReadUntilExcluding(FieldHelper::kName);
@@ -312,51 +312,9 @@ void KernelReader::ReadPreliminaryClass(dart::Class* klass,
// 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());
- 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(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 < 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.
- 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.BuildTypeWithoutFinalization(); // read ith bound.
- if (bound.IsMalformedOrMalbounded()) {
- bound = I->object_store()->object_type();
- }
- parameter.set_bound(bound);
- }
- }
- }
+ // Set type parameters.
+ ReadAndSetupTypeParameters(*klass, type_parameter_count, *klass,
+ Function::Handle(Z));
// Set super type. Some classes (e.g., Object) do not have one.
Tag type_tag = builder_.ReadTag(); // read super class type (part 1).
@@ -406,16 +364,14 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
}
class_helper.ReadUntilExcluding(ClassHelper::kTypeParameters);
- intptr_t type_paremeter_counts =
+ intptr_t type_parameter_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);
+ ActiveClassScope active_class_scope(&active_class_, &klass);
if (!klass.is_cycle_free()) {
- ReadPreliminaryClass(&klass, &class_helper, type_paremeter_counts);
+ ReadPreliminaryClass(&klass, &class_helper, type_parameter_counts);
} else {
- for (intptr_t i = 0; i < type_paremeter_counts; ++i) {
+ for (intptr_t i = 0; i < type_parameter_counts; ++i) {
builder_.SkipStringReference(); // read ith name index.
builder_.SkipDartType(); // read ith bound.
}
@@ -436,7 +392,7 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
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);
+ ActiveMemberScope active_member(&active_class_, NULL);
FieldHelper field_helper(&builder_);
field_helper.ReadUntilExcluding(FieldHelper::kName);
@@ -479,7 +435,7 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
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);
+ ActiveMemberScope active_member_scope(&active_class_, NULL);
ConstructorHelper constructor_helper(&builder_);
constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
@@ -545,18 +501,6 @@ void KernelReader::ReadProcedure(const dart::Library& library,
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(procedure_helper.canonical_name_);
@@ -636,6 +580,8 @@ void KernelReader::ReadProcedure(const dart::Library& library,
functions_.Add(&function);
function.set_kernel_offset(procedure_offset);
+ ActiveMemberScope active_member(&active_class_, &function);
+
procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
Tag function_node_tag = builder_.ReadTag();
ASSERT(function_node_tag == kSomething);
@@ -665,6 +611,16 @@ void KernelReader::ReadProcedure(const dart::Library& library,
function.set_native_name(*native_name);
}
+ function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+ if (!function.IsFactory()) {
+ // Read type_parameters list length.
+ intptr_t type_parameter_count = builder_.ReadListLength();
+ // Set type parameters.
+ ReadAndSetupTypeParameters(function, type_parameter_count, Class::Handle(Z),
+ function);
+ function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+ }
+
function_node_helper.ReadUntilExcluding(
FunctionNodeHelper::kRequiredParameterCount);
builder_.SetupFunctionParameters(owner, function, is_method,
@@ -688,6 +644,65 @@ void KernelReader::ReadProcedure(const dart::Library& library,
procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
}
+void KernelReader::ReadAndSetupTypeParameters(
+ const Object& set_on,
+ intptr_t type_parameter_count,
+ const Class& parameterized_class,
+ const Function& parameterized_function) {
+ ASSERT(type_parameter_count >= 0);
+ if (type_parameter_count == 0) {
+ return;
+ }
+ // 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());
+ 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(type_parameter_count);
+ {
+ AlternativeReadingScope alt(builder_.reader_);
+ for (intptr_t i = 0; i < type_parameter_count; i++) {
+ parameter = dart::TypeParameter::New(
+ parameterized_class, parameterized_function, i,
+ H.DartSymbol(builder_.ReadStringReference()), // read ith name index.
+ null_bound, TokenPosition::kNoSource);
+ type_parameters.SetTypeAt(i, parameter);
+ builder_.SkipDartType(); // read guard.
+ }
+ }
+
+ ASSERT(set_on.IsClass() || set_on.IsFunction());
+ if (set_on.IsClass()) {
+ Class::Cast(set_on).set_type_parameters(type_parameters);
+ } else {
+ Function::Cast(set_on).set_type_parameters(type_parameters);
+ }
+
+ // Step b) Fill in the bounds of all [TypeParameter]s.
+ 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.
+ 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.BuildTypeWithoutFinalization(); // read ith bound.
+ if (bound.IsMalformedOrMalbounded()) {
+ bound = I->object_store()->object_type();
+ }
+ parameter.set_bound(bound);
+ }
+ }
+}
+
const Object& KernelReader::ClassForScriptAt(const dart::Class& klass,
intptr_t source_uri_index) {
Script& correct_script = ScriptAt(source_uri_index);
« 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