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

Unified Diff: runtime/vm/object.h

Issue 3007603002: [VM generic function reification] Support generic functions in Invocation class. (Closed)
Patch Set: address review comment 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/native_entry.h ('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 04732ff4273debe491a4d6dbaa00d545d285110a..03a00b00f3cbe896a2a9df7704704aad3b646c10 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1582,223 +1582,6 @@ enum Genericity {
kFunctions, // Consider type params of current and parent functions.
};
-// A TypeArguments is an array of AbstractType.
-class TypeArguments : public Object {
- public:
- // We use 30 bits for the hash code so hashes in a snapshot taken on a
- // 64-bit architecture stay in Smi range when loaded on a 32-bit
- // architecture.
- static const intptr_t kHashBits = 30;
-
- intptr_t Length() const;
- RawAbstractType* TypeAt(intptr_t index) const;
- static intptr_t type_at_offset(intptr_t index) {
- return OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types) +
- index * kWordSize;
- }
- void SetTypeAt(intptr_t index, const AbstractType& value) const;
-
- // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
- RawString* Name() const { return SubvectorName(0, Length(), kInternalName); }
-
- // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>".
- // Names of internal classes are mapped to their public interfaces.
- RawString* UserVisibleName() const {
- return SubvectorName(0, Length(), kUserVisibleName);
- }
-
- // Check if the subvector of length 'len' starting at 'from_index' of this
- // type argument vector consists solely of DynamicType.
- bool IsRaw(intptr_t from_index, intptr_t len) const {
- return IsDynamicTypes(false, from_index, len);
- }
-
- // Check if this type argument vector would consist solely of DynamicType if
- // it was instantiated from both a raw (null) instantiator typearguments and
- // a raw (null) function type arguments, i.e. consider each class type
- // parameter and function type parameters as it would be first instantiated
- // from a vector of dynamic types.
- // Consider only a prefix of length 'len'.
- bool IsRawWhenInstantiatedFromRaw(intptr_t len) const {
- return IsDynamicTypes(true, 0, len);
- }
-
- // Check the subtype relationship, considering only a subvector of length
- // 'len' starting at 'from_index'.
- bool IsSubtypeOf(const TypeArguments& other,
- intptr_t from_index,
- intptr_t len,
- Error* bound_error,
- TrailPtr bound_trail,
- Heap::Space space) const {
- return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error,
- bound_trail, space);
- }
-
- // Check the 'more specific' relationship, considering only a subvector of
- // length 'len' starting at 'from_index'.
- bool IsMoreSpecificThan(const TypeArguments& other,
- intptr_t from_index,
- intptr_t len,
- Error* bound_error,
- TrailPtr bound_trail,
- Heap::Space space) const {
- return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error,
- bound_trail, space);
- }
-
- // Check if the vectors are equal (they may be null).
- bool Equals(const TypeArguments& other) const {
- return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length());
- }
-
- bool IsEquivalent(const TypeArguments& other, TrailPtr trail = NULL) const {
- return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length(), trail);
- }
- bool IsSubvectorEquivalent(const TypeArguments& other,
- intptr_t from_index,
- intptr_t len,
- TrailPtr trail = NULL) const;
-
- // Check if the vector is instantiated (it must not be null).
- bool IsInstantiated(Genericity genericity = kAny,
- intptr_t num_free_fun_type_params = kMaxInt32,
- TrailPtr trail = NULL) const {
- return IsSubvectorInstantiated(0, Length(), genericity,
- num_free_fun_type_params, trail);
- }
- bool IsSubvectorInstantiated(intptr_t from_index,
- intptr_t len,
- Genericity genericity = kAny,
- intptr_t num_free_fun_type_params = kMaxInt32,
- TrailPtr trail = NULL) const;
- bool IsUninstantiatedIdentity() const;
- bool CanShareInstantiatorTypeArguments(const Class& instantiator_class) const;
-
- // Return true if all types of this vector are respectively, resolved,
- // finalized, or bounded.
- bool IsResolved() const;
- bool IsFinalized() const;
- bool IsBounded() const;
-
- // Return true if this vector contains a recursive type argument.
- bool IsRecursive() const;
-
- // Set the scope of this type argument vector to the given function.
- void SetScopeFunction(const Function& function) const;
-
- // Clone this type argument vector and clone all unfinalized type arguments.
- // Finalized type arguments are shared.
- RawTypeArguments* CloneUnfinalized() const;
-
- // Clone this type argument vector and clone all uninstantiated type
- // arguments, changing the class owner of type parameters.
- // Instantiated type arguments are shared.
- RawTypeArguments* CloneUninstantiated(const Class& new_owner,
- TrailPtr trail = NULL) const;
-
- // Canonicalize only if instantiated, otherwise returns 'this'.
- RawTypeArguments* Canonicalize(TrailPtr trail = NULL) const;
-
- // Returns a formatted list of occurring type arguments with their URI.
- RawString* EnumerateURIs() const;
-
- // Return 'this' if this type argument vector is instantiated, i.e. if it does
- // not refer to type parameters. Otherwise, return a new type argument vector
- // where each reference to a type parameter is replaced with the corresponding
- // type from the various type argument vectors (class instantiator, function,
- // or parent functions via the current context).
- // If bound_error is not NULL, it may be set to reflect a bound error.
- RawTypeArguments* InstantiateFrom(
- const TypeArguments& instantiator_type_arguments,
- const TypeArguments& function_type_arguments,
- Error* bound_error,
- TrailPtr instantiation_trail,
- TrailPtr bound_trail,
- Heap::Space space) const;
-
- // Runtime instantiation with canonicalization. Not to be used during type
- // finalization at compile time.
- RawTypeArguments* InstantiateAndCanonicalizeFrom(
- const TypeArguments& instantiator_type_arguments,
- const TypeArguments& function_type_arguments,
- Error* bound_error) const;
-
- // Return true if this type argument vector has cached instantiations.
- bool HasInstantiations() const;
-
- // Return the number of cached instantiations for this type argument vector.
- intptr_t NumInstantiations() const;
-
- static intptr_t instantiations_offset() {
- return OFFSET_OF(RawTypeArguments, instantiations_);
- }
-
- static const intptr_t kBytesPerElement = kWordSize;
- static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
-
- static intptr_t InstanceSize() {
- ASSERT(sizeof(RawTypeArguments) ==
- OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types));
- return 0;
- }
-
- static intptr_t InstanceSize(intptr_t len) {
- // Ensure that the types() is not adding to the object size, which includes
- // 3 fields: instantiations_, length_ and hash_.
- ASSERT(sizeof(RawTypeArguments) ==
- (sizeof(RawObject) + (kNumFields * kWordSize)));
- ASSERT(0 <= len && len <= kMaxElements);
- return RoundedAllocationSize(sizeof(RawTypeArguments) +
- (len * kBytesPerElement));
- }
-
- intptr_t Hash() const;
-
- static RawTypeArguments* New(intptr_t len, Heap::Space space = Heap::kOld);
-
- private:
- intptr_t ComputeHash() const;
- void SetHash(intptr_t value) const;
-
- // Check if the subvector of length 'len' starting at 'from_index' of this
- // type argument vector consists solely of DynamicType.
- // If raw_instantiated is true, consider each class type parameter to be first
- // instantiated from a vector of dynamic types.
- bool IsDynamicTypes(bool raw_instantiated,
- intptr_t from_index,
- intptr_t len) const;
-
- // Check the subtype or 'more specific' relationship, considering only a
- // subvector of length 'len' starting at 'from_index'.
- bool TypeTest(TypeTestKind test_kind,
- const TypeArguments& other,
- 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
- // vector, e.g. "<T, dynamic, List<T>, int>".
- RawString* SubvectorName(intptr_t from_index,
- intptr_t len,
- NameVisibility name_visibility) const;
-
- RawArray* instantiations() const;
- void set_instantiations(const Array& value) const;
- RawAbstractType* const* TypeAddr(intptr_t index) const;
- void SetLength(intptr_t value) const;
- // Number of fields in the raw object=3 (instantiations_, length_ and hash_).
- static const int kNumFields = 3;
-
- FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Object);
- friend class AbstractType;
- friend class Class;
- friend class ClearTypeHashVisitor;
- friend class Object;
-};
-
class PatchClass : public Object {
public:
RawClass* patched_class() const { return raw_ptr()->patched_class_; }
@@ -5726,6 +5509,223 @@ class LibraryPrefix : public Instance {
friend class Class;
};
+// A TypeArguments is an array of AbstractType.
+class TypeArguments : public Instance {
+ public:
+ // We use 30 bits for the hash code so hashes in a snapshot taken on a
+ // 64-bit architecture stay in Smi range when loaded on a 32-bit
+ // architecture.
+ static const intptr_t kHashBits = 30;
+
+ intptr_t Length() const;
+ RawAbstractType* TypeAt(intptr_t index) const;
+ static intptr_t type_at_offset(intptr_t index) {
+ return OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types) +
+ index * kWordSize;
+ }
+ void SetTypeAt(intptr_t index, const AbstractType& value) const;
+
+ // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
+ RawString* Name() const { return SubvectorName(0, Length(), kInternalName); }
+
+ // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>".
+ // Names of internal classes are mapped to their public interfaces.
+ RawString* UserVisibleName() const {
+ return SubvectorName(0, Length(), kUserVisibleName);
+ }
+
+ // Check if the subvector of length 'len' starting at 'from_index' of this
+ // type argument vector consists solely of DynamicType.
+ bool IsRaw(intptr_t from_index, intptr_t len) const {
+ return IsDynamicTypes(false, from_index, len);
+ }
+
+ // Check if this type argument vector would consist solely of DynamicType if
+ // it was instantiated from both a raw (null) instantiator typearguments and
+ // a raw (null) function type arguments, i.e. consider each class type
+ // parameter and function type parameters as it would be first instantiated
+ // from a vector of dynamic types.
+ // Consider only a prefix of length 'len'.
+ bool IsRawWhenInstantiatedFromRaw(intptr_t len) const {
+ return IsDynamicTypes(true, 0, len);
+ }
+
+ // Check the subtype relationship, considering only a subvector of length
+ // 'len' starting at 'from_index'.
+ bool IsSubtypeOf(const TypeArguments& other,
+ intptr_t from_index,
+ intptr_t len,
+ Error* bound_error,
+ TrailPtr bound_trail,
+ Heap::Space space) const {
+ return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error,
+ bound_trail, space);
+ }
+
+ // Check the 'more specific' relationship, considering only a subvector of
+ // length 'len' starting at 'from_index'.
+ bool IsMoreSpecificThan(const TypeArguments& other,
+ intptr_t from_index,
+ intptr_t len,
+ Error* bound_error,
+ TrailPtr bound_trail,
+ Heap::Space space) const {
+ return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error,
+ bound_trail, space);
+ }
+
+ // Check if the vectors are equal (they may be null).
+ bool Equals(const TypeArguments& other) const {
+ return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length());
+ }
+
+ bool IsEquivalent(const TypeArguments& other, TrailPtr trail = NULL) const {
+ return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length(), trail);
+ }
+ bool IsSubvectorEquivalent(const TypeArguments& other,
+ intptr_t from_index,
+ intptr_t len,
+ TrailPtr trail = NULL) const;
+
+ // Check if the vector is instantiated (it must not be null).
+ bool IsInstantiated(Genericity genericity = kAny,
+ intptr_t num_free_fun_type_params = kMaxInt32,
+ TrailPtr trail = NULL) const {
+ return IsSubvectorInstantiated(0, Length(), genericity,
+ num_free_fun_type_params, trail);
+ }
+ bool IsSubvectorInstantiated(intptr_t from_index,
+ intptr_t len,
+ Genericity genericity = kAny,
+ intptr_t num_free_fun_type_params = kMaxInt32,
+ TrailPtr trail = NULL) const;
+ bool IsUninstantiatedIdentity() const;
+ bool CanShareInstantiatorTypeArguments(const Class& instantiator_class) const;
+
+ // Return true if all types of this vector are respectively, resolved,
+ // finalized, or bounded.
+ bool IsResolved() const;
+ bool IsFinalized() const;
+ bool IsBounded() const;
+
+ // Return true if this vector contains a recursive type argument.
+ bool IsRecursive() const;
+
+ // Set the scope of this type argument vector to the given function.
+ void SetScopeFunction(const Function& function) const;
+
+ // Clone this type argument vector and clone all unfinalized type arguments.
+ // Finalized type arguments are shared.
+ RawTypeArguments* CloneUnfinalized() const;
+
+ // Clone this type argument vector and clone all uninstantiated type
+ // arguments, changing the class owner of type parameters.
+ // Instantiated type arguments are shared.
+ RawTypeArguments* CloneUninstantiated(const Class& new_owner,
+ TrailPtr trail = NULL) const;
+
+ // Canonicalize only if instantiated, otherwise returns 'this'.
+ RawTypeArguments* Canonicalize(TrailPtr trail = NULL) const;
+
+ // Returns a formatted list of occurring type arguments with their URI.
+ RawString* EnumerateURIs() const;
+
+ // Return 'this' if this type argument vector is instantiated, i.e. if it does
+ // not refer to type parameters. Otherwise, return a new type argument vector
+ // where each reference to a type parameter is replaced with the corresponding
+ // type from the various type argument vectors (class instantiator, function,
+ // or parent functions via the current context).
+ // If bound_error is not NULL, it may be set to reflect a bound error.
+ RawTypeArguments* InstantiateFrom(
+ const TypeArguments& instantiator_type_arguments,
+ const TypeArguments& function_type_arguments,
+ Error* bound_error,
+ TrailPtr instantiation_trail,
+ TrailPtr bound_trail,
+ Heap::Space space) const;
+
+ // Runtime instantiation with canonicalization. Not to be used during type
+ // finalization at compile time.
+ RawTypeArguments* InstantiateAndCanonicalizeFrom(
+ const TypeArguments& instantiator_type_arguments,
+ const TypeArguments& function_type_arguments,
+ Error* bound_error) const;
+
+ // Return true if this type argument vector has cached instantiations.
+ bool HasInstantiations() const;
+
+ // Return the number of cached instantiations for this type argument vector.
+ intptr_t NumInstantiations() const;
+
+ static intptr_t instantiations_offset() {
+ return OFFSET_OF(RawTypeArguments, instantiations_);
+ }
+
+ static const intptr_t kBytesPerElement = kWordSize;
+ static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
+
+ static intptr_t InstanceSize() {
+ ASSERT(sizeof(RawTypeArguments) ==
+ OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types));
+ return 0;
+ }
+
+ static intptr_t InstanceSize(intptr_t len) {
+ // Ensure that the types() is not adding to the object size, which includes
+ // 3 fields: instantiations_, length_ and hash_.
+ ASSERT(sizeof(RawTypeArguments) ==
+ (sizeof(RawObject) + (kNumFields * kWordSize)));
+ ASSERT(0 <= len && len <= kMaxElements);
+ return RoundedAllocationSize(sizeof(RawTypeArguments) +
+ (len * kBytesPerElement));
+ }
+
+ intptr_t Hash() const;
+
+ static RawTypeArguments* New(intptr_t len, Heap::Space space = Heap::kOld);
+
+ private:
+ intptr_t ComputeHash() const;
+ void SetHash(intptr_t value) const;
+
+ // Check if the subvector of length 'len' starting at 'from_index' of this
+ // type argument vector consists solely of DynamicType.
+ // If raw_instantiated is true, consider each class type parameter to be first
+ // instantiated from a vector of dynamic types.
+ bool IsDynamicTypes(bool raw_instantiated,
+ intptr_t from_index,
+ intptr_t len) const;
+
+ // Check the subtype or 'more specific' relationship, considering only a
+ // subvector of length 'len' starting at 'from_index'.
+ bool TypeTest(TypeTestKind test_kind,
+ const TypeArguments& other,
+ 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
+ // vector, e.g. "<T, dynamic, List<T>, int>".
+ RawString* SubvectorName(intptr_t from_index,
+ intptr_t len,
+ NameVisibility name_visibility) const;
+
+ RawArray* instantiations() const;
+ void set_instantiations(const Array& value) const;
+ RawAbstractType* const* TypeAddr(intptr_t index) const;
+ void SetLength(intptr_t value) const;
+ // Number of fields in the raw object=3 (instantiations_, length_ and hash_).
+ static const int kNumFields = 3;
+
+ FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Instance);
+ friend class AbstractType;
+ friend class Class;
+ friend class ClearTypeHashVisitor;
+ friend class Object;
+};
+
// AbstractType is an abstract superclass.
// Subclasses of AbstractType are Type and TypeParameter.
class AbstractType : public Instance {
« no previous file with comments | « runtime/vm/native_entry.h ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698