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

Unified Diff: runtime/vm/object.cc

Issue 2965743002: [VM, generic functions reification, work in progress] (Closed)
Patch Set: 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
« runtime/vm/object.h ('K') | « runtime/vm/object.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 759879a6968d880c1d69258ed9b10a3fce354326..d5bd797d281391963a1c715e2aec6c47f7dee49a 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -4861,6 +4861,7 @@ bool TypeArguments::IsResolved() const {
bool TypeArguments::IsSubvectorInstantiated(intptr_t from_index,
intptr_t len,
Genericity genericity,
+ intptr_t num_free_fun_type_params,
TrailPtr trail) const {
ASSERT(!IsNull());
AbstractType& type = AbstractType::Handle();
@@ -4872,7 +4873,8 @@ bool TypeArguments::IsSubvectorInstantiated(intptr_t from_index,
// during finalization of V, which is also the instantiator. T depends
// solely on the type parameters of A and will be replaced by a non-null
// type before A is marked as finalized.
- if (!type.IsNull() && !type.IsInstantiated(genericity, trail)) {
+ if (!type.IsNull() &&
+ !type.IsInstantiated(genericity, num_free_fun_type_params, trail)) {
return false;
}
}
@@ -7255,15 +7257,24 @@ RawString* Function::BuildSignature(NameVisibility name_visibility) const {
bool Function::HasInstantiatedSignature(Genericity genericity,
+ intptr_t num_free_fun_type_params,
TrailPtr trail) const {
+ if (genericity != kCurrentClass) {
+ // We only consider the function type parameters declared by the parents of
+ // this signature function.
+ const int num_parent_type_params = NumParentTypeParameters();
+ if (num_parent_type_params < num_free_fun_type_params) {
+ num_free_fun_type_params = num_parent_type_params;
+ }
+ }
AbstractType& type = AbstractType::Handle(result_type());
- if (!type.IsInstantiated(genericity, trail)) {
+ if (!type.IsInstantiated(genericity, num_free_fun_type_params, trail)) {
return false;
}
const intptr_t num_parameters = NumParameters();
for (intptr_t i = 0; i < num_parameters; i++) {
type = ParameterTypeAt(i);
- if (!type.IsInstantiated(genericity, trail)) {
+ if (!type.IsInstantiated(genericity, num_free_fun_type_params, trail)) {
return false;
}
}
@@ -16396,7 +16407,9 @@ TokenPosition AbstractType::token_pos() const {
}
-bool AbstractType::IsInstantiated(Genericity genericity, TrailPtr trail) const {
+bool AbstractType::IsInstantiated(Genericity genericity,
+ intptr_t num_free_fun_type_params,
+ TrailPtr trail) const {
// AbstractType is an abstract class.
UNREACHABLE();
return false;
@@ -17239,17 +17252,20 @@ RawUnresolvedClass* Type::unresolved_class() const {
}
-bool Type::IsInstantiated(Genericity genericity, TrailPtr trail) const {
+bool Type::IsInstantiated(Genericity genericity,
+ intptr_t num_free_fun_type_params,
+ TrailPtr trail) const {
if (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) {
return true;
}
- if ((genericity == kAny) &&
+ if ((genericity == kAny) && (num_free_fun_type_params == kMaxInt32) &&
(raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated)) {
return false;
}
if (IsFunctionType()) {
const Function& sig_fun = Function::Handle(signature());
- if (!sig_fun.HasInstantiatedSignature(genericity, trail)) {
+ if (!sig_fun.HasInstantiatedSignature(genericity, num_free_fun_type_params,
+ trail)) {
return false;
}
// Because a generic typedef with an instantiated signature is considered
@@ -17280,7 +17296,7 @@ bool Type::IsInstantiated(Genericity genericity, TrailPtr trail) const {
}
return (len == 0) ||
args.IsSubvectorInstantiated(num_type_args - len, len, genericity,
- trail);
+ num_free_fun_type_params, trail);
}
@@ -17997,12 +18013,15 @@ const char* Type::ToCString() const {
}
-bool TypeRef::IsInstantiated(Genericity genericity, TrailPtr trail) const {
+bool TypeRef::IsInstantiated(Genericity genericity,
+ intptr_t num_free_fun_type_params,
+ TrailPtr trail) const {
if (TestAndAddToTrail(&trail)) {
return true;
}
const AbstractType& ref_type = AbstractType::Handle(type());
- return !ref_type.IsNull() && ref_type.IsInstantiated(genericity, trail);
+ return !ref_type.IsNull() &&
+ ref_type.IsInstantiated(genericity, num_free_fun_type_params, trail);
}
@@ -18169,18 +18188,14 @@ void TypeParameter::SetIsFinalized() const {
bool TypeParameter::IsInstantiated(Genericity genericity,
+ intptr_t num_free_fun_type_params,
TrailPtr trail) const {
- switch (genericity) {
- case kAny:
- return false;
- case kCurrentClass:
- return IsFunctionTypeParameter();
- case kFunctions:
- return IsClassTypeParameter();
- default:
- UNREACHABLE();
+ if (IsClassTypeParameter()) {
+ return genericity == kFunctions;
}
- return false;
+ ASSERT(IsFunctionTypeParameter());
+ ASSERT(IsFinalized());
+ return (genericity == kCurrentClass) || (index() >= num_free_fun_type_params);
}
« runtime/vm/object.h ('K') | « runtime/vm/object.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698