| 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" | 
| 11 #include "vm/json_stream.h" | 11 #include "vm/json_stream.h" | 
| 12 #include "vm/bitmap.h" | 12 #include "vm/bitmap.h" | 
| 13 #include "vm/dart.h" | 13 #include "vm/dart.h" | 
|  | 14 #include "vm/flags.h" | 
| 14 #include "vm/globals.h" | 15 #include "vm/globals.h" | 
| 15 #include "vm/growable_array.h" | 16 #include "vm/growable_array.h" | 
| 16 #include "vm/handles.h" | 17 #include "vm/handles.h" | 
| 17 #include "vm/heap.h" | 18 #include "vm/heap.h" | 
| 18 #include "vm/isolate.h" | 19 #include "vm/isolate.h" | 
| 19 #include "vm/method_recognizer.h" | 20 #include "vm/method_recognizer.h" | 
| 20 #include "vm/os.h" | 21 #include "vm/os.h" | 
| 21 #include "vm/raw_object.h" | 22 #include "vm/raw_object.h" | 
| 22 #include "vm/report.h" | 23 #include "vm/report.h" | 
| 23 #include "vm/scanner.h" | 24 #include "vm/scanner.h" | 
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 130     return reinterpret_cast<const object&>(obj);                               \ | 131     return reinterpret_cast<const object&>(obj);                               \ | 
| 131   }                                                                            \ | 132   }                                                                            \ | 
| 132   static Raw##object* RawCast(RawObject* raw) {                                \ | 133   static Raw##object* RawCast(RawObject* raw) {                                \ | 
| 133     ASSERT(Object::Handle(raw).Is##object());                                  \ | 134     ASSERT(Object::Handle(raw).Is##object());                                  \ | 
| 134     return reinterpret_cast<Raw##object*>(raw);                                \ | 135     return reinterpret_cast<Raw##object*>(raw);                                \ | 
| 135   }                                                                            \ | 136   }                                                                            \ | 
| 136   static Raw##object* null() {                                                 \ | 137   static Raw##object* null() {                                                 \ | 
| 137     return reinterpret_cast<Raw##object*>(Object::null());                     \ | 138     return reinterpret_cast<Raw##object*>(Object::null());                     \ | 
| 138   }                                                                            \ | 139   }                                                                            \ | 
| 139   virtual const char* ToCString() const;                                       \ | 140   virtual const char* ToCString() const;                                       \ | 
| 140   /* Object is printed as JSON into stream. If ref is true only a header */    \ |  | 
| 141   /* with an object id is printed. If ref is false the object is fully   */    \ |  | 
| 142   /* printed.                                                            */    \ |  | 
| 143   virtual const char* JSONType() const {                                       \ |  | 
| 144     return ""#object;                                                          \ |  | 
| 145   }                                                                            \ |  | 
| 146   static const ClassId kClassId = k##object##Cid;                              \ | 141   static const ClassId kClassId = k##object##Cid;                              \ | 
| 147  protected:  /* NOLINT */                                                      \ |  | 
| 148   virtual void PrintJSONImpl(JSONStream* stream, bool ref) const;              \ |  | 
| 149  private:  /* NOLINT */                                                        \ | 142  private:  /* NOLINT */                                                        \ | 
| 150   /* Initialize the handle based on the raw_ptr in the presence of null. */    \ | 143   /* Initialize the handle based on the raw_ptr in the presence of null. */    \ | 
| 151   static void initializeHandle(object* obj, RawObject* raw_ptr) {              \ | 144   static void initializeHandle(object* obj, RawObject* raw_ptr) {              \ | 
| 152     if (raw_ptr != Object::null()) {                                           \ | 145     if (raw_ptr != Object::null()) {                                           \ | 
| 153       obj->SetRaw(raw_ptr);                                                    \ | 146       obj->SetRaw(raw_ptr);                                                    \ | 
| 154     } else {                                                                   \ | 147     } else {                                                                   \ | 
| 155       obj->raw_ = Object::null();                                              \ | 148       obj->raw_ = Object::null();                                              \ | 
| 156       object fake_object;                                                      \ | 149       object fake_object;                                                      \ | 
| 157       obj->set_vtable(fake_object.vtable());                                   \ | 150       obj->set_vtable(fake_object.vtable());                                   \ | 
| 158     }                                                                          \ | 151     }                                                                          \ | 
| 159   }                                                                            \ | 152   }                                                                            \ | 
| 160   /* Disallow allocation, copy constructors and override super assignment. */  \ | 153   /* Disallow allocation, copy constructors and override super assignment. */  \ | 
| 161  public:  /* NOLINT */                                                         \ | 154  public:  /* NOLINT */                                                         \ | 
| 162   void operator delete(void* pointer) {                                        \ | 155   void operator delete(void* pointer) {                                        \ | 
| 163     UNREACHABLE();                                                             \ | 156     UNREACHABLE();                                                             \ | 
| 164   }                                                                            \ | 157   }                                                                            \ | 
| 165  private:  /* NOLINT */                                                        \ | 158  private:  /* NOLINT */                                                        \ | 
| 166   void* operator new(size_t size);                                             \ | 159   void* operator new(size_t size);                                             \ | 
| 167   object(const object& value);                                                 \ | 160   object(const object& value);                                                 \ | 
| 168   void operator=(Raw##super* value);                                           \ | 161   void operator=(Raw##super* value);                                           \ | 
| 169   void operator=(const object& value);                                         \ | 162   void operator=(const object& value);                                         \ | 
| 170   void operator=(const super& value);                                          \ | 163   void operator=(const super& value);                                          \ | 
| 171 | 164 | 
|  | 165 // Conditionally include object_service.cc functionality in the vtable to avoid | 
|  | 166 // link errors like the following: | 
|  | 167 // | 
|  | 168 // object.o:(.rodata._ZTVN4....E[_ZTVN4...E]+0x278): | 
|  | 169 // undefined reference to | 
|  | 170 // `dart::Instance::PrintSharedInstanceJSON(dart::JSONObject*, bool) const'. | 
|  | 171 // | 
|  | 172 #ifndef PRODUCT | 
|  | 173 #define OBJECT_SERVICE_SUPPORT(object)                                         \ | 
|  | 174    protected:  /* NOLINT */                                                    \ | 
|  | 175   /* Object is printed as JSON into stream. If ref is true only a header */    \ | 
|  | 176   /* with an object id is printed. If ref is false the object is fully   */    \ | 
|  | 177   /* printed.                                                            */    \ | 
|  | 178     virtual void PrintJSONImpl(JSONStream* stream, bool ref) const;            \ | 
|  | 179     virtual const char* JSONType() const {                                     \ | 
|  | 180       return ""#object;                                                        \ | 
|  | 181     } | 
|  | 182 #else | 
|  | 183 #define OBJECT_SERVICE_SUPPORT(object)                                         \ | 
|  | 184    protected:  /* NOLINT */ | 
|  | 185 #endif  // !PRODUCT | 
|  | 186 | 
| 172 #define SNAPSHOT_READER_SUPPORT(object)                                        \ | 187 #define SNAPSHOT_READER_SUPPORT(object)                                        \ | 
| 173   static Raw##object* ReadFrom(SnapshotReader* reader,                         \ | 188   static Raw##object* ReadFrom(SnapshotReader* reader,                         \ | 
| 174                                intptr_t object_id,                             \ | 189                                intptr_t object_id,                             \ | 
| 175                                intptr_t tags,                                  \ | 190                                intptr_t tags,                                  \ | 
| 176                                Snapshot::Kind,                                 \ | 191                                Snapshot::Kind,                                 \ | 
| 177                                bool as_reference);                             \ | 192                                bool as_reference);                             \ | 
| 178   friend class SnapshotReader;                                                 \ | 193   friend class SnapshotReader;                                                 \ | 
| 179 | 194 | 
| 180 #define OBJECT_IMPLEMENTATION(object, super)                                   \ | 195 #define OBJECT_IMPLEMENTATION(object, super)                                   \ | 
| 181  public:  /* NOLINT */                                                         \ | 196  public:  /* NOLINT */                                                         \ | 
| 182   void operator=(Raw##object* value) {                                         \ | 197   void operator=(Raw##object* value) {                                         \ | 
| 183     initializeHandle(this, value);                                             \ | 198     initializeHandle(this, value);                                             \ | 
| 184   }                                                                            \ | 199   }                                                                            \ | 
| 185   void operator^=(RawObject* value) {                                          \ | 200   void operator^=(RawObject* value) {                                          \ | 
| 186     initializeHandle(this, value);                                             \ | 201     initializeHandle(this, value);                                             \ | 
| 187     ASSERT(IsNull() || Is##object());                                          \ | 202     ASSERT(IsNull() || Is##object());                                          \ | 
| 188   }                                                                            \ | 203   }                                                                            \ | 
| 189  protected:  /* NOLINT */                                                      \ | 204  protected:  /* NOLINT */                                                      \ | 
| 190   object() : super() {}                                                        \ | 205   object() : super() {}                                                        \ | 
| 191   BASE_OBJECT_IMPLEMENTATION(object, super)                                    \ | 206   BASE_OBJECT_IMPLEMENTATION(object, super)                                    \ | 
|  | 207   OBJECT_SERVICE_SUPPORT(object) | 
| 192 | 208 | 
| 193 #define HEAP_OBJECT_IMPLEMENTATION(object, super)                              \ | 209 #define HEAP_OBJECT_IMPLEMENTATION(object, super)                              \ | 
| 194   OBJECT_IMPLEMENTATION(object, super);                                        \ | 210   OBJECT_IMPLEMENTATION(object, super);                                        \ | 
| 195   const Raw##object* raw_ptr() const {                                         \ | 211   const Raw##object* raw_ptr() const {                                         \ | 
| 196     ASSERT(raw() != null());                                                   \ | 212     ASSERT(raw() != null());                                                   \ | 
| 197     return raw()->ptr();                                                       \ | 213     return raw()->ptr();                                                       \ | 
| 198   }                                                                            \ | 214   }                                                                            \ | 
| 199   SNAPSHOT_READER_SUPPORT(object)                                              \ | 215   SNAPSHOT_READER_SUPPORT(object)                                              \ | 
| 200   friend class StackFrame;                                                     \ | 216   friend class StackFrame;                                                     \ | 
| 201   friend class Thread;                                                         \ | 217   friend class Thread;                                                         \ | 
| 202 | 218 | 
| 203 // This macro is used to denote types that do not have a sub-type. | 219 // This macro is used to denote types that do not have a sub-type. | 
| 204 #define FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super)        \ | 220 #define FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super)        \ | 
| 205  public:  /* NOLINT */                                                         \ | 221  public:  /* NOLINT */                                                         \ | 
| 206   void operator=(Raw##object* value) {                                         \ | 222   void operator=(Raw##object* value) {                                         \ | 
| 207     raw_ = value;                                                              \ | 223     raw_ = value;                                                              \ | 
| 208     CHECK_HANDLE();                                                            \ | 224     CHECK_HANDLE();                                                            \ | 
| 209   }                                                                            \ | 225   }                                                                            \ | 
| 210   void operator^=(RawObject* value) {                                          \ | 226   void operator^=(RawObject* value) {                                          \ | 
| 211     raw_ = value;                                                              \ | 227     raw_ = value;                                                              \ | 
| 212     CHECK_HANDLE();                                                            \ | 228     CHECK_HANDLE();                                                            \ | 
| 213   }                                                                            \ | 229   }                                                                            \ | 
| 214  private:  /* NOLINT */                                                        \ | 230  private:  /* NOLINT */                                                        \ | 
| 215   object() : super() {}                                                        \ | 231   object() : super() {}                                                        \ | 
| 216   BASE_OBJECT_IMPLEMENTATION(object, super)                                    \ | 232   BASE_OBJECT_IMPLEMENTATION(object, super)                                    \ | 
|  | 233   OBJECT_SERVICE_SUPPORT(object)                                               \ | 
| 217   const Raw##object* raw_ptr() const {                                         \ | 234   const Raw##object* raw_ptr() const {                                         \ | 
| 218     ASSERT(raw() != null());                                                   \ | 235     ASSERT(raw() != null());                                                   \ | 
| 219     return raw()->ptr();                                                       \ | 236     return raw()->ptr();                                                       \ | 
| 220   }                                                                            \ | 237   }                                                                            \ | 
| 221   static intptr_t NextFieldOffset() {                                          \ | 238   static intptr_t NextFieldOffset() {                                          \ | 
| 222     return -kWordSize;                                                         \ | 239     return -kWordSize;                                                         \ | 
| 223   }                                                                            \ | 240   }                                                                            \ | 
| 224   SNAPSHOT_READER_SUPPORT(rettype)                                             \ | 241   SNAPSHOT_READER_SUPPORT(rettype)                                             \ | 
| 225   friend class StackFrame;                                                     \ | 242   friend class StackFrame;                                                     \ | 
| 226   friend class Thread;                                                         \ | 243   friend class Thread;                                                         \ | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 273 | 290 | 
| 274   // Matches Object.toString on instances (except String::ToCString, bug 20583). | 291   // Matches Object.toString on instances (except String::ToCString, bug 20583). | 
| 275   virtual const char* ToCString() const { | 292   virtual const char* ToCString() const { | 
| 276     if (IsNull()) { | 293     if (IsNull()) { | 
| 277       return "null"; | 294       return "null"; | 
| 278     } else { | 295     } else { | 
| 279       return "Object"; | 296       return "Object"; | 
| 280     } | 297     } | 
| 281   } | 298   } | 
| 282 | 299 | 
|  | 300 #ifndef PRODUCT | 
| 283   void PrintJSON(JSONStream* stream, bool ref = true) const; | 301   void PrintJSON(JSONStream* stream, bool ref = true) const; | 
| 284 | 302   virtual void PrintJSONImpl(JSONStream* stream, bool ref) const; | 
| 285   virtual const char* JSONType() const { | 303   virtual const char* JSONType() const { | 
| 286     return IsNull() ? "null" : "Object"; | 304     return IsNull() ? "null" : "Object"; | 
| 287   } | 305   } | 
|  | 306 #endif | 
| 288 | 307 | 
| 289   // Returns the name that is used to identify an object in the | 308   // Returns the name that is used to identify an object in the | 
| 290   // namespace dictionary. | 309   // namespace dictionary. | 
| 291   // Object::DictionaryName() returns String::null(). Only subclasses | 310   // Object::DictionaryName() returns String::null(). Only subclasses | 
| 292   // of Object that need to be entered in the library and library prefix | 311   // of Object that need to be entered in the library and library prefix | 
| 293   // namespaces need to provide an implementation. | 312   // namespaces need to provide an implementation. | 
| 294   virtual RawString* DictionaryName() const; | 313   virtual RawString* DictionaryName() const; | 
| 295 | 314 | 
| 296   bool IsNew() const { return raw()->IsNewObject(); } | 315   bool IsNew() const { return raw()->IsNewObject(); } | 
| 297   bool IsOld() const { return raw()->IsOldObject(); } | 316   bool IsOld() const { return raw()->IsOldObject(); } | 
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 701 | 720 | 
| 702   // End of field mutator guards. | 721   // End of field mutator guards. | 
| 703 | 722 | 
| 704   RawObject* raw_;  // The raw object reference. | 723   RawObject* raw_;  // The raw object reference. | 
| 705 | 724 | 
| 706  protected: | 725  protected: | 
| 707   void AddCommonObjectProperties(JSONObject* jsobj, | 726   void AddCommonObjectProperties(JSONObject* jsobj, | 
| 708                                  const char* protocol_type, | 727                                  const char* protocol_type, | 
| 709                                  bool ref) const; | 728                                  bool ref) const; | 
| 710 | 729 | 
| 711   virtual void PrintJSONImpl(JSONStream* stream, bool ref) const; |  | 
| 712 |  | 
| 713  private: | 730  private: | 
| 714   static intptr_t NextFieldOffset() { | 731   static intptr_t NextFieldOffset() { | 
| 715     // Indicates this class cannot be extended by dart code. | 732     // Indicates this class cannot be extended by dart code. | 
| 716     return -kWordSize; | 733     return -kWordSize; | 
| 717   } | 734   } | 
| 718 | 735 | 
| 719   static void InitializeObject(uword address, | 736   static void InitializeObject(uword address, | 
| 720                                intptr_t id, | 737                                intptr_t id, | 
| 721                                intptr_t size, | 738                                intptr_t size, | 
| 722                                bool is_vm_object); | 739                                bool is_vm_object); | 
| (...skipping 4378 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5101     return RoundedAllocationSize(sizeof(RawInstance)); | 5118     return RoundedAllocationSize(sizeof(RawInstance)); | 
| 5102   } | 5119   } | 
| 5103 | 5120 | 
| 5104   static RawInstance* New(const Class& cls, Heap::Space space = Heap::kNew); | 5121   static RawInstance* New(const Class& cls, Heap::Space space = Heap::kNew); | 
| 5105 | 5122 | 
| 5106   // Array/list element address computations. | 5123   // Array/list element address computations. | 
| 5107   static intptr_t DataOffsetFor(intptr_t cid); | 5124   static intptr_t DataOffsetFor(intptr_t cid); | 
| 5108   static intptr_t ElementSizeFor(intptr_t cid); | 5125   static intptr_t ElementSizeFor(intptr_t cid); | 
| 5109 | 5126 | 
| 5110  protected: | 5127  protected: | 
|  | 5128 #ifndef PRODUCT | 
| 5111   virtual void PrintSharedInstanceJSON(JSONObject* jsobj, bool ref) const; | 5129   virtual void PrintSharedInstanceJSON(JSONObject* jsobj, bool ref) const; | 
|  | 5130 #endif | 
| 5112 | 5131 | 
| 5113  private: | 5132  private: | 
| 5114   RawObject** FieldAddrAtOffset(intptr_t offset) const { | 5133   RawObject** FieldAddrAtOffset(intptr_t offset) const { | 
| 5115     ASSERT(IsValidFieldOffset(offset)); | 5134     ASSERT(IsValidFieldOffset(offset)); | 
| 5116     return reinterpret_cast<RawObject**>(raw_value() - kHeapObjectTag + offset); | 5135     return reinterpret_cast<RawObject**>(raw_value() - kHeapObjectTag + offset); | 
| 5117   } | 5136   } | 
| 5118   RawObject** FieldAddr(const Field& field) const { | 5137   RawObject** FieldAddr(const Field& field) const { | 
| 5119     return FieldAddrAtOffset(field.Offset()); | 5138     return FieldAddrAtOffset(field.Offset()); | 
| 5120   } | 5139   } | 
| 5121   RawObject** NativeFieldsAddr() const { | 5140   RawObject** NativeFieldsAddr() const { | 
| (...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5888 }; | 5907 }; | 
| 5889 | 5908 | 
| 5890 | 5909 | 
| 5891 class Number : public Instance { | 5910 class Number : public Instance { | 
| 5892  public: | 5911  public: | 
| 5893   // TODO(iposva): Add more useful Number methods. | 5912   // TODO(iposva): Add more useful Number methods. | 
| 5894   RawString* ToString(Heap::Space space) const; | 5913   RawString* ToString(Heap::Space space) const; | 
| 5895 | 5914 | 
| 5896  private: | 5915  private: | 
| 5897   OBJECT_IMPLEMENTATION(Number, Instance); | 5916   OBJECT_IMPLEMENTATION(Number, Instance); | 
|  | 5917 | 
| 5898   friend class Class; | 5918   friend class Class; | 
| 5899 }; | 5919 }; | 
| 5900 | 5920 | 
| 5901 | 5921 | 
| 5902 class Integer : public Number { | 5922 class Integer : public Number { | 
| 5903  public: | 5923  public: | 
| 5904   static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); | 5924   static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); | 
| 5905   static RawInteger* NewFromUint64(uint64_t value, | 5925   static RawInteger* NewFromUint64(uint64_t value, | 
| 5906                                    Heap::Space space = Heap::kNew); | 5926                                    Heap::Space space = Heap::kNew); | 
| 5907 | 5927 | 
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6029   static intptr_t ValueFromRaw(uword raw_value) { | 6049   static intptr_t ValueFromRaw(uword raw_value) { | 
| 6030     intptr_t value = raw_value; | 6050     intptr_t value = raw_value; | 
| 6031     ASSERT((value & kSmiTagMask) == kSmiTag); | 6051     ASSERT((value & kSmiTagMask) == kSmiTag); | 
| 6032     return (value >> kSmiTagShift); | 6052     return (value >> kSmiTagShift); | 
| 6033   } | 6053   } | 
| 6034 | 6054 | 
| 6035   static cpp_vtable handle_vtable_; | 6055   static cpp_vtable handle_vtable_; | 
| 6036 | 6056 | 
| 6037   Smi() : Integer() {} | 6057   Smi() : Integer() {} | 
| 6038   BASE_OBJECT_IMPLEMENTATION(Smi, Integer); | 6058   BASE_OBJECT_IMPLEMENTATION(Smi, Integer); | 
| 6039 | 6059   OBJECT_SERVICE_SUPPORT(Smi); | 
| 6040   friend class Api;  // For ValueFromRaw | 6060   friend class Api;  // For ValueFromRaw | 
| 6041   friend class Class; | 6061   friend class Class; | 
| 6042   friend class Object; | 6062   friend class Object; | 
| 6043 }; | 6063 }; | 
| 6044 | 6064 | 
| 6045 | 6065 | 
| 6046 class Mint : public Integer { | 6066 class Mint : public Integer { | 
| 6047  public: | 6067  public: | 
| 6048   static const intptr_t kBits = 63;  // 64-th bit is sign. | 6068   static const intptr_t kBits = 63;  // 64-th bit is sign. | 
| 6049   static const int64_t kMaxValue = | 6069   static const int64_t kMaxValue = | 
| (...skipping 2349 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8399 | 8419 | 
| 8400 | 8420 | 
| 8401 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 8421 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 
| 8402                                                intptr_t index) { | 8422                                                intptr_t index) { | 
| 8403   return array.At((index * kEntryLength) + kTargetFunctionIndex); | 8423   return array.At((index * kEntryLength) + kTargetFunctionIndex); | 
| 8404 } | 8424 } | 
| 8405 | 8425 | 
| 8406 }  // namespace dart | 8426 }  // namespace dart | 
| 8407 | 8427 | 
| 8408 #endif  // VM_OBJECT_H_ | 8428 #endif  // VM_OBJECT_H_ | 
| OLD | NEW | 
|---|