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

Side by Side Diff: runtime/vm/object.h

Issue 109593003: Use a trail instead of a mark bit when processing recursive types in the VM (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 11 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/code_generator.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_OBJECT_H_ 5 #ifndef VM_OBJECT_H_
6 #define VM_OBJECT_H_ 6 #define VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1206 // Returns true if all types of this vector are finalized. 1206 // Returns true if all types of this vector are finalized.
1207 virtual bool IsFinalized() const { return true; } 1207 virtual bool IsFinalized() const { return true; }
1208 1208
1209 // Return 'this' if this type argument vector is instantiated, i.e. if it does 1209 // Return 'this' if this type argument vector is instantiated, i.e. if it does
1210 // not refer to type parameters. Otherwise, return a new type argument vector 1210 // not refer to type parameters. Otherwise, return a new type argument vector
1211 // where each reference to a type parameter is replaced with the corresponding 1211 // where each reference to a type parameter is replaced with the corresponding
1212 // type of the instantiator type argument vector. 1212 // type of the instantiator type argument vector.
1213 // If bound_error is not NULL, it may be set to reflect a bound error. 1213 // If bound_error is not NULL, it may be set to reflect a bound error.
1214 virtual RawAbstractTypeArguments* InstantiateFrom( 1214 virtual RawAbstractTypeArguments* InstantiateFrom(
1215 const AbstractTypeArguments& instantiator_type_arguments, 1215 const AbstractTypeArguments& instantiator_type_arguments,
1216 Error* bound_error) const; 1216 Error* bound_error,
1217 GrowableObjectArray* trail = NULL) const;
1217 1218
1218 // Do not clone InstantiatedTypeArguments or null vectors, since they are 1219 // Do not clone InstantiatedTypeArguments or null vectors, since they are
1219 // considered finalized. 1220 // considered finalized.
1220 virtual RawAbstractTypeArguments* CloneUnfinalized() const { 1221 virtual RawAbstractTypeArguments* CloneUnfinalized() const {
1221 return this->raw(); 1222 return this->raw();
1222 } 1223 }
1223 1224
1224 // Null vectors are canonical. 1225 // Null vectors are canonical.
1225 virtual RawAbstractTypeArguments* Canonicalize() const { return this->raw(); } 1226 virtual RawAbstractTypeArguments* Canonicalize(
1227 GrowableObjectArray* trail = NULL) const {
1228 return this->raw();
1229 }
1226 1230
1227 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>". 1231 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
1228 virtual RawString* Name() const { 1232 virtual RawString* Name() const {
1229 return SubvectorName(0, Length(), kInternalName); 1233 return SubvectorName(0, Length(), kInternalName);
1230 } 1234 }
1231 1235
1232 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>". 1236 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>".
1233 // Names of internal classes are mapped to their public interfaces. 1237 // Names of internal classes are mapped to their public interfaces.
1234 virtual RawString* UserVisibleName() const { 1238 virtual RawString* UserVisibleName() const {
1235 return SubvectorName(0, Length(), kUserVisibleName); 1239 return SubvectorName(0, Length(), kUserVisibleName);
(...skipping 25 matching lines...) Expand all
1261 // Check the 'more specific' relationship, considering only a subvector of 1265 // Check the 'more specific' relationship, considering only a subvector of
1262 // length 'len' starting at 'from_index'. 1266 // length 'len' starting at 'from_index'.
1263 bool IsMoreSpecificThan(const AbstractTypeArguments& other, 1267 bool IsMoreSpecificThan(const AbstractTypeArguments& other,
1264 intptr_t from_index, 1268 intptr_t from_index,
1265 intptr_t len, 1269 intptr_t len,
1266 Error* bound_error) const { 1270 Error* bound_error) const {
1267 return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error); 1271 return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error);
1268 } 1272 }
1269 1273
1270 // Check if the vectors are equal. 1274 // Check if the vectors are equal.
1271 bool Equals(const AbstractTypeArguments& other) const; 1275 bool Equals(const AbstractTypeArguments& other) const {
1276 return IsEquivalent(other);
1277 }
1278
1279 bool IsEquivalent(const AbstractTypeArguments& other,
1280 GrowableObjectArray* trail = NULL) const;
1272 1281
1273 // UNREACHABLEs as AbstractTypeArguments is an abstract class. 1282 // UNREACHABLEs as AbstractTypeArguments is an abstract class.
1274 virtual intptr_t Length() const; 1283 virtual intptr_t Length() const;
1275 virtual RawAbstractType* TypeAt(intptr_t index) const; 1284 virtual RawAbstractType* TypeAt(intptr_t index) const;
1276 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const; 1285 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const;
1277 virtual bool IsResolved() const; 1286 virtual bool IsResolved() const;
1278 virtual bool IsInstantiated() const; 1287 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
1279 virtual bool IsUninstantiatedIdentity() const; 1288 virtual bool IsUninstantiatedIdentity() const;
1280 virtual bool CanShareInstantiatorTypeArguments( 1289 virtual bool CanShareInstantiatorTypeArguments(
1281 const Class& instantiator_class) const; 1290 const Class& instantiator_class) const;
1282 virtual bool IsBounded() const; 1291 virtual bool IsBounded() const;
1283 1292
1284 virtual intptr_t Hash() const; 1293 virtual intptr_t Hash() const;
1285 1294
1286 private: 1295 private:
1287 // Check if the subvector of length 'len' starting at 'from_index' of this 1296 // Check if the subvector of length 'len' starting at 'from_index' of this
1288 // type argument vector consists solely of DynamicType. 1297 // type argument vector consists solely of DynamicType.
(...skipping 27 matching lines...) Expand all
1316 // A TypeArguments is an array of AbstractType. 1325 // A TypeArguments is an array of AbstractType.
1317 class TypeArguments : public AbstractTypeArguments { 1326 class TypeArguments : public AbstractTypeArguments {
1318 public: 1327 public:
1319 virtual intptr_t Length() const; 1328 virtual intptr_t Length() const;
1320 virtual RawAbstractType* TypeAt(intptr_t index) const; 1329 virtual RawAbstractType* TypeAt(intptr_t index) const;
1321 static intptr_t type_at_offset(intptr_t index) { 1330 static intptr_t type_at_offset(intptr_t index) {
1322 return OFFSET_OF(RawTypeArguments, types_) + index * kWordSize; 1331 return OFFSET_OF(RawTypeArguments, types_) + index * kWordSize;
1323 } 1332 }
1324 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const; 1333 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const;
1325 virtual bool IsResolved() const; 1334 virtual bool IsResolved() const;
1326 virtual bool IsInstantiated() const; 1335 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
1327 virtual bool IsUninstantiatedIdentity() const; 1336 virtual bool IsUninstantiatedIdentity() const;
1328 virtual bool CanShareInstantiatorTypeArguments( 1337 virtual bool CanShareInstantiatorTypeArguments(
1329 const Class& instantiator_class) const; 1338 const Class& instantiator_class) const;
1330 virtual bool IsFinalized() const; 1339 virtual bool IsFinalized() const;
1331 virtual bool IsBounded() const; 1340 virtual bool IsBounded() const;
1332 virtual RawAbstractTypeArguments* CloneUnfinalized() const; 1341 virtual RawAbstractTypeArguments* CloneUnfinalized() const;
1333 // Canonicalize only if instantiated, otherwise returns 'this'. 1342 // Canonicalize only if instantiated, otherwise returns 'this'.
1334 virtual RawAbstractTypeArguments* Canonicalize() const; 1343 virtual RawAbstractTypeArguments* Canonicalize(
1344 GrowableObjectArray* trail = NULL) const;
1335 1345
1336 virtual RawAbstractTypeArguments* InstantiateFrom( 1346 virtual RawAbstractTypeArguments* InstantiateFrom(
1337 const AbstractTypeArguments& instantiator_type_arguments, 1347 const AbstractTypeArguments& instantiator_type_arguments,
1338 Error* bound_error) const; 1348 Error* bound_error,
1349 GrowableObjectArray* trail = NULL) const;
1339 1350
1340 static const intptr_t kBytesPerElement = kWordSize; 1351 static const intptr_t kBytesPerElement = kWordSize;
1341 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; 1352 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
1342 1353
1343 static intptr_t length_offset() { 1354 static intptr_t length_offset() {
1344 return OFFSET_OF(RawTypeArguments, length_); 1355 return OFFSET_OF(RawTypeArguments, length_);
1345 } 1356 }
1346 1357
1347 static intptr_t InstanceSize() { 1358 static intptr_t InstanceSize() {
1348 ASSERT(sizeof(RawTypeArguments) == OFFSET_OF(RawTypeArguments, types_)); 1359 ASSERT(sizeof(RawTypeArguments) == OFFSET_OF(RawTypeArguments, types_));
(...skipping 28 matching lines...) Expand all
1377 // one TypeParameter object, i.e. to a type that is not known at compile time. 1388 // one TypeParameter object, i.e. to a type that is not known at compile time.
1378 // The second type argument vector is the instantiator, because each type 1389 // The second type argument vector is the instantiator, because each type
1379 // parameter with index i in the first vector can be substituted (or 1390 // parameter with index i in the first vector can be substituted (or
1380 // "instantiated") with the type at index i in the second type argument vector. 1391 // "instantiated") with the type at index i in the second type argument vector.
1381 class InstantiatedTypeArguments : public AbstractTypeArguments { 1392 class InstantiatedTypeArguments : public AbstractTypeArguments {
1382 public: 1393 public:
1383 virtual intptr_t Length() const; 1394 virtual intptr_t Length() const;
1384 virtual RawAbstractType* TypeAt(intptr_t index) const; 1395 virtual RawAbstractType* TypeAt(intptr_t index) const;
1385 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const; 1396 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const;
1386 virtual bool IsResolved() const { return true; } 1397 virtual bool IsResolved() const { return true; }
1387 virtual bool IsInstantiated() const { return true; } 1398 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const {
1399 return true;
1400 }
1388 virtual bool IsUninstantiatedIdentity() const { 1401 virtual bool IsUninstantiatedIdentity() const {
1389 UNREACHABLE(); 1402 UNREACHABLE();
1390 return false; 1403 return false;
1391 } 1404 }
1392 virtual bool CanShareInstantiatorTypeArguments( 1405 virtual bool CanShareInstantiatorTypeArguments(
1393 const Class& instantiator_class) const { 1406 const Class& instantiator_class) const {
1394 UNREACHABLE(); 1407 UNREACHABLE();
1395 return false; 1408 return false;
1396 } 1409 }
1397 virtual bool IsBounded() const { return false; } // Bounds were checked. 1410 virtual bool IsBounded() const { return false; } // Bounds were checked.
1398 virtual RawAbstractTypeArguments* Canonicalize() const; 1411 virtual RawAbstractTypeArguments* Canonicalize(
1412 GrowableObjectArray* trail = NULL) const;
1399 1413
1400 RawAbstractTypeArguments* uninstantiated_type_arguments() const { 1414 RawAbstractTypeArguments* uninstantiated_type_arguments() const {
1401 return raw_ptr()->uninstantiated_type_arguments_; 1415 return raw_ptr()->uninstantiated_type_arguments_;
1402 } 1416 }
1403 static intptr_t uninstantiated_type_arguments_offset() { 1417 static intptr_t uninstantiated_type_arguments_offset() {
1404 return OFFSET_OF(RawInstantiatedTypeArguments, 1418 return OFFSET_OF(RawInstantiatedTypeArguments,
1405 uninstantiated_type_arguments_); 1419 uninstantiated_type_arguments_);
1406 } 1420 }
1407 1421
1408 RawAbstractTypeArguments* instantiator_type_arguments() const { 1422 RawAbstractTypeArguments* instantiator_type_arguments() const {
(...skipping 2670 matching lines...) Expand 10 before | Expand all | Expand 10 after
4079 virtual bool IsMalbounded() const; 4093 virtual bool IsMalbounded() const;
4080 virtual bool IsMalformedOrMalbounded() const; 4094 virtual bool IsMalformedOrMalbounded() const;
4081 virtual RawLanguageError* error() const; 4095 virtual RawLanguageError* error() const;
4082 virtual void set_error(const LanguageError& value) const; 4096 virtual void set_error(const LanguageError& value) const;
4083 virtual bool IsResolved() const; 4097 virtual bool IsResolved() const;
4084 virtual bool HasResolvedTypeClass() const; 4098 virtual bool HasResolvedTypeClass() const;
4085 virtual RawClass* type_class() const; 4099 virtual RawClass* type_class() const;
4086 virtual RawUnresolvedClass* unresolved_class() const; 4100 virtual RawUnresolvedClass* unresolved_class() const;
4087 virtual RawAbstractTypeArguments* arguments() const; 4101 virtual RawAbstractTypeArguments* arguments() const;
4088 virtual intptr_t token_pos() const; 4102 virtual intptr_t token_pos() const;
4089 virtual bool IsInstantiated() const; 4103 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
4090 virtual bool Equals(const Instance& other) const; 4104 virtual bool Equals(const Instance& other) const {
4105 return IsEquivalent(other);
4106 }
4107 virtual bool IsEquivalent(const Instance& other,
4108 GrowableObjectArray* trail = NULL) const;
4091 4109
4092 // Instantiate this type using the given type argument vector. 4110 // Instantiate this type using the given type argument vector.
4093 // Return a new type, or return 'this' if it is already instantiated. 4111 // Return a new type, or return 'this' if it is already instantiated.
4094 // If bound_error is not NULL, it may be set to reflect a bound error. 4112 // If bound_error is not NULL, it may be set to reflect a bound error.
4095 virtual RawAbstractType* InstantiateFrom( 4113 virtual RawAbstractType* InstantiateFrom(
4096 const AbstractTypeArguments& instantiator_type_arguments, 4114 const AbstractTypeArguments& instantiator_type_arguments,
4097 Error* bound_error) const; 4115 Error* bound_error,
4116 GrowableObjectArray* trail = NULL) const;
4098 4117
4099 // Return a clone of this unfinalized type or the type itself if it is 4118 // Return a clone of this unfinalized type or the type itself if it is
4100 // already finalized. Apply recursively to type arguments, i.e. finalized 4119 // already finalized. Apply recursively to type arguments, i.e. finalized
4101 // type arguments of an unfinalized type are not cloned, but shared. 4120 // type arguments of an unfinalized type are not cloned, but shared.
4102 virtual RawAbstractType* CloneUnfinalized() const; 4121 virtual RawAbstractType* CloneUnfinalized() const;
4103 4122
4104 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { 4123 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const {
4105 return Canonicalize(); 4124 return Canonicalize();
4106 } 4125 }
4107 4126
4108 // Return the canonical version of this type. 4127 // Return the canonical version of this type.
4109 virtual RawAbstractType* Canonicalize() const; 4128 virtual RawAbstractType* Canonicalize(
4129 GrowableObjectArray* trail = NULL) const;
4110 4130
4111 // The name of this type, including the names of its type arguments, if any. 4131 // The name of this type, including the names of its type arguments, if any.
4112 virtual RawString* Name() const { 4132 virtual RawString* Name() const {
4113 return BuildName(kInternalName); 4133 return BuildName(kInternalName);
4114 } 4134 }
4115 4135
4116 // The name of this type, including the names of its type arguments, if any. 4136 // The name of this type, including the names of its type arguments, if any.
4117 // Names of internal classes are mapped to their public interfaces. 4137 // Names of internal classes are mapped to their public interfaces.
4118 virtual RawString* UserVisibleName() const { 4138 virtual RawString* UserVisibleName() const {
4119 return BuildName(kUserVisibleName); 4139 return BuildName(kUserVisibleName);
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
4225 virtual RawLanguageError* error() const { return raw_ptr()->error_; } 4245 virtual RawLanguageError* error() const { return raw_ptr()->error_; }
4226 virtual void set_error(const LanguageError& value) const; 4246 virtual void set_error(const LanguageError& value) const;
4227 virtual bool IsResolved() const; // Class and all arguments classes resolved. 4247 virtual bool IsResolved() const; // Class and all arguments classes resolved.
4228 virtual bool HasResolvedTypeClass() const; // Own type class resolved. 4248 virtual bool HasResolvedTypeClass() const; // Own type class resolved.
4229 virtual RawClass* type_class() const; 4249 virtual RawClass* type_class() const;
4230 void set_type_class(const Object& value) const; 4250 void set_type_class(const Object& value) const;
4231 virtual RawUnresolvedClass* unresolved_class() const; 4251 virtual RawUnresolvedClass* unresolved_class() const;
4232 virtual RawAbstractTypeArguments* arguments() const; 4252 virtual RawAbstractTypeArguments* arguments() const;
4233 void set_arguments(const AbstractTypeArguments& value) const; 4253 void set_arguments(const AbstractTypeArguments& value) const;
4234 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } 4254 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; }
4235 virtual bool IsInstantiated() const; 4255 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
4236 virtual bool Equals(const Instance& other) const; 4256 virtual bool IsEquivalent(const Instance& other,
4257 GrowableObjectArray* trail = NULL) const;
4237 virtual RawAbstractType* InstantiateFrom( 4258 virtual RawAbstractType* InstantiateFrom(
4238 const AbstractTypeArguments& instantiator_type_arguments, 4259 const AbstractTypeArguments& instantiator_type_arguments,
4239 Error* malformed_error) const; 4260 Error* malformed_error,
4261 GrowableObjectArray* trail = NULL) const;
4240 virtual RawAbstractType* CloneUnfinalized() const; 4262 virtual RawAbstractType* CloneUnfinalized() const;
4241 virtual RawAbstractType* Canonicalize() const; 4263 virtual RawAbstractType* Canonicalize(
4264 GrowableObjectArray* trail = NULL) const;
4242 4265
4243 virtual intptr_t Hash() const; 4266 virtual intptr_t Hash() const;
4244 4267
4245 static intptr_t InstanceSize() { 4268 static intptr_t InstanceSize() {
4246 return RoundedAllocationSize(sizeof(RawType)); 4269 return RoundedAllocationSize(sizeof(RawType));
4247 } 4270 }
4248 4271
4249 // The type of the literal 'null'. 4272 // The type of the literal 'null'.
4250 static RawType* NullType(); 4273 static RawType* NullType();
4251 4274
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
4336 void set_type(const AbstractType& value) const; 4359 void set_type(const AbstractType& value) const;
4337 virtual RawClass* type_class() const { 4360 virtual RawClass* type_class() const {
4338 return AbstractType::Handle(type()).type_class(); 4361 return AbstractType::Handle(type()).type_class();
4339 } 4362 }
4340 virtual RawAbstractTypeArguments* arguments() const { 4363 virtual RawAbstractTypeArguments* arguments() const {
4341 return AbstractType::Handle(type()).arguments(); 4364 return AbstractType::Handle(type()).arguments();
4342 } 4365 }
4343 virtual intptr_t token_pos() const { 4366 virtual intptr_t token_pos() const {
4344 return AbstractType::Handle(type()).token_pos(); 4367 return AbstractType::Handle(type()).token_pos();
4345 } 4368 }
4346 virtual bool IsInstantiated() const; 4369 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
4347 virtual bool Equals(const Instance& other) const; 4370 virtual bool IsEquivalent(const Instance& other,
4371 GrowableObjectArray* trail = NULL) const;
4348 virtual RawAbstractType* InstantiateFrom( 4372 virtual RawAbstractType* InstantiateFrom(
4349 const AbstractTypeArguments& instantiator_type_arguments, 4373 const AbstractTypeArguments& instantiator_type_arguments,
4350 Error* bound_error) const; 4374 Error* bound_error,
4351 virtual RawAbstractType* Canonicalize() const; 4375 GrowableObjectArray* trail = NULL) const;
4376 virtual RawAbstractType* Canonicalize(
4377 GrowableObjectArray* trail = NULL) const;
4352 4378
4353 virtual intptr_t Hash() const; 4379 virtual intptr_t Hash() const;
4354 4380
4381 // Return true if the receiver is contained in the trail.
4382 // Otherwise, if the trail is null, allocate a trail, then add the receiver to
4383 // the trail and return false.
4384 bool TestAndAddToTrail(GrowableObjectArray** trail) const;
4385
4386 // Return true if the pair <receiver, buddy> is contained in the trail.
4387 // Otherwise, if the trail is null, allocate a trail, add the pair <receiver,
4388 // buddy> to the trail and return false.
4389 // The receiver may be added several times, each time with a different buddy.
4390 bool TestAndAddBuddyToTrail(GrowableObjectArray** trail,
4391 const Object& buddy) const;
4392
4393 // Return the object associated with the receiver in the trail or
4394 // Object::null() if the receiver is not contained in the trail.
4395 RawObject* OnlyBuddyInTrail(GrowableObjectArray* trail) const;
4396
4397 // If the trail is null, allocate a trail, add the pair <receiver, buddy> to
4398 // the trail. The receiver may only be added once with its only buddy.
4399 void AddOnlyBuddyToTrail(GrowableObjectArray** trail,
4400 const Object& buddy) const;
4401
4355 static intptr_t InstanceSize() { 4402 static intptr_t InstanceSize() {
4356 return RoundedAllocationSize(sizeof(RawTypeRef)); 4403 return RoundedAllocationSize(sizeof(RawTypeRef));
4357 } 4404 }
4358 4405
4359 static RawTypeRef* New(const AbstractType& type); 4406 static RawTypeRef* New(const AbstractType& type);
4360 4407
4361 private: 4408 private:
4362 bool is_being_checked() const {
4363 return raw_ptr()->is_being_checked_;
4364 }
4365 void set_is_being_checked(bool value) const;
4366
4367 static RawTypeRef* New(); 4409 static RawTypeRef* New();
4368 4410
4369 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeRef, AbstractType); 4411 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeRef, AbstractType);
4370 friend class Class; 4412 friend class Class;
4371 }; 4413 };
4372 4414
4373 4415
4374 // A TypeParameter represents a type parameter of a parameterized class. 4416 // A TypeParameter represents a type parameter of a parameterized class.
4375 // It specifies its index (and its name for debugging purposes), as well as its 4417 // It specifies its index (and its name for debugging purposes), as well as its
4376 // upper bound. 4418 // upper bound.
(...skipping 26 matching lines...) Expand all
4403 RawAbstractType* bound() const { return raw_ptr()->bound_; } 4445 RawAbstractType* bound() const { return raw_ptr()->bound_; }
4404 void set_bound(const AbstractType& value) const; 4446 void set_bound(const AbstractType& value) const;
4405 // Returns true if bounded_type is below upper_bound, otherwise return false 4447 // Returns true if bounded_type is below upper_bound, otherwise return false
4406 // and set bound_error if both bounded_type and upper_bound are instantiated. 4448 // and set bound_error if both bounded_type and upper_bound are instantiated.
4407 // If one or both are not instantiated, returning false only means that the 4449 // If one or both are not instantiated, returning false only means that the
4408 // bound cannot be checked yet and this is not an error. 4450 // bound cannot be checked yet and this is not an error.
4409 bool CheckBound(const AbstractType& bounded_type, 4451 bool CheckBound(const AbstractType& bounded_type,
4410 const AbstractType& upper_bound, 4452 const AbstractType& upper_bound,
4411 Error* bound_error) const; 4453 Error* bound_error) const;
4412 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } 4454 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; }
4413 virtual bool IsInstantiated() const { return false; } 4455 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const {
4414 virtual bool Equals(const Instance& other) const; 4456 return false;
4457 }
4458 virtual bool IsEquivalent(const Instance& other,
4459 GrowableObjectArray* trail = NULL) const;
4415 virtual RawAbstractType* InstantiateFrom( 4460 virtual RawAbstractType* InstantiateFrom(
4416 const AbstractTypeArguments& instantiator_type_arguments, 4461 const AbstractTypeArguments& instantiator_type_arguments,
4417 Error* bound_error) const; 4462 Error* bound_error,
4463 GrowableObjectArray* trail = NULL) const;
4418 virtual RawAbstractType* CloneUnfinalized() const; 4464 virtual RawAbstractType* CloneUnfinalized() const;
4419 virtual RawAbstractType* Canonicalize() const { return raw(); } 4465 virtual RawAbstractType* Canonicalize(
4466 GrowableObjectArray* trail = NULL) const {
4467 return raw();
4468 }
4420 4469
4421 virtual intptr_t Hash() const; 4470 virtual intptr_t Hash() const;
4422 4471
4423 static intptr_t InstanceSize() { 4472 static intptr_t InstanceSize() {
4424 return RoundedAllocationSize(sizeof(RawTypeParameter)); 4473 return RoundedAllocationSize(sizeof(RawTypeParameter));
4425 } 4474 }
4426 4475
4427 static RawTypeParameter* New(const Class& parameterized_class, 4476 static RawTypeParameter* New(const Class& parameterized_class,
4428 intptr_t index, 4477 intptr_t index,
4429 const String& name, 4478 const String& name,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
4475 return AbstractType::Handle(type()).arguments(); 4524 return AbstractType::Handle(type()).arguments();
4476 } 4525 }
4477 RawAbstractType* type() const { return raw_ptr()->type_; } 4526 RawAbstractType* type() const { return raw_ptr()->type_; }
4478 RawAbstractType* bound() const { return raw_ptr()->bound_; } 4527 RawAbstractType* bound() const { return raw_ptr()->bound_; }
4479 RawTypeParameter* type_parameter() const { 4528 RawTypeParameter* type_parameter() const {
4480 return raw_ptr()->type_parameter_; 4529 return raw_ptr()->type_parameter_;
4481 } 4530 }
4482 virtual intptr_t token_pos() const { 4531 virtual intptr_t token_pos() const {
4483 return AbstractType::Handle(type()).token_pos(); 4532 return AbstractType::Handle(type()).token_pos();
4484 } 4533 }
4485 virtual bool IsInstantiated() const { 4534 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const {
4486 // It is not possible to encounter an instantiated bounded type with an 4535 // It is not possible to encounter an instantiated bounded type with an
4487 // uninstantiated upper bound. Therefore, we do not need to check if the 4536 // uninstantiated upper bound. Therefore, we do not need to check if the
4488 // bound is instantiated. Moreover, doing so could lead into cycles, as in 4537 // bound is instantiated. Moreover, doing so could lead into cycles, as in
4489 // class C<T extends C<C>> { }. 4538 // class C<T extends C<C>> { }.
4490 return AbstractType::Handle(type()).IsInstantiated(); 4539 return AbstractType::Handle(type()).IsInstantiated();
4491 } 4540 }
4492 virtual bool Equals(const Instance& other) const; 4541 virtual bool IsEquivalent(const Instance& other,
4542 GrowableObjectArray* trail = NULL) const;
4493 virtual RawAbstractType* InstantiateFrom( 4543 virtual RawAbstractType* InstantiateFrom(
4494 const AbstractTypeArguments& instantiator_type_arguments, 4544 const AbstractTypeArguments& instantiator_type_arguments,
4495 Error* bound_error) const; 4545 Error* bound_error,
4546 GrowableObjectArray* trail = NULL) const;
4496 virtual RawAbstractType* CloneUnfinalized() const; 4547 virtual RawAbstractType* CloneUnfinalized() const;
4497 virtual RawAbstractType* Canonicalize() const { return raw(); } 4548 virtual RawAbstractType* Canonicalize(
4549 GrowableObjectArray* trail = NULL) const {
4550 return raw();
4551 }
4498 4552
4499 virtual intptr_t Hash() const; 4553 virtual intptr_t Hash() const;
4500 4554
4501 static intptr_t InstanceSize() { 4555 static intptr_t InstanceSize() {
4502 return RoundedAllocationSize(sizeof(RawBoundedType)); 4556 return RoundedAllocationSize(sizeof(RawBoundedType));
4503 } 4557 }
4504 4558
4505 static RawBoundedType* New(const AbstractType& type, 4559 static RawBoundedType* New(const AbstractType& type,
4506 const AbstractType& bound, 4560 const AbstractType& bound,
4507 const TypeParameter& type_parameter); 4561 const TypeParameter& type_parameter);
4508 4562
4509 private: 4563 private:
4510 void set_type(const AbstractType& value) const; 4564 void set_type(const AbstractType& value) const;
4511 void set_bound(const AbstractType& value) const; 4565 void set_bound(const AbstractType& value) const;
4512 void set_type_parameter(const TypeParameter& value) const; 4566 void set_type_parameter(const TypeParameter& value) const;
4513 4567
4514 bool is_being_checked() const {
4515 return raw_ptr()->is_being_checked_;
4516 }
4517 void set_is_being_checked(bool value) const;
4518
4519 static RawBoundedType* New(); 4568 static RawBoundedType* New();
4520 4569
4521 FINAL_HEAP_OBJECT_IMPLEMENTATION(BoundedType, AbstractType); 4570 FINAL_HEAP_OBJECT_IMPLEMENTATION(BoundedType, AbstractType);
4522 friend class Class; 4571 friend class Class;
4523 }; 4572 };
4524 4573
4525 4574
4526 // A MixinAppType represents a parsed mixin application clause, e.g. 4575 // A MixinAppType represents a parsed mixin application clause, e.g.
4527 // "S<T> with M<U>, N<V>". 4576 // "S<T> with M<U>, N<V>".
4528 // MixinAppType objects do not survive finalization, so they do not 4577 // MixinAppType objects do not survive finalization, so they do not
(...skipping 2053 matching lines...) Expand 10 before | Expand all | Expand 10 after
6582 6631
6583 6632
6584 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 6633 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
6585 intptr_t index) { 6634 intptr_t index) {
6586 return array.At((index * kEntryLength) + kTargetFunctionIndex); 6635 return array.At((index * kEntryLength) + kTargetFunctionIndex);
6587 } 6636 }
6588 6637
6589 } // namespace dart 6638 } // namespace dart
6590 6639
6591 #endif // VM_OBJECT_H_ 6640 #endif // VM_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/code_generator.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698