| OLD | NEW | 
|---|
| 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 5227 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5238   // An instance cannot be canonicalized if it still contains non-canonical | 5238   // An instance cannot be canonicalized if it still contains non-canonical | 
| 5239   // instances in its fields. | 5239   // instances in its fields. | 
| 5240   // Returns error in error_str, pass NULL if an error cannot occur. | 5240   // Returns error in error_str, pass NULL if an error cannot occur. | 
| 5241   virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 5241   virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 
| 5242                                             const char** error_str) const; | 5242                                             const char** error_str) const; | 
| 5243 | 5243 | 
| 5244   // Returns true if all fields are OK for canonicalization. | 5244   // Returns true if all fields are OK for canonicalization. | 
| 5245   virtual bool CheckAndCanonicalizeFields(Thread* thread, | 5245   virtual bool CheckAndCanonicalizeFields(Thread* thread, | 
| 5246                                           const char** error_str) const; | 5246                                           const char** error_str) const; | 
| 5247 | 5247 | 
|  | 5248 #if defined(DEBUG) | 
|  | 5249   // Check if instance is canonical. | 
|  | 5250   virtual bool CheckIsCanonical(Thread* thread) const; | 
|  | 5251 #endif  // DEBUG | 
|  | 5252 | 
| 5248   RawObject* GetField(const Field& field) const { | 5253   RawObject* GetField(const Field& field) const { | 
| 5249     return *FieldAddr(field); | 5254     return *FieldAddr(field); | 
| 5250   } | 5255   } | 
| 5251 | 5256 | 
| 5252   void SetField(const Field& field, const Object& value) const { | 5257   void SetField(const Field& field, const Object& value) const { | 
| 5253     field.RecordStore(value); | 5258     field.RecordStore(value); | 
| 5254     StorePointer(FieldAddr(field), value.raw()); | 5259     StorePointer(FieldAddr(field), value.raw()); | 
| 5255   } | 5260   } | 
| 5256 | 5261 | 
| 5257   RawAbstractType* GetType() const; | 5262   RawAbstractType* GetType() const; | 
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5472       const Class& new_owner, TrailPtr trail = NULL) const; | 5477       const Class& new_owner, TrailPtr trail = NULL) const; | 
| 5473 | 5478 | 
| 5474   virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 5479   virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 
| 5475                                             const char** error_str) const { | 5480                                             const char** error_str) const { | 
| 5476     return Canonicalize(); | 5481     return Canonicalize(); | 
| 5477   } | 5482   } | 
| 5478 | 5483 | 
| 5479   // Return the canonical version of this type. | 5484   // Return the canonical version of this type. | 
| 5480   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; | 5485   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; | 
| 5481 | 5486 | 
|  | 5487 #if defined(DEBUG) | 
|  | 5488   // Check if abstract type is canonical. | 
|  | 5489   virtual bool CheckIsCanonical(Thread* thread) const { | 
|  | 5490     UNREACHABLE(); | 
|  | 5491     return false; | 
|  | 5492   } | 
|  | 5493 #endif  // DEBUG | 
|  | 5494 | 
| 5482   // Return the object associated with the receiver in the trail or | 5495   // Return the object associated with the receiver in the trail or | 
| 5483   // AbstractType::null() if the receiver is not contained in the trail. | 5496   // AbstractType::null() if the receiver is not contained in the trail. | 
| 5484   RawAbstractType* OnlyBuddyInTrail(TrailPtr trail) const; | 5497   RawAbstractType* OnlyBuddyInTrail(TrailPtr trail) const; | 
| 5485 | 5498 | 
| 5486   // If the trail is null, allocate a trail, add the pair <receiver, buddy> to | 5499   // If the trail is null, allocate a trail, add the pair <receiver, buddy> to | 
| 5487   // the trail. The receiver may only be added once with its only buddy. | 5500   // the trail. The receiver may only be added once with its only buddy. | 
| 5488   void AddOnlyBuddyToTrail(TrailPtr* trail, const AbstractType& buddy) const; | 5501   void AddOnlyBuddyToTrail(TrailPtr* trail, const AbstractType& buddy) const; | 
| 5489 | 5502 | 
| 5490   // Return true if the receiver is contained in the trail. | 5503   // Return true if the receiver is contained in the trail. | 
| 5491   // Otherwise, if the trail is null, allocate a trail, then add the receiver to | 5504   // Otherwise, if the trail is null, allocate a trail, then add the receiver to | 
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5663       const TypeArguments& instantiator_type_arguments, | 5676       const TypeArguments& instantiator_type_arguments, | 
| 5664       Error* bound_error, | 5677       Error* bound_error, | 
| 5665       TrailPtr instantiation_trail, | 5678       TrailPtr instantiation_trail, | 
| 5666       TrailPtr bound_trail, | 5679       TrailPtr bound_trail, | 
| 5667       Heap::Space space) const; | 5680       Heap::Space space) const; | 
| 5668   virtual RawAbstractType* CloneUnfinalized() const; | 5681   virtual RawAbstractType* CloneUnfinalized() const; | 
| 5669   virtual RawAbstractType* CloneUninstantiated( | 5682   virtual RawAbstractType* CloneUninstantiated( | 
| 5670       const Class& new_owner, | 5683       const Class& new_owner, | 
| 5671       TrailPtr trail = NULL) const; | 5684       TrailPtr trail = NULL) const; | 
| 5672   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; | 5685   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; | 
|  | 5686 #if defined(DEBUG) | 
|  | 5687   // Check if type is canonical. | 
|  | 5688   virtual bool CheckIsCanonical(Thread* thread) const; | 
|  | 5689 #endif  // DEBUG | 
| 5673   virtual RawString* EnumerateURIs() const; | 5690   virtual RawString* EnumerateURIs() const; | 
| 5674 | 5691 | 
| 5675   virtual intptr_t Hash() const; | 5692   virtual intptr_t Hash() const; | 
| 5676 | 5693 | 
| 5677   static intptr_t InstanceSize() { | 5694   static intptr_t InstanceSize() { | 
| 5678     return RoundedAllocationSize(sizeof(RawType)); | 5695     return RoundedAllocationSize(sizeof(RawType)); | 
| 5679   } | 5696   } | 
| 5680 | 5697 | 
| 5681   // The type of the literal 'null'. | 5698   // The type of the literal 'null'. | 
| 5682   static RawType* NullType(); | 5699   static RawType* NullType(); | 
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5791   virtual RawTypeRef* InstantiateFrom( | 5808   virtual RawTypeRef* InstantiateFrom( | 
| 5792       const TypeArguments& instantiator_type_arguments, | 5809       const TypeArguments& instantiator_type_arguments, | 
| 5793       Error* bound_error, | 5810       Error* bound_error, | 
| 5794       TrailPtr instantiation_trail, | 5811       TrailPtr instantiation_trail, | 
| 5795       TrailPtr bound_trail, | 5812       TrailPtr bound_trail, | 
| 5796       Heap::Space space) const; | 5813       Heap::Space space) const; | 
| 5797   virtual RawTypeRef* CloneUninstantiated( | 5814   virtual RawTypeRef* CloneUninstantiated( | 
| 5798       const Class& new_owner, | 5815       const Class& new_owner, | 
| 5799       TrailPtr trail = NULL) const; | 5816       TrailPtr trail = NULL) const; | 
| 5800   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; | 5817   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; | 
|  | 5818 #if defined(DEBUG) | 
|  | 5819   // Check if typeref is canonical. | 
|  | 5820   virtual bool CheckIsCanonical(Thread* thread) const; | 
|  | 5821 #endif  // DEBUG | 
| 5801   virtual RawString* EnumerateURIs() const; | 5822   virtual RawString* EnumerateURIs() const; | 
| 5802 | 5823 | 
| 5803   virtual intptr_t Hash() const; | 5824   virtual intptr_t Hash() const; | 
| 5804 | 5825 | 
| 5805   static intptr_t InstanceSize() { | 5826   static intptr_t InstanceSize() { | 
| 5806     return RoundedAllocationSize(sizeof(RawTypeRef)); | 5827     return RoundedAllocationSize(sizeof(RawTypeRef)); | 
| 5807   } | 5828   } | 
| 5808 | 5829 | 
| 5809   static RawTypeRef* New(const AbstractType& type); | 5830   static RawTypeRef* New(const AbstractType& type); | 
| 5810 | 5831 | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5866       Error* bound_error, | 5887       Error* bound_error, | 
| 5867       TrailPtr instantiation_trail, | 5888       TrailPtr instantiation_trail, | 
| 5868       TrailPtr bound_trail, | 5889       TrailPtr bound_trail, | 
| 5869       Heap::Space space) const; | 5890       Heap::Space space) const; | 
| 5870   virtual RawAbstractType* CloneUnfinalized() const; | 5891   virtual RawAbstractType* CloneUnfinalized() const; | 
| 5871   virtual RawAbstractType* CloneUninstantiated( | 5892   virtual RawAbstractType* CloneUninstantiated( | 
| 5872       const Class& new_owner, TrailPtr trail = NULL) const; | 5893       const Class& new_owner, TrailPtr trail = NULL) const; | 
| 5873   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const { | 5894   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const { | 
| 5874     return raw(); | 5895     return raw(); | 
| 5875   } | 5896   } | 
|  | 5897 #if defined(DEBUG) | 
|  | 5898   // Check if type parameter is canonical. | 
|  | 5899   virtual bool CheckIsCanonical(Thread* thread) const { | 
|  | 5900     return true; | 
|  | 5901   } | 
|  | 5902 #endif  // DEBUG | 
| 5876   virtual RawString* EnumerateURIs() const; | 5903   virtual RawString* EnumerateURIs() const; | 
| 5877 | 5904 | 
| 5878   virtual intptr_t Hash() const; | 5905   virtual intptr_t Hash() const; | 
| 5879 | 5906 | 
| 5880   static intptr_t InstanceSize() { | 5907   static intptr_t InstanceSize() { | 
| 5881     return RoundedAllocationSize(sizeof(RawTypeParameter)); | 5908     return RoundedAllocationSize(sizeof(RawTypeParameter)); | 
| 5882   } | 5909   } | 
| 5883 | 5910 | 
| 5884   static RawTypeParameter* New(const Class& parameterized_class, | 5911   static RawTypeParameter* New(const Class& parameterized_class, | 
| 5885                                intptr_t index, | 5912                                intptr_t index, | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5956       Error* bound_error, | 5983       Error* bound_error, | 
| 5957       TrailPtr instantiation_trail, | 5984       TrailPtr instantiation_trail, | 
| 5958       TrailPtr bound_trail, | 5985       TrailPtr bound_trail, | 
| 5959       Heap::Space space) const; | 5986       Heap::Space space) const; | 
| 5960   virtual RawAbstractType* CloneUnfinalized() const; | 5987   virtual RawAbstractType* CloneUnfinalized() const; | 
| 5961   virtual RawAbstractType* CloneUninstantiated( | 5988   virtual RawAbstractType* CloneUninstantiated( | 
| 5962       const Class& new_owner, TrailPtr trail = NULL) const; | 5989       const Class& new_owner, TrailPtr trail = NULL) const; | 
| 5963   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const { | 5990   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const { | 
| 5964     return raw(); | 5991     return raw(); | 
| 5965   } | 5992   } | 
|  | 5993 #if defined(DEBUG) | 
|  | 5994   // Check if bounded type is canonical. | 
|  | 5995   virtual bool CheckIsCanonical(Thread* thread) const { | 
|  | 5996     return true; | 
|  | 5997   } | 
|  | 5998 #endif  // DEBUG | 
| 5966   virtual RawString* EnumerateURIs() const; | 5999   virtual RawString* EnumerateURIs() const; | 
| 5967 | 6000 | 
| 5968   virtual intptr_t Hash() const; | 6001   virtual intptr_t Hash() const; | 
| 5969 | 6002 | 
| 5970   static intptr_t InstanceSize() { | 6003   static intptr_t InstanceSize() { | 
| 5971     return RoundedAllocationSize(sizeof(RawBoundedType)); | 6004     return RoundedAllocationSize(sizeof(RawBoundedType)); | 
| 5972   } | 6005   } | 
| 5973 | 6006 | 
| 5974   static RawBoundedType* New(const AbstractType& type, | 6007   static RawBoundedType* New(const AbstractType& type, | 
| 5975                              const AbstractType& bound, | 6008                              const AbstractType& bound, | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6044 | 6077 | 
| 6045 class Number : public Instance { | 6078 class Number : public Instance { | 
| 6046  public: | 6079  public: | 
| 6047   // TODO(iposva): Add more useful Number methods. | 6080   // TODO(iposva): Add more useful Number methods. | 
| 6048   RawString* ToString(Heap::Space space) const; | 6081   RawString* ToString(Heap::Space space) const; | 
| 6049 | 6082 | 
| 6050   // Numbers are canonicalized differently from other instances/strings. | 6083   // Numbers are canonicalized differently from other instances/strings. | 
| 6051   virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 6084   virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 
| 6052                                             const char** error_str) const; | 6085                                             const char** error_str) const; | 
| 6053 | 6086 | 
|  | 6087 #if defined(DEBUG) | 
|  | 6088   // Check if number is canonical. | 
|  | 6089   virtual bool CheckIsCanonical(Thread* thread) const; | 
|  | 6090 #endif  // DEBUG | 
|  | 6091 | 
| 6054  private: | 6092  private: | 
| 6055   OBJECT_IMPLEMENTATION(Number, Instance); | 6093   OBJECT_IMPLEMENTATION(Number, Instance); | 
| 6056 | 6094 | 
| 6057   friend class Class; | 6095   friend class Class; | 
| 6058 }; | 6096 }; | 
| 6059 | 6097 | 
| 6060 | 6098 | 
| 6061 class Integer : public Number { | 6099 class Integer : public Number { | 
| 6062  public: | 6100  public: | 
| 6063   static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); | 6101   static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); | 
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6520   virtual bool Equals(const Instance& other) const; | 6558   virtual bool Equals(const Instance& other) const; | 
| 6521 | 6559 | 
| 6522   intptr_t CompareTo(const String& other) const; | 6560   intptr_t CompareTo(const String& other) const; | 
| 6523 | 6561 | 
| 6524   bool StartsWith(const String& other) const; | 6562   bool StartsWith(const String& other) const; | 
| 6525 | 6563 | 
| 6526   // Strings are canonicalized using the symbol table. | 6564   // Strings are canonicalized using the symbol table. | 
| 6527   virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 6565   virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 
| 6528                                             const char** error_str) const; | 6566                                             const char** error_str) const; | 
| 6529 | 6567 | 
|  | 6568 #if defined(DEBUG) | 
|  | 6569   // Check if string is canonical. | 
|  | 6570   virtual bool CheckIsCanonical(Thread* thread) const; | 
|  | 6571 #endif  // DEBUG | 
|  | 6572 | 
| 6530   bool IsSymbol() const { return raw()->IsCanonical(); } | 6573   bool IsSymbol() const { return raw()->IsCanonical(); } | 
| 6531 | 6574 | 
| 6532   bool IsOneByteString() const { | 6575   bool IsOneByteString() const { | 
| 6533     return raw()->GetClassId() == kOneByteStringCid; | 6576     return raw()->GetClassId() == kOneByteStringCid; | 
| 6534   } | 6577   } | 
| 6535 | 6578 | 
| 6536   bool IsTwoByteString() const { | 6579   bool IsTwoByteString() const { | 
| 6537     return raw()->GetClassId() == kTwoByteStringCid; | 6580     return raw()->GetClassId() == kTwoByteStringCid; | 
| 6538   } | 6581   } | 
| 6539 | 6582 | 
| (...skipping 2118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8658 | 8701 | 
| 8659 inline void TypeArguments::SetHash(intptr_t value) const { | 8702 inline void TypeArguments::SetHash(intptr_t value) const { | 
| 8660   // This is only safe because we create a new Smi, which does not cause | 8703   // This is only safe because we create a new Smi, which does not cause | 
| 8661   // heap allocation. | 8704   // heap allocation. | 
| 8662   StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8705   StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 
| 8663 } | 8706 } | 
| 8664 | 8707 | 
| 8665 }  // namespace dart | 8708 }  // namespace dart | 
| 8666 | 8709 | 
| 8667 #endif  // VM_OBJECT_H_ | 8710 #endif  // VM_OBJECT_H_ | 
| OLD | NEW | 
|---|