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

Unified Diff: runtime/vm/object.cc

Issue 2736733005: Manage and capture class and function instantiators in the parser. (Closed)
Patch Set: work in progress Created 3 years, 9 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
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0d978e94f3d66cb5e9771dde0882a18b10c99020..9acac793300e4611d6199182525845cdc68f5c9f 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5946,10 +5946,11 @@ RawTypeParameter* Function::LookupTypeParameter(
if (type_param_name.Equals(type_name)) {
if (parent_level > 0) {
// Clone type parameter and set parent_level.
- return TypeParameter::New(
+ type_param = TypeParameter::New(
Class::Handle(), function, type_param.index(), parent_level,
type_param_name, AbstractType::Handle(type_param.bound()),
TokenPosition::kNoSource);
+ type_param.SetIsFinalized();
}
return type_param.raw();
}
@@ -17731,11 +17732,15 @@ bool TypeParameter::IsEquivalent(const Instance& other, TrailPtr trail) const {
return false;
}
const TypeParameter& other_type_param = TypeParameter::Cast(other);
- if (parameterized_class() != other_type_param.parameterized_class()) {
+ if (parameterized_class_id() != other_type_param.parameterized_class_id()) {
+ return false;
+ }
+ if (parameterized_function() != other_type_param.parameterized_function()) {
return false;
}
if (IsFinalized() == other_type_param.IsFinalized()) {
- return index() == other_type_param.index();
+ return (index() == other_type_param.index()) &&
+ (parent_level() == other_type_param.parent_level());
}
return name() == other_type_param.name();
}
@@ -17929,7 +17934,13 @@ RawString* TypeParameter::EnumerateURIs() const {
intptr_t TypeParameter::ComputeHash() const {
ASSERT(IsFinalized());
- uint32_t result = Class::Handle(parameterized_class()).id();
+ uint32_t result;
+ if (IsClassTypeParameter()) {
+ result = parameterized_class_id();
+ } else {
+ result = Function::Handle(parameterized_function()).Hash();
+ result = CombineHashes(result, parent_level());
+ }
// No need to include the hash of the bound, since the type parameter is fully
// identified by its class and index.
result = CombineHashes(result, index());
« no previous file with comments | « runtime/vm/code_descriptors_test.cc ('k') | runtime/vm/parser.h » ('j') | runtime/vm/parser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698