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

Unified Diff: runtime/vm/object.h

Issue 1674383002: Keep a trail while checking upper bounds in the VM in order to properly handle (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: address comments Created 4 years, 10 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/intermediate_language.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.h
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index eed376be2152b218585740f514db5420dd8771de..6b029709f3c456eec7c624ad6a76f4700ede3fc2 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -901,6 +901,10 @@ class PassiveObject : public Object {
};
+typedef ZoneGrowableHandlePtrArray<const AbstractType> Trail;
+typedef ZoneGrowableHandlePtrArray<const AbstractType>* TrailPtr;
+
+
class Class : public Object {
public:
intptr_t instance_size() const {
@@ -1122,12 +1126,14 @@ class Class : public Object {
const Class& other,
const TypeArguments& other_type_arguments,
Error* bound_error,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const {
return TypeTest(kIsSubtypeOf,
type_arguments,
other,
other_type_arguments,
bound_error,
+ bound_trail,
space);
}
@@ -1136,12 +1142,14 @@ class Class : public Object {
const Class& other,
const TypeArguments& other_type_arguments,
Error* bound_error,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const {
return TypeTest(kIsMoreSpecificThan,
type_arguments,
other,
other_type_arguments,
bound_error,
+ bound_trail,
space);
}
@@ -1464,6 +1472,7 @@ class Class : public Object {
const Class& other,
const TypeArguments& other_type_arguments,
Error* bound_error,
+ TrailPtr bound_trail,
Heap::Space space) const;
static bool TypeTestNonRecursive(
@@ -1473,6 +1482,7 @@ class Class : public Object {
const Class& other,
const TypeArguments& other_type_arguments,
Error* bound_error,
+ TrailPtr bound_trail,
Heap::Space space);
FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object);
@@ -1518,9 +1528,6 @@ class UnresolvedClass : public Object {
};
-typedef ZoneGrowableHandlePtrArray<const AbstractType> Trail;
-typedef ZoneGrowableHandlePtrArray<const AbstractType>* TrailPtr;
-
// A TypeArguments is an array of AbstractType.
class TypeArguments : public Object {
public:
@@ -1569,8 +1576,10 @@ class TypeArguments : public Object {
intptr_t from_index,
intptr_t len,
Error* bound_error,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const {
- return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error, space);
+ return TypeTest(kIsSubtypeOf, other, from_index, len,
+ bound_error, bound_trail, space);
}
// Check the 'more specific' relationship, considering only a subvector of
@@ -1579,9 +1588,10 @@ class TypeArguments : public Object {
intptr_t from_index,
intptr_t len,
Error* bound_error,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const {
- return TypeTest(kIsMoreSpecificThan,
- other, from_index, len, bound_error, space);
+ return TypeTest(kIsMoreSpecificThan, other, from_index, len,
+ bound_error, bound_trail, space);
}
// Check if the vectors are equal (they may be null).
@@ -1637,7 +1647,8 @@ class TypeArguments : public Object {
RawTypeArguments* InstantiateFrom(
const TypeArguments& instantiator_type_arguments,
Error* bound_error,
- TrailPtr trail = NULL,
+ TrailPtr instantiation_trail = NULL,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const;
// Runtime instantiation with canonicalization. Not to be used during type
@@ -1694,6 +1705,7 @@ class TypeArguments : public Object {
intptr_t from_index,
intptr_t len,
Error* bound_error,
+ TrailPtr bound_trail,
Heap::Space space) const;
// Return the internal or public name of a subvector of this type argument
@@ -2498,7 +2510,7 @@ class Function : public Object {
const Function& other,
const TypeArguments& other_type_arguments,
Error* bound_error,
- Heap::Space space = Heap::kNew) const {
+ Heap::Space space = Heap::kNew) const {
return TypeTest(kIsMoreSpecificThan,
type_arguments,
other,
@@ -5266,7 +5278,8 @@ class AbstractType : public Instance {
virtual RawAbstractType* InstantiateFrom(
const TypeArguments& instantiator_type_arguments,
Error* bound_error,
- TrailPtr trail = NULL,
+ TrailPtr instantiation_trail = NULL,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const;
// Return a clone of this unfinalized type or the type itself if it is
@@ -5297,6 +5310,17 @@ class AbstractType : public Instance {
// the trail. The receiver may only be added once with its only buddy.
void AddOnlyBuddyToTrail(TrailPtr* trail, const AbstractType& buddy) const;
+ // Return true if the receiver is contained in the trail.
+ // Otherwise, if the trail is null, allocate a trail, then add the receiver to
+ // the trail and return false.
+ bool TestAndAddToTrail(TrailPtr* trail) const;
+
+ // Return true if the pair <receiver, buddy> is contained in the trail.
+ // Otherwise, if the trail is null, allocate a trail, add the pair <receiver,
+ // buddy> to the trail and return false.
+ // The receiver may be added several times, each time with a different buddy.
+ bool TestAndAddBuddyToTrail(TrailPtr* trail, const AbstractType& buddy) const;
+
// The name of this type, including the names of its type arguments, if any.
virtual RawString* Name() const {
return BuildName(kInternalName);
@@ -5369,15 +5393,18 @@ class AbstractType : public Instance {
// Check the subtype relationship.
bool IsSubtypeOf(const AbstractType& other,
Error* bound_error,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const {
- return TypeTest(kIsSubtypeOf, other, bound_error, space);
+ return TypeTest(kIsSubtypeOf, other, bound_error, bound_trail, space);
}
// Check the 'more specific' relationship.
bool IsMoreSpecificThan(const AbstractType& other,
Error* bound_error,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const {
- return TypeTest(kIsMoreSpecificThan, other, bound_error, space);
+ return TypeTest(kIsMoreSpecificThan, other,
+ bound_error, bound_trail, space);
}
private:
@@ -5385,6 +5412,7 @@ class AbstractType : public Instance {
bool TypeTest(TypeTestKind test_kind,
const AbstractType& other,
Error* bound_error,
+ TrailPtr bound_trail,
Heap::Space space) const;
// Return the internal or public name of this type, including the names of its
@@ -5443,7 +5471,8 @@ class Type : public AbstractType {
virtual RawAbstractType* InstantiateFrom(
const TypeArguments& instantiator_type_arguments,
Error* bound_error,
- TrailPtr trail = NULL,
+ TrailPtr instantiation_trail = NULL,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const;
virtual RawAbstractType* CloneUnfinalized() const;
virtual RawAbstractType* CloneUninstantiated(
@@ -5590,7 +5619,8 @@ class FunctionType : public AbstractType {
virtual RawAbstractType* InstantiateFrom(
const TypeArguments& instantiator_type_arguments,
Error* malformed_error,
- TrailPtr trail = NULL,
+ TrailPtr instantiation_trail = NULL,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const;
virtual RawAbstractType* CloneUnfinalized() const;
virtual RawAbstractType* CloneUninstantiated(
@@ -5666,7 +5696,8 @@ class TypeRef : public AbstractType {
virtual RawTypeRef* InstantiateFrom(
const TypeArguments& instantiator_type_arguments,
Error* bound_error,
- TrailPtr trail = NULL,
+ TrailPtr instantiation_trail = NULL,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const;
virtual RawTypeRef* CloneUninstantiated(
const Class& new_owner,
@@ -5675,17 +5706,6 @@ class TypeRef : public AbstractType {
virtual intptr_t Hash() const;
- // Return true if the receiver is contained in the trail.
- // Otherwise, if the trail is null, allocate a trail, then add the receiver to
- // the trail and return false.
- bool TestAndAddToTrail(TrailPtr* trail) const;
-
- // Return true if the pair <receiver, buddy> is contained in the trail.
- // Otherwise, if the trail is null, allocate a trail, add the pair <receiver,
- // buddy> to the trail and return false.
- // The receiver may be added several times, each time with a different buddy.
- bool TestAndAddBuddyToTrail(TrailPtr* trail, const AbstractType& buddy) const;
-
static intptr_t InstanceSize() {
return RoundedAllocationSize(sizeof(RawTypeRef));
}
@@ -5738,6 +5758,7 @@ class TypeParameter : public AbstractType {
bool CheckBound(const AbstractType& bounded_type,
const AbstractType& upper_bound,
Error* bound_error,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const;
virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
virtual bool IsInstantiated(TrailPtr trail = NULL) const {
@@ -5748,7 +5769,8 @@ class TypeParameter : public AbstractType {
virtual RawAbstractType* InstantiateFrom(
const TypeArguments& instantiator_type_arguments,
Error* bound_error,
- TrailPtr trail = NULL,
+ TrailPtr instantiation_trail = NULL,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const;
virtual RawAbstractType* CloneUnfinalized() const;
virtual RawAbstractType* CloneUninstantiated(
@@ -5833,7 +5855,8 @@ class BoundedType : public AbstractType {
virtual RawAbstractType* InstantiateFrom(
const TypeArguments& instantiator_type_arguments,
Error* bound_error,
- TrailPtr trail = NULL,
+ TrailPtr instantiation_trail = NULL,
+ TrailPtr bound_trail = NULL,
Heap::Space space = Heap::kNew) const;
virtual RawAbstractType* CloneUnfinalized() const;
virtual RawAbstractType* CloneUninstantiated(
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698