| 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 RUNTIME_VM_RAW_OBJECT_H_ | 5 #ifndef RUNTIME_VM_RAW_OBJECT_H_ | 
| 6 #define RUNTIME_VM_RAW_OBJECT_H_ | 6 #define RUNTIME_VM_RAW_OBJECT_H_ | 
| 7 | 7 | 
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" | 
| 9 #include "vm/atomic.h" | 9 #include "vm/atomic.h" | 
| 10 #include "vm/globals.h" | 10 #include "vm/globals.h" | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 38   V(LocalVarDescriptors)                                                       \ | 38   V(LocalVarDescriptors)                                                       \ | 
| 39   V(ExceptionHandlers)                                                         \ | 39   V(ExceptionHandlers)                                                         \ | 
| 40   V(Context)                                                                   \ | 40   V(Context)                                                                   \ | 
| 41   V(ContextScope)                                                              \ | 41   V(ContextScope)                                                              \ | 
| 42   V(SingleTargetCache)                                                         \ | 42   V(SingleTargetCache)                                                         \ | 
| 43   V(UnlinkedCall)                                                              \ | 43   V(UnlinkedCall)                                                              \ | 
| 44   V(ICData)                                                                    \ | 44   V(ICData)                                                                    \ | 
| 45   V(MegamorphicCache)                                                          \ | 45   V(MegamorphicCache)                                                          \ | 
| 46   V(SubtypeTestCache)                                                          \ | 46   V(SubtypeTestCache)                                                          \ | 
| 47   V(Error)                                                                     \ | 47   V(Error)                                                                     \ | 
| 48     V(ApiError)                                                                \ | 48   V(ApiError)                                                                  \ | 
| 49     V(LanguageError)                                                           \ | 49   V(LanguageError)                                                             \ | 
| 50     V(UnhandledException)                                                      \ | 50   V(UnhandledException)                                                        \ | 
| 51     V(UnwindError)                                                             \ | 51   V(UnwindError)                                                               \ | 
| 52   V(Instance)                                                                  \ | 52   V(Instance)                                                                  \ | 
| 53     V(LibraryPrefix)                                                           \ | 53   V(LibraryPrefix)                                                             \ | 
| 54     V(AbstractType)                                                            \ | 54   V(AbstractType)                                                              \ | 
| 55       V(Type)                                                                  \ | 55   V(Type)                                                                      \ | 
| 56       V(TypeRef)                                                               \ | 56   V(TypeRef)                                                                   \ | 
| 57       V(TypeParameter)                                                         \ | 57   V(TypeParameter)                                                             \ | 
| 58       V(BoundedType)                                                           \ | 58   V(BoundedType)                                                               \ | 
| 59       V(MixinAppType)                                                          \ | 59   V(MixinAppType)                                                              \ | 
| 60     V(Closure)                                                                 \ | 60   V(Closure)                                                                   \ | 
| 61     V(Number)                                                                  \ | 61   V(Number)                                                                    \ | 
| 62       V(Integer)                                                               \ | 62   V(Integer)                                                                   \ | 
| 63         V(Smi)                                                                 \ | 63   V(Smi)                                                                       \ | 
| 64         V(Mint)                                                                \ | 64   V(Mint)                                                                      \ | 
| 65         V(Bigint)                                                              \ | 65   V(Bigint)                                                                    \ | 
| 66       V(Double)                                                                \ | 66   V(Double)                                                                    \ | 
| 67     V(Bool)                                                                    \ | 67   V(Bool)                                                                      \ | 
| 68     V(GrowableObjectArray)                                                     \ | 68   V(GrowableObjectArray)                                                       \ | 
| 69     V(Float32x4)                                                               \ | 69   V(Float32x4)                                                                 \ | 
| 70     V(Int32x4)                                                                 \ | 70   V(Int32x4)                                                                   \ | 
| 71     V(Float64x2)                                                               \ | 71   V(Float64x2)                                                                 \ | 
| 72     V(TypedData)                                                               \ | 72   V(TypedData)                                                                 \ | 
| 73     V(ExternalTypedData)                                                       \ | 73   V(ExternalTypedData)                                                         \ | 
| 74     V(Capability)                                                              \ | 74   V(Capability)                                                                \ | 
| 75     V(ReceivePort)                                                             \ | 75   V(ReceivePort)                                                               \ | 
| 76     V(SendPort)                                                                \ | 76   V(SendPort)                                                                  \ | 
| 77     V(Stacktrace)                                                              \ | 77   V(Stacktrace)                                                                \ | 
| 78     V(RegExp)                                                                  \ | 78   V(RegExp)                                                                    \ | 
| 79     V(WeakProperty)                                                            \ | 79   V(WeakProperty)                                                              \ | 
| 80     V(MirrorReference)                                                         \ | 80   V(MirrorReference)                                                           \ | 
| 81     V(LinkedHashMap)                                                           \ | 81   V(LinkedHashMap)                                                             \ | 
| 82     V(UserTag)                                                                 \ | 82   V(UserTag) | 
| 83 | 83 | 
| 84 #define CLASS_LIST_ARRAYS(V)                                                   \ | 84 #define CLASS_LIST_ARRAYS(V)                                                   \ | 
| 85   V(Array)                                                                     \ | 85   V(Array)                                                                     \ | 
| 86     V(ImmutableArray)                                                          \ | 86   V(ImmutableArray) | 
| 87 | 87 | 
| 88 #define CLASS_LIST_STRINGS(V)                                                  \ | 88 #define CLASS_LIST_STRINGS(V)                                                  \ | 
| 89   V(String)                                                                    \ | 89   V(String)                                                                    \ | 
| 90     V(OneByteString)                                                           \ | 90   V(OneByteString)                                                             \ | 
| 91     V(TwoByteString)                                                           \ | 91   V(TwoByteString)                                                             \ | 
| 92     V(ExternalOneByteString)                                                   \ | 92   V(ExternalOneByteString)                                                     \ | 
| 93     V(ExternalTwoByteString) | 93   V(ExternalTwoByteString) | 
| 94 | 94 | 
| 95 #define CLASS_LIST_TYPED_DATA(V)                                               \ | 95 #define CLASS_LIST_TYPED_DATA(V)                                               \ | 
| 96   V(Int8Array)                                                                 \ | 96   V(Int8Array)                                                                 \ | 
| 97   V(Uint8Array)                                                                \ | 97   V(Uint8Array)                                                                \ | 
| 98   V(Uint8ClampedArray)                                                         \ | 98   V(Uint8ClampedArray)                                                         \ | 
| 99   V(Int16Array)                                                                \ | 99   V(Int16Array)                                                                \ | 
| 100   V(Uint16Array)                                                               \ | 100   V(Uint16Array)                                                               \ | 
| 101   V(Int32Array)                                                                \ | 101   V(Int32Array)                                                                \ | 
| 102   V(Uint32Array)                                                               \ | 102   V(Uint32Array)                                                               \ | 
| 103   V(Int64Array)                                                                \ | 103   V(Int64Array)                                                                \ | 
| 104   V(Uint64Array)                                                               \ | 104   V(Uint64Array)                                                               \ | 
| 105   V(Float32Array)                                                              \ | 105   V(Float32Array)                                                              \ | 
| 106   V(Float64Array)                                                              \ | 106   V(Float64Array)                                                              \ | 
| 107   V(Float32x4Array)                                                            \ | 107   V(Float32x4Array)                                                            \ | 
| 108   V(Int32x4Array)                                                              \ | 108   V(Int32x4Array)                                                              \ | 
| 109   V(Float64x2Array)                                                            \ | 109   V(Float64x2Array) | 
| 110 | 110 | 
| 111 #define DART_CLASS_LIST_TYPED_DATA(V)                                          \ | 111 #define DART_CLASS_LIST_TYPED_DATA(V)                                          \ | 
| 112   V(Int8)                                                                      \ | 112   V(Int8)                                                                      \ | 
| 113   V(Uint8)                                                                     \ | 113   V(Uint8)                                                                     \ | 
| 114   V(Uint8Clamped)                                                              \ | 114   V(Uint8Clamped)                                                              \ | 
| 115   V(Int16)                                                                     \ | 115   V(Int16)                                                                     \ | 
| 116   V(Uint16)                                                                    \ | 116   V(Uint16)                                                                    \ | 
| 117   V(Int32)                                                                     \ | 117   V(Int32)                                                                     \ | 
| 118   V(Uint32)                                                                    \ | 118   V(Uint32)                                                                    \ | 
| 119   V(Int64)                                                                     \ | 119   V(Int64)                                                                     \ | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 134   CLASS_LIST_ARRAYS(V)                                                         \ | 134   CLASS_LIST_ARRAYS(V)                                                         \ | 
| 135   CLASS_LIST_STRINGS(V) | 135   CLASS_LIST_STRINGS(V) | 
| 136 | 136 | 
| 137 #define CLASS_LIST(V)                                                          \ | 137 #define CLASS_LIST(V)                                                          \ | 
| 138   V(Object)                                                                    \ | 138   V(Object)                                                                    \ | 
| 139   CLASS_LIST_NO_OBJECT(V) | 139   CLASS_LIST_NO_OBJECT(V) | 
| 140 | 140 | 
| 141 | 141 | 
| 142 // Forward declarations. | 142 // Forward declarations. | 
| 143 class Isolate; | 143 class Isolate; | 
| 144 #define DEFINE_FORWARD_DECLARATION(clazz)                                      \ | 144 #define DEFINE_FORWARD_DECLARATION(clazz) class Raw##clazz; | 
| 145   class Raw##clazz; |  | 
| 146 CLASS_LIST(DEFINE_FORWARD_DECLARATION) | 145 CLASS_LIST(DEFINE_FORWARD_DECLARATION) | 
| 147 #undef DEFINE_FORWARD_DECLARATION | 146 #undef DEFINE_FORWARD_DECLARATION | 
| 148 | 147 | 
| 149 | 148 | 
| 150 enum ClassId { | 149 enum ClassId { | 
| 151   // Illegal class id. | 150   // Illegal class id. | 
| 152   kIllegalCid = 0, | 151   kIllegalCid = 0, | 
| 153 | 152 | 
| 154   // The following entries describes classes for pseudo-objects in the heap | 153   // The following entries describes classes for pseudo-objects in the heap | 
| 155   // that should never be reachable from live objects. Free list elements | 154   // that should never be reachable from live objects. Free list elements | 
| 156   // maintain the free list for old space, and forwarding corpses are used to | 155   // maintain the free list for old space, and forwarding corpses are used to | 
| 157   // implement one-way become. | 156   // implement one-way become. | 
| 158   kFreeListElement, | 157   kFreeListElement, | 
| 159   kForwardingCorpse, | 158   kForwardingCorpse, | 
| 160 | 159 | 
| 161   // List of Ids for predefined classes. | 160 // List of Ids for predefined classes. | 
| 162 #define DEFINE_OBJECT_KIND(clazz)                                              \ | 161 #define DEFINE_OBJECT_KIND(clazz) k##clazz##Cid, | 
| 163   k##clazz##Cid, | 162   CLASS_LIST(DEFINE_OBJECT_KIND) | 
| 164 CLASS_LIST(DEFINE_OBJECT_KIND) |  | 
| 165 #undef DEFINE_OBJECT_KIND | 163 #undef DEFINE_OBJECT_KIND | 
| 166 | 164 | 
| 167 #define DEFINE_OBJECT_KIND(clazz)                                              \ | 165 #define DEFINE_OBJECT_KIND(clazz) kTypedData##clazz##Cid, | 
| 168   kTypedData##clazz##Cid, | 166       CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND) | 
| 169 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND) |  | 
| 170 #undef DEFINE_OBJECT_KIND | 167 #undef DEFINE_OBJECT_KIND | 
| 171 | 168 | 
| 172 #define DEFINE_OBJECT_KIND(clazz)                                              \ | 169 #define DEFINE_OBJECT_KIND(clazz) kTypedData##clazz##ViewCid, | 
| 173   kTypedData##clazz##ViewCid, | 170           CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND) | 
| 174 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND) |  | 
| 175 #undef DEFINE_OBJECT_KIND | 171 #undef DEFINE_OBJECT_KIND | 
| 176 | 172 | 
| 177   kByteDataViewCid, | 173               kByteDataViewCid, | 
| 178 | 174 | 
| 179 #define DEFINE_OBJECT_KIND(clazz)                                              \ | 175 #define DEFINE_OBJECT_KIND(clazz) kExternalTypedData##clazz##Cid, | 
| 180   kExternalTypedData##clazz##Cid, | 176   CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND) | 
| 181 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND) |  | 
| 182 #undef DEFINE_OBJECT_KIND | 177 #undef DEFINE_OBJECT_KIND | 
| 183 | 178 | 
| 184   kByteBufferCid, | 179       kByteBufferCid, | 
| 185 | 180 | 
| 186   // The following entries do not describe a predefined class, but instead | 181   // The following entries do not describe a predefined class, but instead | 
| 187   // are class indexes for pre-allocated instance (Null, dynamic and Void). | 182   // are class indexes for pre-allocated instance (Null, dynamic and Void). | 
| 188   kNullCid, | 183   kNullCid, | 
| 189   kDynamicCid, | 184   kDynamicCid, | 
| 190   kVoidCid, | 185   kVoidCid, | 
| 191 | 186 | 
| 192   kNumPredefinedCids, | 187   kNumPredefinedCids, | 
| 193 }; | 188 }; | 
| 194 | 189 | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 205 enum { | 200 enum { | 
| 206   kSmiTag = 0, | 201   kSmiTag = 0, | 
| 207   kHeapObjectTag = 1, | 202   kHeapObjectTag = 1, | 
| 208   kSmiTagSize = 1, | 203   kSmiTagSize = 1, | 
| 209   kSmiTagMask = 1, | 204   kSmiTagMask = 1, | 
| 210   kSmiTagShift = 1, | 205   kSmiTagShift = 1, | 
| 211 }; | 206 }; | 
| 212 | 207 | 
| 213 enum TypedDataElementType { | 208 enum TypedDataElementType { | 
| 214 #define V(name) k##name##Element, | 209 #define V(name) k##name##Element, | 
| 215 CLASS_LIST_TYPED_DATA(V) | 210   CLASS_LIST_TYPED_DATA(V) | 
| 216 #undef V | 211 #undef V | 
| 217 }; | 212 }; | 
| 218 | 213 | 
| 219 #define SNAPSHOT_WRITER_SUPPORT()                                              \ | 214 #define SNAPSHOT_WRITER_SUPPORT()                                              \ | 
| 220   void WriteTo(                                                                \ | 215   void WriteTo(SnapshotWriter* writer, intptr_t object_id,                     \ | 
| 221       SnapshotWriter* writer, intptr_t object_id,                              \ | 216                Snapshot::Kind kind, bool as_reference);                        \ | 
| 222       Snapshot::Kind kind, bool as_reference);                                 \ | 217   friend class SnapshotWriter; | 
| 223   friend class SnapshotWriter;                                                 \ |  | 
| 224 | 218 | 
| 225 #define VISITOR_SUPPORT(object)                                                \ | 219 #define VISITOR_SUPPORT(object)                                                \ | 
| 226   static intptr_t Visit##object##Pointers(Raw##object* raw_obj,                \ | 220   static intptr_t Visit##object##Pointers(Raw##object* raw_obj,                \ | 
| 227                                           ObjectPointerVisitor* visitor); | 221                                           ObjectPointerVisitor* visitor); | 
| 228 | 222 | 
| 229 #define HEAP_PROFILER_SUPPORT()                                                \ | 223 #define HEAP_PROFILER_SUPPORT() friend class HeapProfiler; | 
| 230   friend class HeapProfiler;                                                   \ |  | 
| 231 | 224 | 
| 232 #define RAW_OBJECT_IMPLEMENTATION(object)                                      \ | 225 #define RAW_OBJECT_IMPLEMENTATION(object)                                      \ | 
| 233  private:  /* NOLINT */                                                        \ | 226  private: /* NOLINT */                                                         \ | 
| 234   VISITOR_SUPPORT(object)                                                      \ | 227   VISITOR_SUPPORT(object)                                                      \ | 
| 235   friend class object;                                                         \ | 228   friend class object;                                                         \ | 
| 236   friend class RawObject;                                                      \ | 229   friend class RawObject;                                                      \ | 
| 237   friend class Heap;                                                           \ | 230   friend class Heap;                                                           \ | 
| 238   friend class Simulator;                                                      \ | 231   friend class Simulator;                                                      \ | 
| 239   friend class SimulatorHelpers;                                               \ | 232   friend class SimulatorHelpers;                                               \ | 
| 240   DISALLOW_ALLOCATION();                                                       \ | 233   DISALLOW_ALLOCATION();                                                       \ | 
| 241   DISALLOW_IMPLICIT_CONSTRUCTORS(Raw##object) | 234   DISALLOW_IMPLICIT_CONSTRUCTORS(Raw##object) | 
| 242 | 235 | 
| 243 // TODO(koda): Make ptr() return const*, like Object::raw_ptr(). | 236 // TODO(koda): Make ptr() return const*, like Object::raw_ptr(). | 
| 244 #define RAW_HEAP_OBJECT_IMPLEMENTATION(object)                                 \ | 237 #define RAW_HEAP_OBJECT_IMPLEMENTATION(object)                                 \ | 
| 245   private:                                                                     \ | 238  private:                                                                      \ | 
| 246     RAW_OBJECT_IMPLEMENTATION(object);                                         \ | 239   RAW_OBJECT_IMPLEMENTATION(object);                                           \ | 
| 247     Raw##object* ptr() const {                                                 \ | 240   Raw##object* ptr() const {                                                   \ | 
| 248       ASSERT(IsHeapObject());                                                  \ | 241     ASSERT(IsHeapObject());                                                    \ | 
| 249       return reinterpret_cast<Raw##object*>(                                   \ | 242     return reinterpret_cast<Raw##object*>(reinterpret_cast<uword>(this) -      \ | 
| 250           reinterpret_cast<uword>(this) - kHeapObjectTag);                     \ | 243                                           kHeapObjectTag);                     \ | 
| 251     }                                                                          \ | 244   }                                                                            \ | 
| 252     SNAPSHOT_WRITER_SUPPORT()                                                  \ | 245   SNAPSHOT_WRITER_SUPPORT()                                                    \ | 
| 253     HEAP_PROFILER_SUPPORT()                                                    \ | 246   HEAP_PROFILER_SUPPORT()                                                      \ | 
| 254     friend class object##SerializationCluster;                                 \ | 247   friend class object##SerializationCluster;                                   \ | 
| 255     friend class object##DeserializationCluster;                               \ | 248   friend class object##DeserializationCluster; | 
| 256 | 249 | 
| 257 // RawObject is the base class of all raw objects; even though it carries the | 250 // RawObject is the base class of all raw objects; even though it carries the | 
| 258 // tags_ field not all raw objects are allocated in the heap and thus cannot | 251 // tags_ field not all raw objects are allocated in the heap and thus cannot | 
| 259 // be dereferenced (e.g. RawSmi). | 252 // be dereferenced (e.g. RawSmi). | 
| 260 class RawObject { | 253 class RawObject { | 
| 261  public: | 254  public: | 
| 262   // The tags field which is a part of the object header uses the following | 255   // The tags field which is a part of the object header uses the following | 
| 263   // bit fields for storing tags. | 256   // bit fields for storing tags. | 
| 264   enum TagBits { | 257   enum TagBits { | 
| 265     kMarkBit = 0, | 258     kMarkBit = 0, | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 282 #else | 275 #else | 
| 283 #error Unexpected architecture word size | 276 #error Unexpected architecture word size | 
| 284 #endif | 277 #endif | 
| 285   }; | 278   }; | 
| 286 | 279 | 
| 287   COMPILE_ASSERT(kClassIdTagSize == (sizeof(classid_t) * kBitsPerByte)); | 280   COMPILE_ASSERT(kClassIdTagSize == (sizeof(classid_t) * kBitsPerByte)); | 
| 288 | 281 | 
| 289   // Encodes the object size in the tag in units of object alignment. | 282   // Encodes the object size in the tag in units of object alignment. | 
| 290   class SizeTag { | 283   class SizeTag { | 
| 291    public: | 284    public: | 
| 292     static const intptr_t kMaxSizeTag = | 285     static const intptr_t kMaxSizeTag = ((1 << RawObject::kSizeTagSize) - 1) | 
| 293         ((1 << RawObject::kSizeTagSize) - 1) << kObjectAlignmentLog2; | 286                                         << kObjectAlignmentLog2; | 
| 294 | 287 | 
| 295     static uword encode(intptr_t size) { | 288     static uword encode(intptr_t size) { | 
| 296       return SizeBits::encode(SizeToTagValue(size)); | 289       return SizeBits::encode(SizeToTagValue(size)); | 
| 297     } | 290     } | 
| 298 | 291 | 
| 299     static intptr_t decode(uword tag) { | 292     static intptr_t decode(uword tag) { | 
| 300       return TagValueToSize(SizeBits::decode(tag)); | 293       return TagValueToSize(SizeBits::decode(tag)); | 
| 301     } | 294     } | 
| 302 | 295 | 
| 303     static uword update(intptr_t size, uword tag) { | 296     static uword update(intptr_t size, uword tag) { | 
| 304       return SizeBits::update(SizeToTagValue(size), tag); | 297       return SizeBits::update(SizeToTagValue(size), tag); | 
| 305     } | 298     } | 
| 306 | 299 | 
| 307    private: | 300    private: | 
| 308     // The actual unscaled bit field used within the tag field. | 301     // The actual unscaled bit field used within the tag field. | 
| 309     class SizeBits : | 302     class SizeBits | 
| 310         public BitField<uword, intptr_t, kSizeTagPos, kSizeTagSize> {}; | 303         : public BitField<uword, intptr_t, kSizeTagPos, kSizeTagSize> {}; | 
| 311 | 304 | 
| 312     static intptr_t SizeToTagValue(intptr_t size) { | 305     static intptr_t SizeToTagValue(intptr_t size) { | 
| 313       ASSERT(Utils::IsAligned(size, kObjectAlignment)); | 306       ASSERT(Utils::IsAligned(size, kObjectAlignment)); | 
| 314       return  (size > kMaxSizeTag) ? 0 : (size >> kObjectAlignmentLog2); | 307       return (size > kMaxSizeTag) ? 0 : (size >> kObjectAlignmentLog2); | 
| 315     } | 308     } | 
| 316     static intptr_t TagValueToSize(intptr_t value) { | 309     static intptr_t TagValueToSize(intptr_t value) { | 
| 317       return value << kObjectAlignmentLog2; | 310       return value << kObjectAlignmentLog2; | 
| 318     } | 311     } | 
| 319   }; | 312   }; | 
| 320 | 313 | 
| 321   class ClassIdTag : | 314   class ClassIdTag | 
| 322       public BitField<uword, intptr_t, kClassIdTagPos, kClassIdTagSize> {}; | 315       : public BitField<uword, intptr_t, kClassIdTagPos, kClassIdTagSize> {}; | 
| 323 | 316 | 
| 324   bool IsWellFormed() const { | 317   bool IsWellFormed() const { | 
| 325     uword value = reinterpret_cast<uword>(this); | 318     uword value = reinterpret_cast<uword>(this); | 
| 326     return (value & kSmiTagMask) == 0 || | 319     return (value & kSmiTagMask) == 0 || | 
| 327         Utils::IsAligned(value - kHeapObjectTag, kWordSize); | 320            Utils::IsAligned(value - kHeapObjectTag, kWordSize); | 
| 328   } | 321   } | 
| 329   bool IsHeapObject() const { | 322   bool IsHeapObject() const { | 
| 330     ASSERT(IsWellFormed()); | 323     ASSERT(IsWellFormed()); | 
| 331     uword value = reinterpret_cast<uword>(this); | 324     uword value = reinterpret_cast<uword>(this); | 
| 332     return (value & kSmiTagMask) == kHeapObjectTag; | 325     return (value & kSmiTagMask) == kHeapObjectTag; | 
| 333   } | 326   } | 
| 334   // Assumes this is a heap object. | 327   // Assumes this is a heap object. | 
| 335   bool IsNewObject() const { | 328   bool IsNewObject() const { | 
| 336     ASSERT(IsHeapObject()); | 329     ASSERT(IsHeapObject()); | 
| 337     uword addr = reinterpret_cast<uword>(this); | 330     uword addr = reinterpret_cast<uword>(this); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 349     ASSERT(IsWellFormed()); | 342     ASSERT(IsWellFormed()); | 
| 350     COMPILE_ASSERT(kHeapObjectTag == 1); | 343     COMPILE_ASSERT(kHeapObjectTag == 1); | 
| 351     COMPILE_ASSERT(kNewObjectAlignmentOffset == kWordSize); | 344     COMPILE_ASSERT(kNewObjectAlignmentOffset == kWordSize); | 
| 352     static const uword kNewObjectBits = | 345     static const uword kNewObjectBits = | 
| 353         (kNewObjectAlignmentOffset | kHeapObjectTag); | 346         (kNewObjectAlignmentOffset | kHeapObjectTag); | 
| 354     const uword addr = reinterpret_cast<uword>(this); | 347     const uword addr = reinterpret_cast<uword>(this); | 
| 355     return (addr & kNewObjectBits) != kNewObjectBits; | 348     return (addr & kNewObjectBits) != kNewObjectBits; | 
| 356   } | 349   } | 
| 357 | 350 | 
| 358   // Support for GC marking bit. | 351   // Support for GC marking bit. | 
| 359   bool IsMarked() const { | 352   bool IsMarked() const { return MarkBit::decode(ptr()->tags_); } | 
| 360     return MarkBit::decode(ptr()->tags_); |  | 
| 361   } |  | 
| 362   void SetMarkBit() { | 353   void SetMarkBit() { | 
| 363     ASSERT(!IsMarked()); | 354     ASSERT(!IsMarked()); | 
| 364     UpdateTagBit<MarkBit>(true); | 355     UpdateTagBit<MarkBit>(true); | 
| 365   } | 356   } | 
| 366   void SetMarkBitUnsynchronized() { | 357   void SetMarkBitUnsynchronized() { | 
| 367     ASSERT(!IsMarked()); | 358     ASSERT(!IsMarked()); | 
| 368     uword tags = ptr()->tags_; | 359     uword tags = ptr()->tags_; | 
| 369     ptr()->tags_ = MarkBit::update(true, tags); | 360     ptr()->tags_ = MarkBit::update(true, tags); | 
| 370   } | 361   } | 
| 371   void ClearMarkBit() { | 362   void ClearMarkBit() { | 
| 372     ASSERT(IsMarked()); | 363     ASSERT(IsMarked()); | 
| 373     UpdateTagBit<MarkBit>(false); | 364     UpdateTagBit<MarkBit>(false); | 
| 374   } | 365   } | 
| 375   // Returns false if the bit was already set. | 366   // Returns false if the bit was already set. | 
| 376   // TODO(koda): Add "must use result" annotation here, after we add support. | 367   // TODO(koda): Add "must use result" annotation here, after we add support. | 
| 377   bool TryAcquireMarkBit() { | 368   bool TryAcquireMarkBit() { return TryAcquireTagBit<MarkBit>(); } | 
| 378     return TryAcquireTagBit<MarkBit>(); |  | 
| 379   } |  | 
| 380 | 369 | 
| 381   // Support for object tags. | 370   // Support for object tags. | 
| 382   bool IsCanonical() const { | 371   bool IsCanonical() const { return CanonicalObjectTag::decode(ptr()->tags_); } | 
| 383     return CanonicalObjectTag::decode(ptr()->tags_); | 372   void SetCanonical() { UpdateTagBit<CanonicalObjectTag>(true); } | 
| 384   } | 373   void ClearCanonical() { UpdateTagBit<CanonicalObjectTag>(false); } | 
| 385   void SetCanonical() { | 374   bool IsVMHeapObject() const { return VMHeapObjectTag::decode(ptr()->tags_); } | 
| 386     UpdateTagBit<CanonicalObjectTag>(true); | 375   void SetVMHeapObject() { UpdateTagBit<VMHeapObjectTag>(true); } | 
| 387   } |  | 
| 388   void ClearCanonical() { |  | 
| 389     UpdateTagBit<CanonicalObjectTag>(false); |  | 
| 390   } |  | 
| 391   bool IsVMHeapObject() const { |  | 
| 392     return VMHeapObjectTag::decode(ptr()->tags_); |  | 
| 393   } |  | 
| 394   void SetVMHeapObject() { |  | 
| 395     UpdateTagBit<VMHeapObjectTag>(true); |  | 
| 396   } |  | 
| 397 | 376 | 
| 398   // Support for GC remembered bit. | 377   // Support for GC remembered bit. | 
| 399   bool IsRemembered() const { | 378   bool IsRemembered() const { return RememberedBit::decode(ptr()->tags_); } | 
| 400     return RememberedBit::decode(ptr()->tags_); |  | 
| 401   } |  | 
| 402   void SetRememberedBit() { | 379   void SetRememberedBit() { | 
| 403     ASSERT(!IsRemembered()); | 380     ASSERT(!IsRemembered()); | 
| 404     UpdateTagBit<RememberedBit>(true); | 381     UpdateTagBit<RememberedBit>(true); | 
| 405   } | 382   } | 
| 406   void SetRememberedBitUnsynchronized() { | 383   void SetRememberedBitUnsynchronized() { | 
| 407     ASSERT(!IsRemembered()); | 384     ASSERT(!IsRemembered()); | 
| 408     uword tags = ptr()->tags_; | 385     uword tags = ptr()->tags_; | 
| 409     ptr()->tags_ = RememberedBit::update(true, tags); | 386     ptr()->tags_ = RememberedBit::update(true, tags); | 
| 410   } | 387   } | 
| 411   void ClearRememberedBit() { | 388   void ClearRememberedBit() { UpdateTagBit<RememberedBit>(false); } | 
| 412     UpdateTagBit<RememberedBit>(false); |  | 
| 413   } |  | 
| 414   void ClearRememberedBitUnsynchronized() { | 389   void ClearRememberedBitUnsynchronized() { | 
| 415     uword tags = ptr()->tags_; | 390     uword tags = ptr()->tags_; | 
| 416     ptr()->tags_ = RememberedBit::update(false, tags); | 391     ptr()->tags_ = RememberedBit::update(false, tags); | 
| 417   } | 392   } | 
| 418   // Returns false if the bit was already set. | 393   // Returns false if the bit was already set. | 
| 419   // TODO(koda): Add "must use result" annotation here, after we add support. | 394   // TODO(koda): Add "must use result" annotation here, after we add support. | 
| 420   bool TryAcquireRememberedBit() { | 395   bool TryAcquireRememberedBit() { return TryAcquireTagBit<RememberedBit>(); } | 
| 421     return TryAcquireTagBit<RememberedBit>(); |  | 
| 422   } |  | 
| 423 | 396 | 
| 424 #define DEFINE_IS_CID(clazz)                                                   \ | 397 #define DEFINE_IS_CID(clazz)                                                   \ | 
| 425   bool Is##clazz() const { return ((GetClassId() == k##clazz##Cid)); } | 398   bool Is##clazz() const { return ((GetClassId() == k##clazz##Cid)); } | 
| 426 CLASS_LIST(DEFINE_IS_CID) | 399   CLASS_LIST(DEFINE_IS_CID) | 
| 427 #undef DEFINE_IS_CID | 400 #undef DEFINE_IS_CID | 
| 428 | 401 | 
| 429 #define DEFINE_IS_CID(clazz)                                                   \ | 402 #define DEFINE_IS_CID(clazz)                                                   \ | 
| 430   bool IsTypedData##clazz() const {                                            \ | 403   bool IsTypedData##clazz() const {                                            \ | 
| 431     return ((GetClassId() == kTypedData##clazz##Cid));                         \ | 404     return ((GetClassId() == kTypedData##clazz##Cid));                         \ | 
| 432   }                                                                            \ | 405   }                                                                            \ | 
| 433   bool IsTypedDataView##clazz() const {                                        \ | 406   bool IsTypedDataView##clazz() const {                                        \ | 
| 434     return ((GetClassId() == kTypedData##clazz##ViewCid));                     \ | 407     return ((GetClassId() == kTypedData##clazz##ViewCid));                     \ | 
| 435   }                                                                            \ | 408   }                                                                            \ | 
| 436   bool IsExternalTypedData##clazz() const {                                    \ | 409   bool IsExternalTypedData##clazz() const {                                    \ | 
| 437     return ((GetClassId() == kExternalTypedData##clazz##Cid));                 \ | 410     return ((GetClassId() == kExternalTypedData##clazz##Cid));                 \ | 
| 438   } | 411   } | 
| 439 CLASS_LIST_TYPED_DATA(DEFINE_IS_CID) | 412   CLASS_LIST_TYPED_DATA(DEFINE_IS_CID) | 
| 440 #undef DEFINE_IS_CID | 413 #undef DEFINE_IS_CID | 
| 441 | 414 | 
| 442   bool IsStringInstance() const { | 415   bool IsStringInstance() const { return IsStringClassId(GetClassId()); } | 
| 443     return IsStringClassId(GetClassId()); |  | 
| 444   } |  | 
| 445   bool IsDartInstance() const { | 416   bool IsDartInstance() const { | 
| 446     return (!IsHeapObject() || (GetClassId() >= kInstanceCid)); | 417     return (!IsHeapObject() || (GetClassId() >= kInstanceCid)); | 
| 447   } | 418   } | 
| 448   bool IsFreeListElement() const { | 419   bool IsFreeListElement() const { | 
| 449     return ((GetClassId() == kFreeListElement)); | 420     return ((GetClassId() == kFreeListElement)); | 
| 450   } | 421   } | 
| 451   bool IsForwardingCorpse() const { | 422   bool IsForwardingCorpse() const { | 
| 452     return ((GetClassId() == kForwardingCorpse)); | 423     return ((GetClassId() == kForwardingCorpse)); | 
| 453   } | 424   } | 
| 454   bool IsPseudoObject() const { | 425   bool IsPseudoObject() const { | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 517   uword tags_;  // Various object tags (bits). | 488   uword tags_;  // Various object tags (bits). | 
| 518 | 489 | 
| 519   class MarkBit : public BitField<uword, bool, kMarkBit, 1> {}; | 490   class MarkBit : public BitField<uword, bool, kMarkBit, 1> {}; | 
| 520 | 491 | 
| 521   class RememberedBit : public BitField<uword, bool, kRememberedBit, 1> {}; | 492   class RememberedBit : public BitField<uword, bool, kRememberedBit, 1> {}; | 
| 522 | 493 | 
| 523   class CanonicalObjectTag : public BitField<uword, bool, kCanonicalBit, 1> {}; | 494   class CanonicalObjectTag : public BitField<uword, bool, kCanonicalBit, 1> {}; | 
| 524 | 495 | 
| 525   class VMHeapObjectTag : public BitField<uword, bool, kVMHeapObjectBit, 1> {}; | 496   class VMHeapObjectTag : public BitField<uword, bool, kVMHeapObjectBit, 1> {}; | 
| 526 | 497 | 
| 527   class ReservedBits : public | 498   class ReservedBits | 
| 528       BitField<uword, intptr_t, kReservedTagPos, kReservedTagSize> {}; | 499       : public BitField<uword, intptr_t, kReservedTagPos, kReservedTagSize> {}; | 
| 529 | 500 | 
| 530   // TODO(koda): After handling tags_, return const*, like Object::raw_ptr(). | 501   // TODO(koda): After handling tags_, return const*, like Object::raw_ptr(). | 
| 531   RawObject* ptr() const { | 502   RawObject* ptr() const { | 
| 532     ASSERT(IsHeapObject()); | 503     ASSERT(IsHeapObject()); | 
| 533     return reinterpret_cast<RawObject*>( | 504     return reinterpret_cast<RawObject*>(reinterpret_cast<uword>(this) - | 
| 534         reinterpret_cast<uword>(this) - kHeapObjectTag); | 505                                         kHeapObjectTag); | 
| 535   } | 506   } | 
| 536 | 507 | 
| 537   intptr_t SizeFromClass() const; | 508   intptr_t SizeFromClass() const; | 
| 538 | 509 | 
| 539   intptr_t GetClassId() const { | 510   intptr_t GetClassId() const { | 
| 540     uword tags = ptr()->tags_; | 511     uword tags = ptr()->tags_; | 
| 541     return ClassIdTag::decode(tags); | 512     return ClassIdTag::decode(tags); | 
| 542   } | 513   } | 
| 543 | 514 | 
| 544   void SetClassId(intptr_t new_cid) { | 515   void SetClassId(intptr_t new_cid) { | 
| 545     uword tags = ptr()->tags_; | 516     uword tags = ptr()->tags_; | 
| 546     ptr()->tags_ = ClassIdTag::update(new_cid, tags); | 517     ptr()->tags_ = ClassIdTag::update(new_cid, tags); | 
| 547   } | 518   } | 
| 548 | 519 | 
| 549   template<class TagBitField> | 520   template <class TagBitField> | 
| 550   void UpdateTagBit(bool value) { | 521   void UpdateTagBit(bool value) { | 
| 551     uword tags = ptr()->tags_; | 522     uword tags = ptr()->tags_; | 
| 552     uword old_tags; | 523     uword old_tags; | 
| 553     do { | 524     do { | 
| 554       old_tags = tags; | 525       old_tags = tags; | 
| 555       uword new_tags = TagBitField::update(value, old_tags); | 526       uword new_tags = TagBitField::update(value, old_tags); | 
| 556       tags = AtomicOperations::CompareAndSwapWord( | 527       tags = AtomicOperations::CompareAndSwapWord(&ptr()->tags_, old_tags, | 
| 557           &ptr()->tags_, old_tags, new_tags); | 528                                                   new_tags); | 
| 558     } while (tags != old_tags); | 529     } while (tags != old_tags); | 
| 559   } | 530   } | 
| 560 | 531 | 
| 561   template<class TagBitField> | 532   template <class TagBitField> | 
| 562   bool TryAcquireTagBit() { | 533   bool TryAcquireTagBit() { | 
| 563     uword tags = ptr()->tags_; | 534     uword tags = ptr()->tags_; | 
| 564     uword old_tags; | 535     uword old_tags; | 
| 565     do { | 536     do { | 
| 566       old_tags = tags; | 537       old_tags = tags; | 
| 567       if (TagBitField::decode(tags)) return false; | 538       if (TagBitField::decode(tags)) return false; | 
| 568       uword new_tags = TagBitField::update(true, old_tags); | 539       uword new_tags = TagBitField::update(true, old_tags); | 
| 569       tags = AtomicOperations::CompareAndSwapWord( | 540       tags = AtomicOperations::CompareAndSwapWord(&ptr()->tags_, old_tags, | 
| 570           &ptr()->tags_, old_tags, new_tags); | 541                                                   new_tags); | 
| 571     } while (tags != old_tags); | 542     } while (tags != old_tags); | 
| 572     return true; | 543     return true; | 
| 573   } | 544   } | 
| 574 | 545 | 
| 575   // All writes to heap objects should ultimately pass through one of the | 546   // All writes to heap objects should ultimately pass through one of the | 
| 576   // methods below or their counterparts in Object, to ensure that the | 547   // methods below or their counterparts in Object, to ensure that the | 
| 577   // write barrier is correctly applied. | 548   // write barrier is correctly applied. | 
| 578 | 549 | 
| 579   template<typename type> | 550   template <typename type> | 
| 580   void StorePointer(type const* addr, type value) { | 551   void StorePointer(type const* addr, type value) { | 
| 581     *const_cast<type*>(addr) = value; | 552     *const_cast<type*>(addr) = value; | 
| 582     // Filter stores based on source and target. | 553     // Filter stores based on source and target. | 
| 583     if (!value->IsHeapObject()) return; | 554     if (!value->IsHeapObject()) return; | 
| 584     if (value->IsNewObject() && this->IsOldObject() && | 555     if (value->IsNewObject() && this->IsOldObject() && !this->IsRemembered()) { | 
| 585         !this->IsRemembered()) { |  | 
| 586       this->SetRememberedBit(); | 556       this->SetRememberedBit(); | 
| 587       Thread::Current()->StoreBufferAddObject(this); | 557       Thread::Current()->StoreBufferAddObject(this); | 
| 588     } | 558     } | 
| 589   } | 559   } | 
| 590 | 560 | 
| 591   // Use for storing into an explicitly Smi-typed field of an object | 561   // Use for storing into an explicitly Smi-typed field of an object | 
| 592   // (i.e., both the previous and new value are Smis). | 562   // (i.e., both the previous and new value are Smis). | 
| 593   void StoreSmi(RawSmi* const* addr, RawSmi* value) { | 563   void StoreSmi(RawSmi* const* addr, RawSmi* value) { | 
| 594     // Can't use Contains, as array length is initialized through this method. | 564     // Can't use Contains, as array length is initialized through this method. | 
| 595     ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(this)); | 565     ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(this)); | 
| 596     *const_cast<RawSmi**>(addr) = value; | 566     *const_cast<RawSmi**>(addr) = value; | 
| 597   } | 567   } | 
| 598 | 568 | 
| 599   friend class Api; | 569   friend class Api; | 
| 600   friend class ApiMessageReader;  // GetClassId | 570   friend class ApiMessageReader;  // GetClassId | 
| 601   friend class Serializer;  // GetClassId | 571   friend class Serializer;        // GetClassId | 
| 602   friend class Array; | 572   friend class Array; | 
| 603   friend class Become;  // GetClassId | 573   friend class Become;  // GetClassId | 
| 604   friend class Bigint; | 574   friend class Bigint; | 
| 605   friend class ByteBuffer; | 575   friend class ByteBuffer; | 
| 606   friend class CidRewriteVisitor; | 576   friend class CidRewriteVisitor; | 
| 607   friend class Closure; | 577   friend class Closure; | 
| 608   friend class Code; | 578   friend class Code; | 
| 609   friend class Double; | 579   friend class Double; | 
| 610   friend class ForwardPointersVisitor;  // StorePointer | 580   friend class ForwardPointersVisitor;  // StorePointer | 
| 611   friend class FreeListElement; | 581   friend class FreeListElement; | 
| 612   friend class Function; | 582   friend class Function; | 
| 613   friend class GCMarker; | 583   friend class GCMarker; | 
| 614   friend class ExternalTypedData; | 584   friend class ExternalTypedData; | 
| 615   friend class ForwardList; | 585   friend class ForwardList; | 
| 616   friend class GrowableObjectArray;  // StorePointer | 586   friend class GrowableObjectArray;  // StorePointer | 
| 617   friend class Heap; | 587   friend class Heap; | 
| 618   friend class HeapMapAsJSONVisitor; | 588   friend class HeapMapAsJSONVisitor; | 
| 619   friend class ClassStatsVisitor; | 589   friend class ClassStatsVisitor; | 
| 620   template<bool> friend class MarkingVisitorBase; | 590   template <bool> | 
|  | 591   friend class MarkingVisitorBase; | 
| 621   friend class Mint; | 592   friend class Mint; | 
| 622   friend class Object; | 593   friend class Object; | 
| 623   friend class OneByteString;  // StoreSmi | 594   friend class OneByteString;  // StoreSmi | 
| 624   friend class RawCode; | 595   friend class RawCode; | 
| 625   friend class RawExternalTypedData; | 596   friend class RawExternalTypedData; | 
| 626   friend class RawInstructions; | 597   friend class RawInstructions; | 
| 627   friend class RawInstance; | 598   friend class RawInstance; | 
| 628   friend class RawTypedData; | 599   friend class RawTypedData; | 
| 629   friend class Scavenger; | 600   friend class Scavenger; | 
| 630   friend class ScavengerVisitor; | 601   friend class ScavengerVisitor; | 
| 631   friend class SizeExcludingClassVisitor;  // GetClassId | 602   friend class SizeExcludingClassVisitor;  // GetClassId | 
| 632   friend class InstanceAccumulator;  // GetClassId | 603   friend class InstanceAccumulator;        // GetClassId | 
| 633   friend class RetainingPathVisitor;  // GetClassId | 604   friend class RetainingPathVisitor;       // GetClassId | 
| 634   friend class SkippedCodeFunctions;  // StorePointer | 605   friend class SkippedCodeFunctions;       // StorePointer | 
| 635   friend class InstructionsReader;  // tags_ check | 606   friend class InstructionsReader;         // tags_ check | 
| 636   friend class AssemblyInstructionsWriter; | 607   friend class AssemblyInstructionsWriter; | 
| 637   friend class BlobInstructionsWriter; | 608   friend class BlobInstructionsWriter; | 
| 638   friend class SnapshotReader; | 609   friend class SnapshotReader; | 
| 639   friend class Deserializer; | 610   friend class Deserializer; | 
| 640   friend class SnapshotWriter; | 611   friend class SnapshotWriter; | 
| 641   friend class String; | 612   friend class String; | 
| 642   friend class Type;  // GetClassId | 613   friend class Type;  // GetClassId | 
| 643   friend class TypedData; | 614   friend class TypedData; | 
| 644   friend class TypedDataView; | 615   friend class TypedDataView; | 
| 645   friend class WeakProperty;  // StorePointer | 616   friend class WeakProperty;            // StorePointer | 
| 646   friend class Instance;  // StorePointer | 617   friend class Instance;                // StorePointer | 
| 647   friend class StackFrame;  // GetCodeObject assertion. | 618   friend class StackFrame;              // GetCodeObject assertion. | 
| 648   friend class CodeLookupTableBuilder;  // profiler | 619   friend class CodeLookupTableBuilder;  // profiler | 
| 649   friend class NativeEntry;  // GetClassId | 620   friend class NativeEntry;             // GetClassId | 
| 650   friend class Simulator; | 621   friend class Simulator; | 
| 651   friend class SimulatorHelpers; | 622   friend class SimulatorHelpers; | 
| 652   friend class ObjectLocator; | 623   friend class ObjectLocator; | 
| 653   friend class InstanceMorpher;  // GetClassId | 624   friend class InstanceMorpher;  // GetClassId | 
| 654   friend class VerifyCanonicalVisitor; | 625   friend class VerifyCanonicalVisitor; | 
| 655 | 626 | 
| 656   DISALLOW_ALLOCATION(); | 627   DISALLOW_ALLOCATION(); | 
| 657   DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject); | 628   DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject); | 
| 658 }; | 629 }; | 
| 659 | 630 | 
| 660 | 631 | 
| 661 class RawClass : public RawObject { | 632 class RawClass : public RawObject { | 
| 662  public: | 633  public: | 
| 663   enum ClassFinalizedState { | 634   enum ClassFinalizedState { | 
| 664     kAllocated = 0,  // Initial state. | 635     kAllocated = 0,         // Initial state. | 
| 665     kPreFinalized,  // VM classes: size precomputed, but no checks done. | 636     kPreFinalized,          // VM classes: size precomputed, but no checks done. | 
| 666     kFinalized,  // Class parsed, finalized and ready for use. | 637     kFinalized,             // Class parsed, finalized and ready for use. | 
| 667     kRefinalizeAfterPatch,  // Class needs to be refinalized (patched). | 638     kRefinalizeAfterPatch,  // Class needs to be refinalized (patched). | 
| 668   }; | 639   }; | 
| 669 | 640 | 
| 670  private: | 641  private: | 
| 671   RAW_HEAP_OBJECT_IMPLEMENTATION(Class); | 642   RAW_HEAP_OBJECT_IMPLEMENTATION(Class); | 
| 672 | 643 | 
| 673   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 644   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 
| 674   RawString* name_; | 645   RawString* name_; | 
| 675   NOT_IN_PRODUCT(RawString* user_name_); | 646   NOT_IN_PRODUCT(RawString* user_name_); | 
| 676   RawArray* functions_; | 647   RawArray* functions_; | 
| 677   RawArray* functions_hash_table_; | 648   RawArray* functions_hash_table_; | 
| 678   RawArray* fields_; | 649   RawArray* fields_; | 
| 679   RawArray* offset_in_words_to_field_; | 650   RawArray* offset_in_words_to_field_; | 
| 680   RawArray* interfaces_;  // Array of AbstractType. | 651   RawArray* interfaces_;  // Array of AbstractType. | 
| 681   RawScript* script_; | 652   RawScript* script_; | 
| 682   RawLibrary* library_; | 653   RawLibrary* library_; | 
| 683   RawTypeArguments* type_parameters_;  // Array of TypeParameter. | 654   RawTypeArguments* type_parameters_;  // Array of TypeParameter. | 
| 684   RawAbstractType* super_type_; | 655   RawAbstractType* super_type_; | 
| 685   RawType* mixin_;  // Generic mixin type, e.g. M<T>, not M<int>. | 656   RawType* mixin_;  // Generic mixin type, e.g. M<T>, not M<int>. | 
| 686   RawFunction* signature_function_;  // Associated function for typedef class. | 657   RawFunction* signature_function_;  // Associated function for typedef class. | 
| 687   RawArray* constants_;  // Canonicalized const instances of this class. | 658   RawArray* constants_;      // Canonicalized const instances of this class. | 
| 688   RawType* canonical_type_;  // Canonical type for this class. | 659   RawType* canonical_type_;  // Canonical type for this class. | 
| 689   RawArray* invocation_dispatcher_cache_;  // Cache for dispatcher functions. | 660   RawArray* invocation_dispatcher_cache_;  // Cache for dispatcher functions. | 
| 690   RawCode* allocation_stub_;  // Stub code for allocation of instances. | 661   RawCode* allocation_stub_;  // Stub code for allocation of instances. | 
| 691   RawGrowableObjectArray* direct_subclasses_;  // Array of Class. | 662   RawGrowableObjectArray* direct_subclasses_;  // Array of Class. | 
| 692   RawArray* dependent_code_;  // CHA optimized codes. | 663   RawArray* dependent_code_;                   // CHA optimized codes. | 
| 693   RawObject** to() { | 664   RawObject** to() { | 
| 694     return reinterpret_cast<RawObject**>(&ptr()->dependent_code_); | 665     return reinterpret_cast<RawObject**>(&ptr()->dependent_code_); | 
| 695   } | 666   } | 
| 696   RawObject** to_snapshot(Snapshot::Kind kind) { | 667   RawObject** to_snapshot(Snapshot::Kind kind) { | 
| 697     switch (kind) { | 668     switch (kind) { | 
| 698       case Snapshot::kCore: | 669       case Snapshot::kCore: | 
| 699       case Snapshot::kScript: | 670       case Snapshot::kScript: | 
| 700       case Snapshot::kAppWithJIT: | 671       case Snapshot::kAppWithJIT: | 
| 701       case Snapshot::kAppNoJIT: | 672       case Snapshot::kAppNoJIT: | 
| 702         return reinterpret_cast<RawObject**>(&ptr()->direct_subclasses_); | 673         return reinterpret_cast<RawObject**>(&ptr()->direct_subclasses_); | 
| 703       case Snapshot::kMessage: | 674       case Snapshot::kMessage: | 
| 704       case Snapshot::kNone: | 675       case Snapshot::kNone: | 
| 705       case Snapshot::kInvalid: | 676       case Snapshot::kInvalid: | 
| 706         break; | 677         break; | 
| 707     } | 678     } | 
| 708     UNREACHABLE(); | 679     UNREACHABLE(); | 
| 709     return NULL; | 680     return NULL; | 
| 710   } | 681   } | 
| 711 | 682 | 
| 712   cpp_vtable handle_vtable_; | 683   cpp_vtable handle_vtable_; | 
| 713   TokenPosition token_pos_; | 684   TokenPosition token_pos_; | 
| 714   int32_t instance_size_in_words_;  // Size if fixed len or 0 if variable len. | 685   int32_t instance_size_in_words_;  // Size if fixed len or 0 if variable len. | 
| 715   int32_t type_arguments_field_offset_in_words_;  // Offset of type args fld. | 686   int32_t type_arguments_field_offset_in_words_;  // Offset of type args fld. | 
| 716   int32_t next_field_offset_in_words_;  // Offset of the next instance field. | 687   int32_t next_field_offset_in_words_;  // Offset of the next instance field. | 
| 717   classid_t id_;  // Class Id, also index in the class table. | 688   classid_t id_;                // Class Id, also index in the class table. | 
| 718   int16_t num_type_arguments_;  // Number of type arguments in flattened vector. | 689   int16_t num_type_arguments_;  // Number of type arguments in flattened vector. | 
| 719   int16_t num_own_type_arguments_;  // Number of non-overlapping type arguments. | 690   int16_t num_own_type_arguments_;  // Number of non-overlapping type arguments. | 
| 720   uint16_t num_native_fields_;  // Number of native fields in class. | 691   uint16_t num_native_fields_;      // Number of native fields in class. | 
| 721   uint16_t state_bits_; | 692   uint16_t state_bits_; | 
| 722 | 693 | 
| 723   friend class Instance; | 694   friend class Instance; | 
| 724   friend class Isolate; | 695   friend class Isolate; | 
| 725   friend class Object; | 696   friend class Object; | 
| 726   friend class RawInstance; | 697   friend class RawInstance; | 
| 727   friend class RawInstructions; | 698   friend class RawInstructions; | 
| 728   friend class SnapshotReader; | 699   friend class SnapshotReader; | 
| 729   friend class InstanceSerializationCluster; | 700   friend class InstanceSerializationCluster; | 
| 730   friend class CidRewriteVisitor; | 701   friend class CidRewriteVisitor; | 
| 731 }; | 702 }; | 
| 732 | 703 | 
| 733 | 704 | 
| 734 class RawUnresolvedClass : public RawObject { | 705 class RawUnresolvedClass : public RawObject { | 
| 735   RAW_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass); | 706   RAW_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass); | 
| 736 | 707 | 
| 737   RawObject** from() { | 708   RawObject** from() { | 
| 738     return reinterpret_cast<RawObject**>(&ptr()->library_prefix_); | 709     return reinterpret_cast<RawObject**>(&ptr()->library_prefix_); | 
| 739   } | 710   } | 
| 740   RawLibraryPrefix* library_prefix_;  // Library prefix qualifier for the ident. | 711   RawLibraryPrefix* library_prefix_;  // Library prefix qualifier for the ident. | 
| 741   RawString* ident_;  // Name of the unresolved identifier. | 712   RawString* ident_;                  // Name of the unresolved identifier. | 
| 742   RawObject** to() { | 713   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->ident_); } | 
| 743     return reinterpret_cast<RawObject**>(&ptr()->ident_); |  | 
| 744   } |  | 
| 745   TokenPosition token_pos_; | 714   TokenPosition token_pos_; | 
| 746 }; | 715 }; | 
| 747 | 716 | 
| 748 | 717 | 
| 749 class RawTypeArguments : public RawObject { | 718 class RawTypeArguments : public RawObject { | 
| 750  private: | 719  private: | 
| 751   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments); | 720   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments); | 
| 752 | 721 | 
| 753   RawObject** from() { | 722   RawObject** from() { | 
| 754     return reinterpret_cast<RawObject**>(&ptr()->instantiations_); | 723     return reinterpret_cast<RawObject**>(&ptr()->instantiations_); | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 780 class RawPatchClass : public RawObject { | 749 class RawPatchClass : public RawObject { | 
| 781  private: | 750  private: | 
| 782   RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass); | 751   RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass); | 
| 783 | 752 | 
| 784   RawObject** from() { | 753   RawObject** from() { | 
| 785     return reinterpret_cast<RawObject**>(&ptr()->patched_class_); | 754     return reinterpret_cast<RawObject**>(&ptr()->patched_class_); | 
| 786   } | 755   } | 
| 787   RawClass* patched_class_; | 756   RawClass* patched_class_; | 
| 788   RawClass* origin_class_; | 757   RawClass* origin_class_; | 
| 789   RawScript* script_; | 758   RawScript* script_; | 
| 790   RawObject** to() { | 759   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->script_); } | 
| 791     return reinterpret_cast<RawObject**>(&ptr()->script_); |  | 
| 792   } |  | 
| 793 | 760 | 
| 794   friend class Function; | 761   friend class Function; | 
| 795 }; | 762 }; | 
| 796 | 763 | 
| 797 | 764 | 
| 798 class RawFunction : public RawObject { | 765 class RawFunction : public RawObject { | 
| 799  public: | 766  public: | 
| 800   enum Kind { | 767   enum Kind { | 
| 801     kRegularFunction, | 768     kRegularFunction, | 
| 802     kClosureFunction, | 769     kClosureFunction, | 
| 803     kSignatureFunction,  // represents a signature only without actual code. | 770     kSignatureFunction,  // represents a signature only without actual code. | 
| 804     kGetterFunction,     // represents getter functions e.g: get foo() { .. }. | 771     kGetterFunction,     // represents getter functions e.g: get foo() { .. }. | 
| 805     kSetterFunction,     // represents setter functions e.g: set foo(..) { .. }. | 772     kSetterFunction,     // represents setter functions e.g: set foo(..) { .. }. | 
| 806     kConstructor, | 773     kConstructor, | 
| 807     kImplicitGetter,     // represents an implicit getter for fields. | 774     kImplicitGetter,             // represents an implicit getter for fields. | 
| 808     kImplicitSetter,     // represents an implicit setter for fields. | 775     kImplicitSetter,             // represents an implicit setter for fields. | 
| 809     kImplicitStaticFinalGetter,  // represents an implicit getter for static | 776     kImplicitStaticFinalGetter,  // represents an implicit getter for static | 
| 810                                  // final fields (incl. static const fields). | 777                                  // final fields (incl. static const fields). | 
| 811     kMethodExtractor,  // converts method into implicit closure on the receiver. | 778     kMethodExtractor,  // converts method into implicit closure on the receiver. | 
| 812     kNoSuchMethodDispatcher,  // invokes noSuchMethod. | 779     kNoSuchMethodDispatcher,  // invokes noSuchMethod. | 
| 813     kInvokeFieldDispatcher,  // invokes a field as a closure. | 780     kInvokeFieldDispatcher,   // invokes a field as a closure. | 
| 814     kIrregexpFunction,   // represents a generated irregexp matcher function. | 781     kIrregexpFunction,  // represents a generated irregexp matcher function. | 
| 815   }; | 782   }; | 
| 816 | 783 | 
| 817   enum AsyncModifier { | 784   enum AsyncModifier { | 
| 818     kNoModifier = 0x0, | 785     kNoModifier = 0x0, | 
| 819     kAsyncBit   = 0x1, | 786     kAsyncBit = 0x1, | 
| 820     kGeneratorBit =  0x2, | 787     kGeneratorBit = 0x2, | 
| 821     kAsync      = kAsyncBit, | 788     kAsync = kAsyncBit, | 
| 822     kSyncGen    = kGeneratorBit, | 789     kSyncGen = kGeneratorBit, | 
| 823     kAsyncGen   = kAsyncBit | kGeneratorBit, | 790     kAsyncGen = kAsyncBit | kGeneratorBit, | 
| 824   }; | 791   }; | 
| 825 | 792 | 
| 826  private: | 793  private: | 
| 827   // So that the SkippedCodeFunctions::DetachCode can null out the code fields. | 794   // So that the SkippedCodeFunctions::DetachCode can null out the code fields. | 
| 828   friend class SkippedCodeFunctions; | 795   friend class SkippedCodeFunctions; | 
| 829   friend class Class; | 796   friend class Class; | 
| 830 | 797 | 
| 831   RAW_HEAP_OBJECT_IMPLEMENTATION(Function); | 798   RAW_HEAP_OBJECT_IMPLEMENTATION(Function); | 
| 832 | 799 | 
| 833   static bool ShouldVisitCode(RawCode* raw_code); | 800   static bool ShouldVisitCode(RawCode* raw_code); | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 859     return reinterpret_cast<RawObject**>(&ptr()->code_); | 826     return reinterpret_cast<RawObject**>(&ptr()->code_); | 
| 860 #else | 827 #else | 
| 861     return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_); | 828     return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_); | 
| 862 #endif | 829 #endif | 
| 863   } | 830   } | 
| 864 | 831 | 
| 865   NOT_IN_PRECOMPILED(TokenPosition token_pos_); | 832   NOT_IN_PRECOMPILED(TokenPosition token_pos_); | 
| 866   NOT_IN_PRECOMPILED(TokenPosition end_token_pos_); | 833   NOT_IN_PRECOMPILED(TokenPosition end_token_pos_); | 
| 867   NOT_IN_PRECOMPILED(int32_t usage_counter_);  // Accessed from generated code | 834   NOT_IN_PRECOMPILED(int32_t usage_counter_);  // Accessed from generated code | 
| 868                                                // (JIT only). | 835                                                // (JIT only). | 
| 869   uint32_t kind_tag_;  // See Function::KindTagBits. | 836   uint32_t kind_tag_;                          // See Function::KindTagBits. | 
| 870   int16_t num_fixed_parameters_; | 837   int16_t num_fixed_parameters_; | 
| 871   int16_t num_optional_parameters_;  // > 0: positional; < 0: named. | 838   int16_t num_optional_parameters_;  // > 0: positional; < 0: named. | 
| 872   NOT_IN_PRECOMPILED(void* kernel_function_); | 839   NOT_IN_PRECOMPILED(void* kernel_function_); | 
| 873   NOT_IN_PRECOMPILED(uint16_t optimized_instruction_count_); | 840   NOT_IN_PRECOMPILED(uint16_t optimized_instruction_count_); | 
| 874   NOT_IN_PRECOMPILED(uint16_t optimized_call_site_count_); | 841   NOT_IN_PRECOMPILED(uint16_t optimized_call_site_count_); | 
| 875   NOT_IN_PRECOMPILED(int8_t deoptimization_counter_); | 842   NOT_IN_PRECOMPILED(int8_t deoptimization_counter_); | 
| 876   NOT_IN_PRECOMPILED(int8_t was_compiled_); | 843   NOT_IN_PRECOMPILED(int8_t was_compiled_); | 
| 877 }; | 844 }; | 
| 878 | 845 | 
| 879 | 846 | 
| 880 class RawClosureData : public RawObject { | 847 class RawClosureData : public RawObject { | 
| 881  private: | 848  private: | 
| 882   RAW_HEAP_OBJECT_IMPLEMENTATION(ClosureData); | 849   RAW_HEAP_OBJECT_IMPLEMENTATION(ClosureData); | 
| 883 | 850 | 
| 884   RawObject** from() { | 851   RawObject** from() { | 
| 885     return reinterpret_cast<RawObject**>(&ptr()->context_scope_); | 852     return reinterpret_cast<RawObject**>(&ptr()->context_scope_); | 
| 886   } | 853   } | 
| 887   RawContextScope* context_scope_; | 854   RawContextScope* context_scope_; | 
| 888   RawFunction* parent_function_;  // Enclosing function of this local function. | 855   RawFunction* parent_function_;  // Enclosing function of this local function. | 
| 889   RawType* signature_type_; | 856   RawType* signature_type_; | 
| 890   RawInstance* closure_;  // Closure object for static implicit closures. | 857   RawInstance* closure_;  // Closure object for static implicit closures. | 
| 891   RawObject** to() { | 858   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->closure_); } | 
| 892     return reinterpret_cast<RawObject**>(&ptr()->closure_); |  | 
| 893   } |  | 
| 894 | 859 | 
| 895   friend class Function; | 860   friend class Function; | 
| 896 }; | 861 }; | 
| 897 | 862 | 
| 898 | 863 | 
| 899 class RawRedirectionData : public RawObject { | 864 class RawRedirectionData : public RawObject { | 
| 900  private: | 865  private: | 
| 901   RAW_HEAP_OBJECT_IMPLEMENTATION(RedirectionData); | 866   RAW_HEAP_OBJECT_IMPLEMENTATION(RedirectionData); | 
| 902 | 867 | 
| 903   RawObject** from() { | 868   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); } | 
| 904     return reinterpret_cast<RawObject**>(&ptr()->type_); |  | 
| 905   } |  | 
| 906   RawType* type_; | 869   RawType* type_; | 
| 907   RawString* identifier_; | 870   RawString* identifier_; | 
| 908   RawFunction* target_; | 871   RawFunction* target_; | 
| 909   RawObject** to() { | 872   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->target_); } | 
| 910     return reinterpret_cast<RawObject**>(&ptr()->target_); |  | 
| 911   } |  | 
| 912 }; | 873 }; | 
| 913 | 874 | 
| 914 | 875 | 
| 915 class RawField : public RawObject { | 876 class RawField : public RawObject { | 
| 916   RAW_HEAP_OBJECT_IMPLEMENTATION(Field); | 877   RAW_HEAP_OBJECT_IMPLEMENTATION(Field); | 
| 917 | 878 | 
| 918   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 879   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 
| 919   RawString* name_; | 880   RawString* name_; | 
| 920   RawObject* owner_;  // Class or patch class or mixin class | 881   RawObject* owner_;  // Class or patch class or mixin class | 
| 921                       // where this field is defined or original field. | 882                       // where this field is defined or original field. | 
| 922   RawAbstractType* type_; | 883   RawAbstractType* type_; | 
| 923   union { | 884   union { | 
| 924     RawInstance* static_value_;  // Value for static fields. | 885     RawInstance* static_value_;  // Value for static fields. | 
| 925     RawSmi* offset_;  // Offset in words for instance fields. | 886     RawSmi* offset_;             // Offset in words for instance fields. | 
| 926   } value_; | 887   } value_; | 
| 927   union { | 888   union { | 
| 928     // When precompiling we need to save the static initializer function here | 889     // When precompiling we need to save the static initializer function here | 
| 929     // so that code for it can be generated. | 890     // so that code for it can be generated. | 
| 930     RawFunction* precompiled_;  // Static initializer function - precompiling. | 891     RawFunction* precompiled_;  // Static initializer function - precompiling. | 
| 931     // When generating script snapshots after running the application it is | 892     // When generating script snapshots after running the application it is | 
| 932     // necessary to save the initial value of static fields so that we can | 893     // necessary to save the initial value of static fields so that we can | 
| 933     // restore the value back to the original initial value. | 894     // restore the value back to the original initial value. | 
| 934     RawInstance* saved_value_;  // Saved initial value - static fields. | 895     RawInstance* saved_value_;  // Saved initial value - static fields. | 
| 935   } initializer_; | 896   } initializer_; | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 968   uint8_t kind_bits_;  // static, final, const, has initializer.... | 929   uint8_t kind_bits_;  // static, final, const, has initializer.... | 
| 969   NOT_IN_PRECOMPILED(void* kernel_field_); | 930   NOT_IN_PRECOMPILED(void* kernel_field_); | 
| 970 | 931 | 
| 971   friend class CidRewriteVisitor; | 932   friend class CidRewriteVisitor; | 
| 972 }; | 933 }; | 
| 973 | 934 | 
| 974 | 935 | 
| 975 class RawLiteralToken : public RawObject { | 936 class RawLiteralToken : public RawObject { | 
| 976   RAW_HEAP_OBJECT_IMPLEMENTATION(LiteralToken); | 937   RAW_HEAP_OBJECT_IMPLEMENTATION(LiteralToken); | 
| 977 | 938 | 
| 978   RawObject** from() { | 939   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->literal_); } | 
| 979     return reinterpret_cast<RawObject**>(&ptr()->literal_); |  | 
| 980   } |  | 
| 981   RawString* literal_;  // Literal characters as they appear in source text. | 940   RawString* literal_;  // Literal characters as they appear in source text. | 
| 982   RawObject* value_;  // The actual object corresponding to the token. | 941   RawObject* value_;    // The actual object corresponding to the token. | 
| 983   RawObject** to() { | 942   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->value_); } | 
| 984     return reinterpret_cast<RawObject**>(&ptr()->value_); |  | 
| 985   } |  | 
| 986   Token::Kind kind_;  // The literal kind (string, integer, double). | 943   Token::Kind kind_;  // The literal kind (string, integer, double). | 
| 987 | 944 | 
| 988   friend class SnapshotReader; | 945   friend class SnapshotReader; | 
| 989 }; | 946 }; | 
| 990 | 947 | 
| 991 | 948 | 
| 992 class RawTokenStream : public RawObject { | 949 class RawTokenStream : public RawObject { | 
| 993   RAW_HEAP_OBJECT_IMPLEMENTATION(TokenStream); | 950   RAW_HEAP_OBJECT_IMPLEMENTATION(TokenStream); | 
| 994 | 951 | 
| 995   RawObject** from() { | 952   RawObject** from() { | 
| 996     return reinterpret_cast<RawObject**>(&ptr()->private_key_); | 953     return reinterpret_cast<RawObject**>(&ptr()->private_key_); | 
| 997   } | 954   } | 
| 998   RawString* private_key_;  // Key used for private identifiers. | 955   RawString* private_key_;  // Key used for private identifiers. | 
| 999   RawGrowableObjectArray* token_objects_; | 956   RawGrowableObjectArray* token_objects_; | 
| 1000   RawExternalTypedData* stream_; | 957   RawExternalTypedData* stream_; | 
| 1001   RawObject** to() { | 958   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->stream_); } | 
| 1002     return reinterpret_cast<RawObject**>(&ptr()->stream_); |  | 
| 1003   } |  | 
| 1004 | 959 | 
| 1005   friend class SnapshotReader; | 960   friend class SnapshotReader; | 
| 1006 }; | 961 }; | 
| 1007 | 962 | 
| 1008 | 963 | 
| 1009 class RawScript : public RawObject { | 964 class RawScript : public RawObject { | 
| 1010  public: | 965  public: | 
| 1011   enum Kind { | 966   enum Kind { | 
| 1012     kScriptTag = 0, | 967     kScriptTag = 0, | 
| 1013     kLibraryTag, | 968     kLibraryTag, | 
| 1014     kSourceTag, | 969     kSourceTag, | 
| 1015     kPatchTag, | 970     kPatchTag, | 
| 1016     kEvaluateTag, | 971     kEvaluateTag, | 
| 1017   }; | 972   }; | 
| 1018 | 973 | 
| 1019  private: | 974  private: | 
| 1020   RAW_HEAP_OBJECT_IMPLEMENTATION(Script); | 975   RAW_HEAP_OBJECT_IMPLEMENTATION(Script); | 
| 1021 | 976 | 
| 1022   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->url_); } | 977   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->url_); } | 
| 1023   RawString* url_; | 978   RawString* url_; | 
| 1024   RawString* resolved_url_; | 979   RawString* resolved_url_; | 
| 1025   RawArray* compile_time_constants_; | 980   RawArray* compile_time_constants_; | 
| 1026   RawTokenStream* tokens_; | 981   RawTokenStream* tokens_; | 
| 1027   RawString* source_; | 982   RawString* source_; | 
| 1028   RawObject** to() {return reinterpret_cast<RawObject**>(&ptr()->source_); } | 983   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->source_); } | 
| 1029   RawObject** to_snapshot(Snapshot::Kind kind) { | 984   RawObject** to_snapshot(Snapshot::Kind kind) { | 
| 1030     switch (kind) { | 985     switch (kind) { | 
| 1031       case Snapshot::kAppNoJIT: | 986       case Snapshot::kAppNoJIT: | 
| 1032         return reinterpret_cast<RawObject**>(&ptr()->url_); | 987         return reinterpret_cast<RawObject**>(&ptr()->url_); | 
| 1033       case Snapshot::kCore: | 988       case Snapshot::kCore: | 
| 1034       case Snapshot::kAppWithJIT: | 989       case Snapshot::kAppWithJIT: | 
| 1035       case Snapshot::kScript: | 990       case Snapshot::kScript: | 
| 1036         return reinterpret_cast<RawObject**>(&ptr()->tokens_); | 991         return reinterpret_cast<RawObject**>(&ptr()->tokens_); | 
| 1037       case Snapshot::kMessage: | 992       case Snapshot::kMessage: | 
| 1038       case Snapshot::kNone: | 993       case Snapshot::kNone: | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 1058     kLoaded,          // Library is loaded. | 1013     kLoaded,          // Library is loaded. | 
| 1059     kLoadError,       // Error occurred during load of the Library. | 1014     kLoadError,       // Error occurred during load of the Library. | 
| 1060   }; | 1015   }; | 
| 1061 | 1016 | 
| 1062   RAW_HEAP_OBJECT_IMPLEMENTATION(Library); | 1017   RAW_HEAP_OBJECT_IMPLEMENTATION(Library); | 
| 1063 | 1018 | 
| 1064   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 1019   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 
| 1065   RawString* name_; | 1020   RawString* name_; | 
| 1066   RawString* url_; | 1021   RawString* url_; | 
| 1067   RawString* private_key_; | 1022   RawString* private_key_; | 
| 1068   RawArray* dictionary_;         // Top-level names in this library. | 1023   RawArray* dictionary_;              // Top-level names in this library. | 
| 1069   RawGrowableObjectArray* metadata_;  // Metadata on classes, methods etc. | 1024   RawGrowableObjectArray* metadata_;  // Metadata on classes, methods etc. | 
| 1070   RawClass* toplevel_class_;     // Class containing top-level elements. | 1025   RawClass* toplevel_class_;          // Class containing top-level elements. | 
| 1071   RawGrowableObjectArray* patch_classes_; | 1026   RawGrowableObjectArray* patch_classes_; | 
| 1072   RawArray* imports_;            // List of Namespaces imported without prefix. | 1027   RawArray* imports_;        // List of Namespaces imported without prefix. | 
| 1073   RawArray* exports_;            // List of re-exported Namespaces. | 1028   RawArray* exports_;        // List of re-exported Namespaces. | 
| 1074   RawInstance* load_error_;      // Error iff load_state_ == kLoadError. | 1029   RawInstance* load_error_;  // Error iff load_state_ == kLoadError. | 
| 1075   RawObject** to_snapshot() { | 1030   RawObject** to_snapshot() { | 
| 1076     return reinterpret_cast<RawObject**>(&ptr()->load_error_); | 1031     return reinterpret_cast<RawObject**>(&ptr()->load_error_); | 
| 1077   } | 1032   } | 
| 1078   RawArray* resolved_names_;     // Cache of resolved names in library scope. | 1033   RawArray* resolved_names_;  // Cache of resolved names in library scope. | 
| 1079   RawArray* exported_names_;     // Cache of exported names by library. | 1034   RawArray* exported_names_;  // Cache of exported names by library. | 
| 1080   RawArray* loaded_scripts_;     // Array of scripts loaded in this library. | 1035   RawArray* loaded_scripts_;  // Array of scripts loaded in this library. | 
| 1081   RawObject** to() { | 1036   RawObject** to() { | 
| 1082     return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_); | 1037     return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_); | 
| 1083   } | 1038   } | 
| 1084 | 1039 | 
| 1085   Dart_NativeEntryResolver native_entry_resolver_;  // Resolves natives. | 1040   Dart_NativeEntryResolver native_entry_resolver_;  // Resolves natives. | 
| 1086   Dart_NativeEntrySymbol native_entry_symbol_resolver_; | 1041   Dart_NativeEntrySymbol native_entry_symbol_resolver_; | 
| 1087   classid_t index_;              // Library id number. | 1042   classid_t index_;       // Library id number. | 
| 1088   uint16_t num_imports_;         // Number of entries in imports_. | 1043   uint16_t num_imports_;  // Number of entries in imports_. | 
| 1089   int8_t load_state_;            // Of type LibraryState. | 1044   int8_t load_state_;     // Of type LibraryState. | 
| 1090   bool corelib_imported_; | 1045   bool corelib_imported_; | 
| 1091   bool is_dart_scheme_; | 1046   bool is_dart_scheme_; | 
| 1092   bool debuggable_;              // True if debugger can stop in library. | 1047   bool debuggable_;          // True if debugger can stop in library. | 
| 1093   bool is_in_fullsnapshot_;      // True if library is in a full snapshot. | 1048   bool is_in_fullsnapshot_;  // True if library is in a full snapshot. | 
| 1094 | 1049 | 
| 1095   friend class Class; | 1050   friend class Class; | 
| 1096   friend class Isolate; | 1051   friend class Isolate; | 
| 1097 }; | 1052 }; | 
| 1098 | 1053 | 
| 1099 | 1054 | 
| 1100 class RawNamespace : public RawObject { | 1055 class RawNamespace : public RawObject { | 
| 1101   RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace); | 1056   RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace); | 
| 1102 | 1057 | 
| 1103   RawObject** from() { | 1058   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->library_); } | 
| 1104     return reinterpret_cast<RawObject**>(&ptr()->library_); | 1059   RawLibrary* library_;       // library with name dictionary. | 
| 1105   } | 1060   RawArray* show_names_;      // list of names that are exported. | 
| 1106   RawLibrary* library_;          // library with name dictionary. | 1061   RawArray* hide_names_;      // blacklist of names that are not exported. | 
| 1107   RawArray* show_names_;         // list of names that are exported. | 1062   RawField* metadata_field_;  // remembers the token pos of metadata if any, | 
| 1108   RawArray* hide_names_;         // blacklist of names that are not exported. | 1063                               // and the metadata values if computed. | 
| 1109   RawField* metadata_field_;     // remembers the token pos of metadata if any, |  | 
| 1110                                  // and the metadata values if computed. |  | 
| 1111   RawObject** to() { | 1064   RawObject** to() { | 
| 1112     return reinterpret_cast<RawObject**>(&ptr()->metadata_field_); | 1065     return reinterpret_cast<RawObject**>(&ptr()->metadata_field_); | 
| 1113   } | 1066   } | 
| 1114 }; | 1067 }; | 
| 1115 | 1068 | 
| 1116 | 1069 | 
| 1117 class RawCode : public RawObject { | 1070 class RawCode : public RawObject { | 
| 1118   enum InlinedMetadataIndex { | 1071   enum InlinedMetadataIndex { | 
| 1119     kInlinedIntervalsIndex = 0, | 1072     kInlinedIntervalsIndex = 0, | 
| 1120     kInlinedIdToFunctionIndex = 1, | 1073     kInlinedIdToFunctionIndex = 1, | 
| 1121     kInlinedCallerIdMapIndex = 2, | 1074     kInlinedCallerIdMapIndex = 2, | 
| 1122     kInlinedIdToTokenPosIndex = 3, | 1075     kInlinedIdToTokenPosIndex = 3, | 
| 1123     kInlinedMetadataSize = 4, | 1076     kInlinedMetadataSize = 4, | 
| 1124   }; | 1077   }; | 
| 1125 | 1078 | 
| 1126   RAW_HEAP_OBJECT_IMPLEMENTATION(Code); | 1079   RAW_HEAP_OBJECT_IMPLEMENTATION(Code); | 
| 1127 | 1080 | 
| 1128   uword entry_point_;  // Accessed from generated code. | 1081   uword entry_point_;          // Accessed from generated code. | 
| 1129   uword checked_entry_point_;  // Accessed from generated code (AOT only). | 1082   uword checked_entry_point_;  // Accessed from generated code (AOT only). | 
| 1130 | 1083 | 
| 1131   RawObject** from() { | 1084   RawObject** from() { | 
| 1132     return reinterpret_cast<RawObject**>(&ptr()->object_pool_); | 1085     return reinterpret_cast<RawObject**>(&ptr()->object_pool_); | 
| 1133   } | 1086   } | 
| 1134   RawObjectPool* object_pool_;  // Accessed from generated code. | 1087   RawObjectPool* object_pool_;     // Accessed from generated code. | 
| 1135   RawInstructions* instructions_;  // Accessed from generated code. | 1088   RawInstructions* instructions_;  // Accessed from generated code. | 
| 1136   // If owner_ is Function::null() the owner is a regular stub. | 1089   // If owner_ is Function::null() the owner is a regular stub. | 
| 1137   // If owner_ is a Class the owner is the allocation stub for that class. | 1090   // If owner_ is a Class the owner is the allocation stub for that class. | 
| 1138   // Else, owner_ is a regular Dart Function. | 1091   // Else, owner_ is a regular Dart Function. | 
| 1139   RawObject* owner_;  // Function, Null, or a Class. | 1092   RawObject* owner_;  // Function, Null, or a Class. | 
| 1140   RawExceptionHandlers* exception_handlers_; | 1093   RawExceptionHandlers* exception_handlers_; | 
| 1141   RawPcDescriptors* pc_descriptors_; | 1094   RawPcDescriptors* pc_descriptors_; | 
| 1142   RawArray* stackmaps_; | 1095   RawArray* stackmaps_; | 
| 1143   NOT_IN_PRECOMPILED(RawInstructions* active_instructions_); | 1096   NOT_IN_PRECOMPILED(RawInstructions* active_instructions_); | 
| 1144   NOT_IN_PRECOMPILED(RawArray* deopt_info_array_); | 1097   NOT_IN_PRECOMPILED(RawArray* deopt_info_array_); | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 1168   // Alive: If true, the embedded object pointers will be visited during GC. | 1121   // Alive: If true, the embedded object pointers will be visited during GC. | 
| 1169   int32_t state_bits_; | 1122   int32_t state_bits_; | 
| 1170 | 1123 | 
| 1171   // Variable length data follows here. | 1124   // Variable length data follows here. | 
| 1172   int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); } | 1125   int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); } | 
| 1173   const int32_t* data() const { OPEN_ARRAY_START(int32_t, int32_t); } | 1126   const int32_t* data() const { OPEN_ARRAY_START(int32_t, int32_t); } | 
| 1174 | 1127 | 
| 1175   static bool ContainsPC(RawObject* raw_obj, uword pc); | 1128   static bool ContainsPC(RawObject* raw_obj, uword pc); | 
| 1176 | 1129 | 
| 1177   friend class Function; | 1130   friend class Function; | 
| 1178   template<bool> friend class MarkingVisitorBase; | 1131   template <bool> | 
|  | 1132   friend class MarkingVisitorBase; | 
| 1179   friend class SkippedCodeFunctions; | 1133   friend class SkippedCodeFunctions; | 
| 1180   friend class StackFrame; | 1134   friend class StackFrame; | 
| 1181   friend class Profiler; | 1135   friend class Profiler; | 
| 1182   friend class FunctionDeserializationCluster; | 1136   friend class FunctionDeserializationCluster; | 
| 1183 }; | 1137 }; | 
| 1184 | 1138 | 
| 1185 | 1139 | 
| 1186 class RawObjectPool : public RawObject { | 1140 class RawObjectPool : public RawObject { | 
| 1187   RAW_HEAP_OBJECT_IMPLEMENTATION(ObjectPool); | 1141   RAW_HEAP_OBJECT_IMPLEMENTATION(ObjectPool); | 
| 1188 | 1142 | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 1214 | 1168 | 
| 1215   // Private helper function used while visiting stack frames. The | 1169   // Private helper function used while visiting stack frames. The | 
| 1216   // code which iterates over dart frames is also called during GC and | 1170   // code which iterates over dart frames is also called during GC and | 
| 1217   // is not allowed to create handles. | 1171   // is not allowed to create handles. | 
| 1218   static bool ContainsPC(RawInstructions* raw_instr, uword pc); | 1172   static bool ContainsPC(RawInstructions* raw_instr, uword pc); | 
| 1219 | 1173 | 
| 1220   friend class RawCode; | 1174   friend class RawCode; | 
| 1221   friend class RawFunction; | 1175   friend class RawFunction; | 
| 1222   friend class Code; | 1176   friend class Code; | 
| 1223   friend class StackFrame; | 1177   friend class StackFrame; | 
| 1224   template<bool> friend class MarkingVisitorBase; | 1178   template <bool> | 
|  | 1179   friend class MarkingVisitorBase; | 
| 1225   friend class SkippedCodeFunctions; | 1180   friend class SkippedCodeFunctions; | 
| 1226   friend class Function; | 1181   friend class Function; | 
| 1227   friend class InstructionsReader; | 1182   friend class InstructionsReader; | 
| 1228   friend class InstructionsWriter; | 1183   friend class InstructionsWriter; | 
| 1229 }; | 1184 }; | 
| 1230 | 1185 | 
| 1231 | 1186 | 
| 1232 class RawPcDescriptors : public RawObject { | 1187 class RawPcDescriptors : public RawObject { | 
| 1233  public: | 1188  public: | 
| 1234   enum Kind { | 1189   enum Kind { | 
| 1235     kDeopt           = 1,  // Deoptimization continuation point. | 1190     kDeopt = 1,                            // Deoptimization continuation point. | 
| 1236     kIcCall          = kDeopt << 1,  // IC call. | 1191     kIcCall = kDeopt << 1,                 // IC call. | 
| 1237     kUnoptStaticCall = kIcCall << 1,  // Call to a known target via stub. | 1192     kUnoptStaticCall = kIcCall << 1,       // Call to a known target via stub. | 
| 1238     kRuntimeCall     = kUnoptStaticCall << 1,  // Runtime call. | 1193     kRuntimeCall = kUnoptStaticCall << 1,  // Runtime call. | 
| 1239     kOsrEntry        = kRuntimeCall << 1,  // OSR entry point in unopt. code. | 1194     kOsrEntry = kRuntimeCall << 1,         // OSR entry point in unopt. code. | 
| 1240     kOther           = kOsrEntry << 1, | 1195     kOther = kOsrEntry << 1, | 
| 1241     kLastKind        = kOther, | 1196     kLastKind = kOther, | 
| 1242     kAnyKind         = -1 | 1197     kAnyKind = -1 | 
| 1243   }; | 1198   }; | 
| 1244 | 1199 | 
| 1245   class MergedKindTry { | 1200   class MergedKindTry { | 
| 1246    public: | 1201    public: | 
| 1247     // Most of the time try_index will be small and merged field will fit into | 1202     // Most of the time try_index will be small and merged field will fit into | 
| 1248     // one byte. | 1203     // one byte. | 
| 1249     static intptr_t Encode(intptr_t kind, intptr_t try_index) { | 1204     static intptr_t Encode(intptr_t kind, intptr_t try_index) { | 
| 1250       intptr_t kind_shift = Utils::ShiftForPowerOfTwo(kind); | 1205       intptr_t kind_shift = Utils::ShiftForPowerOfTwo(kind); | 
| 1251       ASSERT(Utils::IsUint(kKindShiftSize, kind_shift)); | 1206       ASSERT(Utils::IsUint(kKindShiftSize, kind_shift)); | 
| 1252       ASSERT(Utils::IsInt(kTryIndexSize, try_index)); | 1207       ASSERT(Utils::IsInt(kTryIndexSize, try_index)); | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1308 // | 1263 // | 
| 1309 // The bit map representation is optimized for dense and small bit maps, without | 1264 // The bit map representation is optimized for dense and small bit maps, without | 
| 1310 // any upper bound. | 1265 // any upper bound. | 
| 1311 class RawStackmap : public RawObject { | 1266 class RawStackmap : public RawObject { | 
| 1312   RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); | 1267   RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); | 
| 1313 | 1268 | 
| 1314   // Regarding changing this to a bitfield: ARM64 requires register_bit_count_ | 1269   // Regarding changing this to a bitfield: ARM64 requires register_bit_count_ | 
| 1315   // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or | 1270   // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or | 
| 1316   // as large as ~33 million entries. If that is sufficient, then these two | 1271   // as large as ~33 million entries. If that is sufficient, then these two | 
| 1317   // fields can be merged into a BitField. | 1272   // fields can be merged into a BitField. | 
| 1318   int32_t length_;  // Length of payload, in bits. | 1273   int32_t length_;               // Length of payload, in bits. | 
| 1319   int32_t slow_path_bit_count_;  // Slow path live values, included in length_. | 1274   int32_t slow_path_bit_count_;  // Slow path live values, included in length_. | 
| 1320 | 1275 | 
| 1321   // Offset from code entry point corresponding to this stack map | 1276   // Offset from code entry point corresponding to this stack map | 
| 1322   // representation. | 1277   // representation. | 
| 1323   uint32_t pc_offset_; | 1278   uint32_t pc_offset_; | 
| 1324 | 1279 | 
| 1325   // Variable length data follows here (bitmap of the stack layout). | 1280   // Variable length data follows here (bitmap of the stack layout). | 
| 1326   uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } | 1281   uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } | 
| 1327   const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); } | 1282   const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); } | 
| 1328 }; | 1283 }; | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 1343     kIndexPos = kKindPos + kKindSize, | 1298     kIndexPos = kKindPos + kKindSize, | 
| 1344     // Since there are 24 bits for the stack slot index, Functions can have | 1299     // Since there are 24 bits for the stack slot index, Functions can have | 
| 1345     // only ~16.7 million stack slots. | 1300     // only ~16.7 million stack slots. | 
| 1346     kPayloadSize = sizeof(int32_t) * kBitsPerByte, | 1301     kPayloadSize = sizeof(int32_t) * kBitsPerByte, | 
| 1347     kIndexSize = kPayloadSize - kIndexPos, | 1302     kIndexSize = kPayloadSize - kIndexPos, | 
| 1348     kIndexBias = 1 << (kIndexSize - 1), | 1303     kIndexBias = 1 << (kIndexSize - 1), | 
| 1349     kMaxIndex = (1 << (kIndexSize - 1)) - 1, | 1304     kMaxIndex = (1 << (kIndexSize - 1)) - 1, | 
| 1350   }; | 1305   }; | 
| 1351 | 1306 | 
| 1352   class IndexBits : public BitField<int32_t, int32_t, kIndexPos, kIndexSize> {}; | 1307   class IndexBits : public BitField<int32_t, int32_t, kIndexPos, kIndexSize> {}; | 
| 1353   class KindBits : public BitField<int32_t, int8_t, kKindPos, kKindSize>{}; | 1308   class KindBits : public BitField<int32_t, int8_t, kKindPos, kKindSize> {}; | 
| 1354 | 1309 | 
| 1355   struct VarInfo { | 1310   struct VarInfo { | 
| 1356     int32_t index_kind;  // Bitfield for slot index on stack or in context, | 1311     int32_t index_kind;  // Bitfield for slot index on stack or in context, | 
| 1357                          // and Entry kind of type VarInfoKind. | 1312                          // and Entry kind of type VarInfoKind. | 
| 1358     TokenPosition declaration_pos;   // Token position of declaration. | 1313     TokenPosition declaration_pos;  // Token position of declaration. | 
| 1359     TokenPosition begin_pos;   // Token position of scope start. | 1314     TokenPosition begin_pos;        // Token position of scope start. | 
| 1360     TokenPosition end_pos;     // Token position of scope end. | 1315     TokenPosition end_pos;          // Token position of scope end. | 
| 1361     int16_t scope_id;    // Scope to which the variable belongs. | 1316     int16_t scope_id;               // Scope to which the variable belongs. | 
| 1362 | 1317 | 
| 1363     VarInfoKind kind() const { | 1318     VarInfoKind kind() const { | 
| 1364       return static_cast<VarInfoKind>(KindBits::decode(index_kind)); | 1319       return static_cast<VarInfoKind>(KindBits::decode(index_kind)); | 
| 1365     } | 1320     } | 
| 1366     void set_kind(VarInfoKind kind) { | 1321     void set_kind(VarInfoKind kind) { | 
| 1367       index_kind = KindBits::update(kind, index_kind); | 1322       index_kind = KindBits::update(kind, index_kind); | 
| 1368     } | 1323     } | 
| 1369     int32_t index() const { | 1324     int32_t index() const { return IndexBits::decode(index_kind) - kIndexBias; } | 
| 1370       return IndexBits::decode(index_kind) - kIndexBias; |  | 
| 1371     } |  | 
| 1372     void set_index(int32_t index) { | 1325     void set_index(int32_t index) { | 
| 1373       index_kind = IndexBits::update(index + kIndexBias, index_kind); | 1326       index_kind = IndexBits::update(index + kIndexBias, index_kind); | 
| 1374     } | 1327     } | 
| 1375   }; | 1328   }; | 
| 1376 | 1329 | 
| 1377  private: | 1330  private: | 
| 1378   RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors); | 1331   RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors); | 
| 1379   int32_t num_entries_;  // Number of descriptors. | 1332   int32_t num_entries_;  // Number of descriptors. | 
| 1380 | 1333 | 
| 1381   RawObject** from() { | 1334   RawObject** from() { | 
| 1382     return reinterpret_cast<RawObject**>(&ptr()->names()[0]); | 1335     return reinterpret_cast<RawObject**>(&ptr()->names()[0]); | 
| 1383   } | 1336   } | 
| 1384   RawString** names() { | 1337   RawString** names() { | 
| 1385     // Array of [num_entries_] variable names. | 1338     // Array of [num_entries_] variable names. | 
| 1386     OPEN_ARRAY_START(RawString*, RawString*); | 1339     OPEN_ARRAY_START(RawString*, RawString*); | 
| 1387   } | 1340   } | 
| 1388   RawString** nameAddrAt(intptr_t i) { | 1341   RawString** nameAddrAt(intptr_t i) { return &(ptr()->names()[i]); } | 
| 1389     return &(ptr()->names()[i]); |  | 
| 1390   } |  | 
| 1391 | 1342 | 
| 1392   RawObject** to(intptr_t num_entries) { | 1343   RawObject** to(intptr_t num_entries) { | 
| 1393     return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1)); | 1344     return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1)); | 
| 1394   } | 1345   } | 
| 1395 | 1346 | 
| 1396   // Variable info with [num_entries_] entries. | 1347   // Variable info with [num_entries_] entries. | 
| 1397   VarInfo* data() { | 1348   VarInfo* data() { | 
| 1398     return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_)); | 1349     return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_)); | 
| 1399   } | 1350   } | 
| 1400 | 1351 | 
| 1401   friend class Object; | 1352   friend class Object; | 
| 1402 }; | 1353 }; | 
| 1403 | 1354 | 
| 1404 | 1355 | 
| 1405 class RawExceptionHandlers : public RawObject { | 1356 class RawExceptionHandlers : public RawObject { | 
| 1406  public: | 1357  public: | 
| 1407   // The index into the ExceptionHandlers table corresponds to | 1358   // The index into the ExceptionHandlers table corresponds to | 
| 1408   // the try_index of the handler. | 1359   // the try_index of the handler. | 
| 1409   struct HandlerInfo { | 1360   struct HandlerInfo { | 
| 1410     uint32_t handler_pc_offset;  // PC offset value of handler. | 1361     uint32_t handler_pc_offset;  // PC offset value of handler. | 
| 1411     int16_t outer_try_index;   // Try block index of enclosing try block. | 1362     int16_t outer_try_index;     // Try block index of enclosing try block. | 
| 1412     int8_t needs_stacktrace;   // True if a stacktrace is needed. | 1363     int8_t needs_stacktrace;     // True if a stacktrace is needed. | 
| 1413     int8_t has_catch_all;      // Catches all exceptions. | 1364     int8_t has_catch_all;        // Catches all exceptions. | 
| 1414   }; | 1365   }; | 
| 1415 | 1366 | 
| 1416  private: | 1367  private: | 
| 1417   RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); | 1368   RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); | 
| 1418 | 1369 | 
| 1419   // Number of exception handler entries. | 1370   // Number of exception handler entries. | 
| 1420   int32_t num_entries_; | 1371   int32_t num_entries_; | 
| 1421 | 1372 | 
| 1422   // Array with [num_entries_] entries. Each entry is an array of all handled | 1373   // Array with [num_entries_] entries. Each entry is an array of all handled | 
| 1423   // exception types. | 1374   // exception types. | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 1434 class RawContext : public RawObject { | 1385 class RawContext : public RawObject { | 
| 1435   RAW_HEAP_OBJECT_IMPLEMENTATION(Context); | 1386   RAW_HEAP_OBJECT_IMPLEMENTATION(Context); | 
| 1436 | 1387 | 
| 1437   int32_t num_variables_; | 1388   int32_t num_variables_; | 
| 1438 | 1389 | 
| 1439   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } | 1390   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } | 
| 1440   RawContext* parent_; | 1391   RawContext* parent_; | 
| 1441 | 1392 | 
| 1442   // Variable length data follows here. | 1393   // Variable length data follows here. | 
| 1443   RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); } | 1394   RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); } | 
| 1444   RawObject* const* data() const { | 1395   RawObject* const* data() const { OPEN_ARRAY_START(RawObject*, RawObject*); } | 
| 1445       OPEN_ARRAY_START(RawObject*, RawObject*); |  | 
| 1446   } |  | 
| 1447   RawObject** to(intptr_t num_vars) { | 1396   RawObject** to(intptr_t num_vars) { | 
| 1448     return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]); | 1397     return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]); | 
| 1449   } | 1398   } | 
| 1450 | 1399 | 
| 1451   friend class SnapshotReader; | 1400   friend class SnapshotReader; | 
| 1452 }; | 1401 }; | 
| 1453 | 1402 | 
| 1454 | 1403 | 
| 1455 class RawContextScope : public RawObject { | 1404 class RawContextScope : public RawObject { | 
| 1456   RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope); | 1405   RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope); | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1492   } | 1441   } | 
| 1493 | 1442 | 
| 1494   friend class Object; | 1443   friend class Object; | 
| 1495   friend class RawClosureData; | 1444   friend class RawClosureData; | 
| 1496   friend class SnapshotReader; | 1445   friend class SnapshotReader; | 
| 1497 }; | 1446 }; | 
| 1498 | 1447 | 
| 1499 | 1448 | 
| 1500 class RawSingleTargetCache : public RawObject { | 1449 class RawSingleTargetCache : public RawObject { | 
| 1501   RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache); | 1450   RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache); | 
| 1502   RawObject** from() { | 1451   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->target_); } | 
| 1503     return reinterpret_cast<RawObject**>(&ptr()->target_); |  | 
| 1504   } |  | 
| 1505   RawCode* target_; | 1452   RawCode* target_; | 
| 1506   RawObject** to() { | 1453   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->target_); } | 
| 1507     return reinterpret_cast<RawObject**>(&ptr()->target_); |  | 
| 1508   } |  | 
| 1509   uword entry_point_; | 1454   uword entry_point_; | 
| 1510   classid_t lower_limit_; | 1455   classid_t lower_limit_; | 
| 1511   classid_t upper_limit_; | 1456   classid_t upper_limit_; | 
| 1512 }; | 1457 }; | 
| 1513 | 1458 | 
| 1514 | 1459 | 
| 1515 class RawUnlinkedCall : public RawObject { | 1460 class RawUnlinkedCall : public RawObject { | 
| 1516   RAW_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall); | 1461   RAW_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall); | 
| 1517   RawObject** from() { | 1462   RawObject** from() { | 
| 1518     return reinterpret_cast<RawObject**>(&ptr()->target_name_); | 1463     return reinterpret_cast<RawObject**>(&ptr()->target_name_); | 
| 1519   } | 1464   } | 
| 1520   RawString* target_name_; | 1465   RawString* target_name_; | 
| 1521   RawArray* args_descriptor_; | 1466   RawArray* args_descriptor_; | 
| 1522   RawObject** to() { | 1467   RawObject** to() { | 
| 1523     return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); | 1468     return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); | 
| 1524   } | 1469   } | 
| 1525 }; | 1470 }; | 
| 1526 | 1471 | 
| 1527 | 1472 | 
| 1528 class RawICData : public RawObject { | 1473 class RawICData : public RawObject { | 
| 1529   RAW_HEAP_OBJECT_IMPLEMENTATION(ICData); | 1474   RAW_HEAP_OBJECT_IMPLEMENTATION(ICData); | 
| 1530 | 1475 | 
| 1531   RawObject** from() { | 1476   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->ic_data_); } | 
| 1532     return reinterpret_cast<RawObject**>(&ptr()->ic_data_); | 1477   RawArray* ic_data_;          // Contains class-ids, target and count. | 
| 1533   } | 1478   RawString* target_name_;     // Name of target function. | 
| 1534   RawArray* ic_data_;  // Contains class-ids, target and count. |  | 
| 1535   RawString* target_name_;  // Name of target function. |  | 
| 1536   RawArray* args_descriptor_;  // Arguments descriptor. | 1479   RawArray* args_descriptor_;  // Arguments descriptor. | 
| 1537   RawObject* owner_;  // Parent/calling function or original IC of cloned IC. | 1480   RawObject* owner_;  // Parent/calling function or original IC of cloned IC. | 
| 1538   RawObject** to() { | 1481   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->owner_); } | 
| 1539     return reinterpret_cast<RawObject**>(&ptr()->owner_); |  | 
| 1540   } |  | 
| 1541   RawObject** to_snapshot(Snapshot::Kind kind) { | 1482   RawObject** to_snapshot(Snapshot::Kind kind) { | 
| 1542     switch (kind) { | 1483     switch (kind) { | 
| 1543       case Snapshot::kAppNoJIT: | 1484       case Snapshot::kAppNoJIT: | 
| 1544         return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); | 1485         return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); | 
| 1545       case Snapshot::kCore: | 1486       case Snapshot::kCore: | 
| 1546       case Snapshot::kScript: | 1487       case Snapshot::kScript: | 
| 1547       case Snapshot::kAppWithJIT: | 1488       case Snapshot::kAppWithJIT: | 
| 1548         return to(); | 1489         return to(); | 
| 1549       case Snapshot::kMessage: | 1490       case Snapshot::kMessage: | 
| 1550       case Snapshot::kNone: | 1491       case Snapshot::kNone: | 
| 1551       case Snapshot::kInvalid: | 1492       case Snapshot::kInvalid: | 
| 1552         break; | 1493         break; | 
| 1553     } | 1494     } | 
| 1554     UNREACHABLE(); | 1495     UNREACHABLE(); | 
| 1555     return NULL; | 1496     return NULL; | 
| 1556   } | 1497   } | 
| 1557   NOT_IN_PRECOMPILED(int32_t deopt_id_); | 1498   NOT_IN_PRECOMPILED(int32_t deopt_id_); | 
| 1558   uint32_t state_bits_;  // Number of arguments tested in IC, deopt reasons. | 1499   uint32_t state_bits_;  // Number of arguments tested in IC, deopt reasons. | 
| 1559 #if defined(TAG_IC_DATA) | 1500 #if defined(TAG_IC_DATA) | 
| 1560   intptr_t tag_;  // Debugging, verifying that the icdata is assigned to the | 1501   intptr_t tag_;  // Debugging, verifying that the icdata is assigned to the | 
| 1561                   // same instruction again. Store -1 or Instruction::Tag. | 1502                   // same instruction again. Store -1 or Instruction::Tag. | 
| 1562 #endif | 1503 #endif | 
| 1563 }; | 1504 }; | 
| 1564 | 1505 | 
| 1565 | 1506 | 
| 1566 class RawMegamorphicCache : public RawObject { | 1507 class RawMegamorphicCache : public RawObject { | 
| 1567   RAW_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache); | 1508   RAW_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache); | 
| 1568 | 1509 | 
| 1569   RawObject** from() { | 1510   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->buckets_); } | 
| 1570     return reinterpret_cast<RawObject**>(&ptr()->buckets_); |  | 
| 1571   } |  | 
| 1572   RawArray* buckets_; | 1511   RawArray* buckets_; | 
| 1573   RawSmi* mask_; | 1512   RawSmi* mask_; | 
| 1574   RawString* target_name_;     // Name of target function. | 1513   RawString* target_name_;     // Name of target function. | 
| 1575   RawArray* args_descriptor_;  // Arguments descriptor. | 1514   RawArray* args_descriptor_;  // Arguments descriptor. | 
| 1576   RawObject** to() { | 1515   RawObject** to() { | 
| 1577     return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); | 1516     return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); | 
| 1578   } | 1517   } | 
| 1579 | 1518 | 
| 1580   int32_t filled_entry_count_; | 1519   int32_t filled_entry_count_; | 
| 1581 }; | 1520 }; | 
| 1582 | 1521 | 
| 1583 | 1522 | 
| 1584 class RawSubtypeTestCache : public RawObject { | 1523 class RawSubtypeTestCache : public RawObject { | 
| 1585   RAW_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache); | 1524   RAW_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache); | 
| 1586   RawArray* cache_; | 1525   RawArray* cache_; | 
| 1587 }; | 1526 }; | 
| 1588 | 1527 | 
| 1589 | 1528 | 
| 1590 class RawError : public RawObject { | 1529 class RawError : public RawObject { | 
| 1591   RAW_HEAP_OBJECT_IMPLEMENTATION(Error); | 1530   RAW_HEAP_OBJECT_IMPLEMENTATION(Error); | 
| 1592 }; | 1531 }; | 
| 1593 | 1532 | 
| 1594 | 1533 | 
| 1595 class RawApiError : public RawError { | 1534 class RawApiError : public RawError { | 
| 1596   RAW_HEAP_OBJECT_IMPLEMENTATION(ApiError); | 1535   RAW_HEAP_OBJECT_IMPLEMENTATION(ApiError); | 
| 1597 | 1536 | 
| 1598   RawObject** from() { | 1537   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->message_); } | 
| 1599     return reinterpret_cast<RawObject**>(&ptr()->message_); |  | 
| 1600   } |  | 
| 1601   RawString* message_; | 1538   RawString* message_; | 
| 1602   RawObject** to() { | 1539   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->message_); } | 
| 1603     return reinterpret_cast<RawObject**>(&ptr()->message_); |  | 
| 1604   } |  | 
| 1605 }; | 1540 }; | 
| 1606 | 1541 | 
| 1607 | 1542 | 
| 1608 class RawLanguageError : public RawError { | 1543 class RawLanguageError : public RawError { | 
| 1609   RAW_HEAP_OBJECT_IMPLEMENTATION(LanguageError); | 1544   RAW_HEAP_OBJECT_IMPLEMENTATION(LanguageError); | 
| 1610 | 1545 | 
| 1611   RawObject** from() { | 1546   RawObject** from() { | 
| 1612     return reinterpret_cast<RawObject**>(&ptr()->previous_error_); | 1547     return reinterpret_cast<RawObject**>(&ptr()->previous_error_); | 
| 1613   } | 1548   } | 
| 1614   RawError* previous_error_;  // May be null. | 1549   RawError* previous_error_;  // May be null. | 
| 1615   RawScript* script_; | 1550   RawScript* script_; | 
| 1616   RawString* message_; | 1551   RawString* message_; | 
| 1617   RawString* formatted_message_;  // Incl. previous error's formatted message. | 1552   RawString* formatted_message_;  // Incl. previous error's formatted message. | 
| 1618   RawObject** to() { | 1553   RawObject** to() { | 
| 1619     return reinterpret_cast<RawObject**>(&ptr()->formatted_message_); | 1554     return reinterpret_cast<RawObject**>(&ptr()->formatted_message_); | 
| 1620   } | 1555   } | 
| 1621   TokenPosition token_pos_;  // Source position in script_. | 1556   TokenPosition token_pos_;  // Source position in script_. | 
| 1622   bool report_after_token_;  // Report message at or after the token. | 1557   bool report_after_token_;  // Report message at or after the token. | 
| 1623   int8_t kind_;  // Of type Report::Kind. | 1558   int8_t kind_;              // Of type Report::Kind. | 
| 1624 }; | 1559 }; | 
| 1625 | 1560 | 
| 1626 | 1561 | 
| 1627 class RawUnhandledException : public RawError { | 1562 class RawUnhandledException : public RawError { | 
| 1628   RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException); | 1563   RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException); | 
| 1629 | 1564 | 
| 1630   RawObject** from() { | 1565   RawObject** from() { | 
| 1631     return reinterpret_cast<RawObject**>(&ptr()->exception_); | 1566     return reinterpret_cast<RawObject**>(&ptr()->exception_); | 
| 1632   } | 1567   } | 
| 1633   RawInstance* exception_; | 1568   RawInstance* exception_; | 
| 1634   RawInstance* stacktrace_; | 1569   RawInstance* stacktrace_; | 
| 1635   RawObject** to() { | 1570   RawObject** to() { | 
| 1636     return reinterpret_cast<RawObject**>(&ptr()->stacktrace_); | 1571     return reinterpret_cast<RawObject**>(&ptr()->stacktrace_); | 
| 1637   } | 1572   } | 
| 1638 }; | 1573 }; | 
| 1639 | 1574 | 
| 1640 | 1575 | 
| 1641 class RawUnwindError : public RawError { | 1576 class RawUnwindError : public RawError { | 
| 1642   RAW_HEAP_OBJECT_IMPLEMENTATION(UnwindError); | 1577   RAW_HEAP_OBJECT_IMPLEMENTATION(UnwindError); | 
| 1643 | 1578 | 
| 1644   RawObject** from() { | 1579   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->message_); } | 
| 1645     return reinterpret_cast<RawObject**>(&ptr()->message_); |  | 
| 1646   } |  | 
| 1647   RawString* message_; | 1580   RawString* message_; | 
| 1648   RawObject** to() { | 1581   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->message_); } | 
| 1649     return reinterpret_cast<RawObject**>(&ptr()->message_); |  | 
| 1650   } |  | 
| 1651   bool is_user_initiated_; | 1582   bool is_user_initiated_; | 
| 1652   bool is_vm_restart_; | 1583   bool is_vm_restart_; | 
| 1653 }; | 1584 }; | 
| 1654 | 1585 | 
| 1655 | 1586 | 
| 1656 class RawInstance : public RawObject { | 1587 class RawInstance : public RawObject { | 
| 1657   RAW_HEAP_OBJECT_IMPLEMENTATION(Instance); | 1588   RAW_HEAP_OBJECT_IMPLEMENTATION(Instance); | 
| 1658 }; | 1589 }; | 
| 1659 | 1590 | 
| 1660 | 1591 | 
| 1661 class RawLibraryPrefix : public RawInstance { | 1592 class RawLibraryPrefix : public RawInstance { | 
| 1662   RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix); | 1593   RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix); | 
| 1663 | 1594 | 
| 1664   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 1595   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 
| 1665   RawString* name_;               // Library prefix name. | 1596   RawString* name_;           // Library prefix name. | 
| 1666   RawLibrary* importer_;          // Library which declares this prefix. | 1597   RawLibrary* importer_;      // Library which declares this prefix. | 
| 1667   RawArray* imports_;             // Libraries imported with this prefix. | 1598   RawArray* imports_;         // Libraries imported with this prefix. | 
| 1668   RawArray* dependent_code_;      // Code that refers to deferred, unloaded | 1599   RawArray* dependent_code_;  // Code that refers to deferred, unloaded | 
| 1669                                   // library prefix. | 1600                               // library prefix. | 
| 1670   RawObject** to() { | 1601   RawObject** to() { | 
| 1671     return reinterpret_cast<RawObject**>(&ptr()->dependent_code_); | 1602     return reinterpret_cast<RawObject**>(&ptr()->dependent_code_); | 
| 1672   } | 1603   } | 
| 1673   RawObject** to_snapshot(Snapshot::Kind kind) { | 1604   RawObject** to_snapshot(Snapshot::Kind kind) { | 
| 1674     switch (kind) { | 1605     switch (kind) { | 
| 1675       case Snapshot::kCore: | 1606       case Snapshot::kCore: | 
| 1676       case Snapshot::kScript: | 1607       case Snapshot::kScript: | 
| 1677       case Snapshot::kAppWithJIT: | 1608       case Snapshot::kAppWithJIT: | 
| 1678         return reinterpret_cast<RawObject**>(&ptr()->imports_); | 1609         return reinterpret_cast<RawObject**>(&ptr()->imports_); | 
| 1679       case Snapshot::kAppNoJIT: | 1610       case Snapshot::kAppNoJIT: | 
| 1680         return reinterpret_cast<RawObject**>(&ptr()->importer_); | 1611         return reinterpret_cast<RawObject**>(&ptr()->importer_); | 
| 1681       case Snapshot::kMessage: | 1612       case Snapshot::kMessage: | 
| 1682       case Snapshot::kNone: | 1613       case Snapshot::kNone: | 
| 1683       case Snapshot::kInvalid: | 1614       case Snapshot::kInvalid: | 
| 1684         break; | 1615         break; | 
| 1685     } | 1616     } | 
| 1686     UNREACHABLE(); | 1617     UNREACHABLE(); | 
| 1687     return NULL; | 1618     return NULL; | 
| 1688   } | 1619   } | 
| 1689   uint16_t num_imports_;          // Number of library entries in libraries_. | 1620   uint16_t num_imports_;  // Number of library entries in libraries_. | 
| 1690   bool is_deferred_load_; | 1621   bool is_deferred_load_; | 
| 1691   bool is_loaded_; | 1622   bool is_loaded_; | 
| 1692 }; | 1623 }; | 
| 1693 | 1624 | 
| 1694 | 1625 | 
| 1695 class RawAbstractType : public RawInstance { | 1626 class RawAbstractType : public RawInstance { | 
| 1696  protected: | 1627  protected: | 
| 1697   enum TypeState { | 1628   enum TypeState { | 
| 1698     kAllocated,  // Initial state. | 1629     kAllocated,                // Initial state. | 
| 1699     kResolved,  // Type class and type arguments resolved. | 1630     kResolved,                 // Type class and type arguments resolved. | 
| 1700     kBeingFinalized,  // In the process of being finalized. | 1631     kBeingFinalized,           // In the process of being finalized. | 
| 1701     kFinalizedInstantiated,  // Instantiated type ready for use. | 1632     kFinalizedInstantiated,    // Instantiated type ready for use. | 
| 1702     kFinalizedUninstantiated,  // Uninstantiated type ready for use. | 1633     kFinalizedUninstantiated,  // Uninstantiated type ready for use. | 
| 1703   }; | 1634   }; | 
| 1704 | 1635 | 
| 1705  private: | 1636  private: | 
| 1706   RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractType); | 1637   RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractType); | 
| 1707 | 1638 | 
| 1708   friend class ObjectStore; | 1639   friend class ObjectStore; | 
| 1709 }; | 1640 }; | 
| 1710 | 1641 | 
| 1711 | 1642 | 
| 1712 class RawType : public RawAbstractType { | 1643 class RawType : public RawAbstractType { | 
| 1713  private: | 1644  private: | 
| 1714   RAW_HEAP_OBJECT_IMPLEMENTATION(Type); | 1645   RAW_HEAP_OBJECT_IMPLEMENTATION(Type); | 
| 1715 | 1646 | 
| 1716   RawObject** from() { | 1647   RawObject** from() { | 
| 1717     return reinterpret_cast<RawObject**>(&ptr()->type_class_id_); | 1648     return reinterpret_cast<RawObject**>(&ptr()->type_class_id_); | 
| 1718   } | 1649   } | 
| 1719   // Either the id of the resolved class as a Smi or an UnresolvedClass. | 1650   // Either the id of the resolved class as a Smi or an UnresolvedClass. | 
| 1720   RawObject* type_class_id_; | 1651   RawObject* type_class_id_; | 
| 1721   RawTypeArguments* arguments_; | 1652   RawTypeArguments* arguments_; | 
| 1722   RawSmi* hash_; | 1653   RawSmi* hash_; | 
| 1723   // This type object represents a function type if its signature field is a | 1654   // This type object represents a function type if its signature field is a | 
| 1724   // non-null function object. | 1655   // non-null function object. | 
| 1725   // If this type is malformed or malbounded, the signature field gets | 1656   // If this type is malformed or malbounded, the signature field gets | 
| 1726   // overwritten by the error object in order to save space. If the type is a | 1657   // overwritten by the error object in order to save space. If the type is a | 
| 1727   // function type, its signature is lost, but the message in the error object | 1658   // function type, its signature is lost, but the message in the error object | 
| 1728   // can describe the issue without needing the signature. | 1659   // can describe the issue without needing the signature. | 
| 1729   union { | 1660   union { | 
| 1730     RawFunction* signature_;  // If not null, this type is a function type. | 1661     RawFunction* signature_;   // If not null, this type is a function type. | 
| 1731     RawLanguageError* error_;  // If not null, type is malformed or malbounded. | 1662     RawLanguageError* error_;  // If not null, type is malformed or malbounded. | 
| 1732   } sig_or_err_; | 1663   } sig_or_err_; | 
| 1733   RawObject** to() { | 1664   RawObject** to() { | 
| 1734     return reinterpret_cast<RawObject**>(&ptr()->sig_or_err_.error_); | 1665     return reinterpret_cast<RawObject**>(&ptr()->sig_or_err_.error_); | 
| 1735   } | 1666   } | 
| 1736   TokenPosition token_pos_; | 1667   TokenPosition token_pos_; | 
| 1737   int8_t type_state_; | 1668   int8_t type_state_; | 
| 1738 | 1669 | 
| 1739   friend class CidRewriteVisitor; | 1670   friend class CidRewriteVisitor; | 
| 1740 }; | 1671 }; | 
| 1741 | 1672 | 
| 1742 | 1673 | 
| 1743 class RawTypeRef : public RawAbstractType { | 1674 class RawTypeRef : public RawAbstractType { | 
| 1744  private: | 1675  private: | 
| 1745   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef); | 1676   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef); | 
| 1746 | 1677 | 
| 1747   RawObject** from() { | 1678   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); } | 
| 1748     return reinterpret_cast<RawObject**>(&ptr()->type_); |  | 
| 1749   } |  | 
| 1750   RawAbstractType* type_;  // The referenced type. | 1679   RawAbstractType* type_;  // The referenced type. | 
| 1751   RawObject** to() { | 1680   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->type_); } | 
| 1752     return reinterpret_cast<RawObject**>(&ptr()->type_); |  | 
| 1753   } |  | 
| 1754 }; | 1681 }; | 
| 1755 | 1682 | 
| 1756 | 1683 | 
| 1757 class RawTypeParameter : public RawAbstractType { | 1684 class RawTypeParameter : public RawAbstractType { | 
| 1758  private: | 1685  private: | 
| 1759   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter); | 1686   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter); | 
| 1760 | 1687 | 
| 1761   RawObject** from() { | 1688   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } | 
| 1762     return reinterpret_cast<RawObject**>(&ptr()->name_); |  | 
| 1763   } |  | 
| 1764   RawString* name_; | 1689   RawString* name_; | 
| 1765   RawSmi* hash_; | 1690   RawSmi* hash_; | 
| 1766   RawAbstractType* bound_;  // ObjectType if no explicit bound specified. | 1691   RawAbstractType* bound_;  // ObjectType if no explicit bound specified. | 
| 1767   RawFunction* parameterized_function_; | 1692   RawFunction* parameterized_function_; | 
| 1768   RawObject** to() { | 1693   RawObject** to() { | 
| 1769     return reinterpret_cast<RawObject**>(&ptr()->parameterized_function_); | 1694     return reinterpret_cast<RawObject**>(&ptr()->parameterized_function_); | 
| 1770   } | 1695   } | 
| 1771   classid_t parameterized_class_id_; | 1696   classid_t parameterized_class_id_; | 
| 1772   TokenPosition token_pos_; | 1697   TokenPosition token_pos_; | 
| 1773   int16_t index_; | 1698   int16_t index_; | 
| 1774   uint8_t parent_level_;  // Max 255 levels of nested generic functions is OK. | 1699   uint8_t parent_level_;  // Max 255 levels of nested generic functions is OK. | 
| 1775   int8_t type_state_; | 1700   int8_t type_state_; | 
| 1776 | 1701 | 
| 1777   friend class CidRewriteVisitor; | 1702   friend class CidRewriteVisitor; | 
| 1778 }; | 1703 }; | 
| 1779 | 1704 | 
| 1780 | 1705 | 
| 1781 class RawBoundedType : public RawAbstractType { | 1706 class RawBoundedType : public RawAbstractType { | 
| 1782  private: | 1707  private: | 
| 1783   RAW_HEAP_OBJECT_IMPLEMENTATION(BoundedType); | 1708   RAW_HEAP_OBJECT_IMPLEMENTATION(BoundedType); | 
| 1784 | 1709 | 
| 1785   RawObject** from() { | 1710   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); } | 
| 1786     return reinterpret_cast<RawObject**>(&ptr()->type_); |  | 
| 1787   } |  | 
| 1788   RawAbstractType* type_; | 1711   RawAbstractType* type_; | 
| 1789   RawAbstractType* bound_; | 1712   RawAbstractType* bound_; | 
| 1790   RawSmi* hash_; | 1713   RawSmi* hash_; | 
| 1791   RawTypeParameter* type_parameter_;  // For more detailed error reporting. | 1714   RawTypeParameter* type_parameter_;  // For more detailed error reporting. | 
| 1792   RawObject** to() { | 1715   RawObject** to() { | 
| 1793     return reinterpret_cast<RawObject**>(&ptr()->type_parameter_); | 1716     return reinterpret_cast<RawObject**>(&ptr()->type_parameter_); | 
| 1794   } | 1717   } | 
| 1795 }; | 1718 }; | 
| 1796 | 1719 | 
| 1797 | 1720 | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 1816   RAW_HEAP_OBJECT_IMPLEMENTATION(Closure); | 1739   RAW_HEAP_OBJECT_IMPLEMENTATION(Closure); | 
| 1817 | 1740 | 
| 1818   RawObject** from() { | 1741   RawObject** from() { | 
| 1819     return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); | 1742     return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); | 
| 1820   } | 1743   } | 
| 1821 | 1744 | 
| 1822   RawTypeArguments* type_arguments_; | 1745   RawTypeArguments* type_arguments_; | 
| 1823   RawFunction* function_; | 1746   RawFunction* function_; | 
| 1824   RawContext* context_; | 1747   RawContext* context_; | 
| 1825 | 1748 | 
| 1826   RawObject** to() { | 1749   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->context_); } | 
| 1827     return reinterpret_cast<RawObject**>(&ptr()->context_); |  | 
| 1828   } |  | 
| 1829 }; | 1750 }; | 
| 1830 | 1751 | 
| 1831 | 1752 | 
| 1832 class RawNumber : public RawInstance { | 1753 class RawNumber : public RawInstance { | 
| 1833   RAW_OBJECT_IMPLEMENTATION(Number); | 1754   RAW_OBJECT_IMPLEMENTATION(Number); | 
| 1834 }; | 1755 }; | 
| 1835 | 1756 | 
| 1836 | 1757 | 
| 1837 class RawInteger : public RawNumber { | 1758 class RawInteger : public RawNumber { | 
| 1838   RAW_OBJECT_IMPLEMENTATION(Integer); | 1759   RAW_OBJECT_IMPLEMENTATION(Integer); | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1908 | 1829 | 
| 1909   // Variable length data follows here. | 1830   // Variable length data follows here. | 
| 1910   uint16_t* data() { OPEN_ARRAY_START(uint16_t, uint16_t); } | 1831   uint16_t* data() { OPEN_ARRAY_START(uint16_t, uint16_t); } | 
| 1911   const uint16_t* data() const { OPEN_ARRAY_START(uint16_t, uint16_t); } | 1832   const uint16_t* data() const { OPEN_ARRAY_START(uint16_t, uint16_t); } | 
| 1912 | 1833 | 
| 1913   friend class SnapshotReader; | 1834   friend class SnapshotReader; | 
| 1914   friend class RODataSerializationCluster; | 1835   friend class RODataSerializationCluster; | 
| 1915 }; | 1836 }; | 
| 1916 | 1837 | 
| 1917 | 1838 | 
| 1918 template<typename T> | 1839 template <typename T> | 
| 1919 class ExternalStringData { | 1840 class ExternalStringData { | 
| 1920  public: | 1841  public: | 
| 1921   ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) : | 1842   ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) | 
| 1922       data_(data), peer_(peer), callback_(callback) { | 1843       : data_(data), peer_(peer), callback_(callback) {} | 
| 1923   } |  | 
| 1924   ~ExternalStringData() { | 1844   ~ExternalStringData() { | 
| 1925     if (callback_ != NULL) (*callback_)(peer_); | 1845     if (callback_ != NULL) (*callback_)(peer_); | 
| 1926   } | 1846   } | 
| 1927 | 1847 | 
| 1928   const T* data() { | 1848   const T* data() { return data_; } | 
| 1929     return data_; | 1849   void* peer() { return peer_; } | 
| 1930   } |  | 
| 1931   void* peer() { |  | 
| 1932     return peer_; |  | 
| 1933   } |  | 
| 1934 | 1850 | 
| 1935   static intptr_t data_offset() { | 1851   static intptr_t data_offset() { | 
| 1936     return OFFSET_OF(ExternalStringData<T>, data_); | 1852     return OFFSET_OF(ExternalStringData<T>, data_); | 
| 1937   } | 1853   } | 
| 1938 | 1854 | 
| 1939  private: | 1855  private: | 
| 1940   const T* data_; | 1856   const T* data_; | 
| 1941   void* peer_; | 1857   void* peer_; | 
| 1942   Dart_PeerFinalizer callback_; | 1858   Dart_PeerFinalizer callback_; | 
| 1943 }; | 1859 }; | 
| 1944 | 1860 | 
| 1945 | 1861 | 
| 1946 class RawExternalOneByteString : public RawString { | 1862 class RawExternalOneByteString : public RawString { | 
| 1947   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString); | 1863   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString); | 
|  | 1864 | 
| 1948  public: | 1865  public: | 
| 1949   typedef ExternalStringData<uint8_t> ExternalData; | 1866   typedef ExternalStringData<uint8_t> ExternalData; | 
| 1950 | 1867 | 
| 1951  private: | 1868  private: | 
| 1952   ExternalData* external_data_; | 1869   ExternalData* external_data_; | 
| 1953   friend class Api; | 1870   friend class Api; | 
| 1954 }; | 1871 }; | 
| 1955 | 1872 | 
| 1956 | 1873 | 
| 1957 class RawExternalTwoByteString : public RawString { | 1874 class RawExternalTwoByteString : public RawString { | 
| 1958   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString); | 1875   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString); | 
|  | 1876 | 
| 1959  public: | 1877  public: | 
| 1960   typedef ExternalStringData<uint16_t> ExternalData; | 1878   typedef ExternalStringData<uint16_t> ExternalData; | 
| 1961 | 1879 | 
| 1962  private: | 1880  private: | 
| 1963   ExternalData* external_data_; | 1881   ExternalData* external_data_; | 
| 1964   friend class Api; | 1882   friend class Api; | 
| 1965 }; | 1883 }; | 
| 1966 | 1884 | 
| 1967 | 1885 | 
| 1968 class RawBool : public RawInstance { | 1886 class RawBool : public RawInstance { | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 1990   friend class LinkedHashMapSerializationCluster; | 1908   friend class LinkedHashMapSerializationCluster; | 
| 1991   friend class LinkedHashMapDeserializationCluster; | 1909   friend class LinkedHashMapDeserializationCluster; | 
| 1992   friend class Deserializer; | 1910   friend class Deserializer; | 
| 1993   friend class RawCode; | 1911   friend class RawCode; | 
| 1994   friend class RawImmutableArray; | 1912   friend class RawImmutableArray; | 
| 1995   friend class SnapshotReader; | 1913   friend class SnapshotReader; | 
| 1996   friend class GrowableObjectArray; | 1914   friend class GrowableObjectArray; | 
| 1997   friend class LinkedHashMap; | 1915   friend class LinkedHashMap; | 
| 1998   friend class RawLinkedHashMap; | 1916   friend class RawLinkedHashMap; | 
| 1999   friend class Object; | 1917   friend class Object; | 
| 2000   friend class ICData;  // For high performance access. | 1918   friend class ICData;            // For high performance access. | 
| 2001   friend class SubtypeTestCache;  // For high performance access. | 1919   friend class SubtypeTestCache;  // For high performance access. | 
| 2002 }; | 1920 }; | 
| 2003 | 1921 | 
| 2004 | 1922 | 
| 2005 class RawImmutableArray : public RawArray { | 1923 class RawImmutableArray : public RawArray { | 
| 2006   RAW_HEAP_OBJECT_IMPLEMENTATION(ImmutableArray); | 1924   RAW_HEAP_OBJECT_IMPLEMENTATION(ImmutableArray); | 
| 2007 | 1925 | 
| 2008   friend class SnapshotReader; | 1926   friend class SnapshotReader; | 
| 2009 }; | 1927 }; | 
| 2010 | 1928 | 
| 2011 | 1929 | 
| 2012 class RawGrowableObjectArray : public RawInstance { | 1930 class RawGrowableObjectArray : public RawInstance { | 
| 2013   RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray); | 1931   RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray); | 
| 2014 | 1932 | 
| 2015   RawObject** from() { | 1933   RawObject** from() { | 
| 2016     return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); | 1934     return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); | 
| 2017   } | 1935   } | 
| 2018   RawTypeArguments* type_arguments_; | 1936   RawTypeArguments* type_arguments_; | 
| 2019   RawSmi* length_; | 1937   RawSmi* length_; | 
| 2020   RawArray* data_; | 1938   RawArray* data_; | 
| 2021   RawObject** to() { | 1939   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->data_); } | 
| 2022     return reinterpret_cast<RawObject**>(&ptr()->data_); |  | 
| 2023   } |  | 
| 2024 | 1940 | 
| 2025   friend class SnapshotReader; | 1941   friend class SnapshotReader; | 
| 2026 }; | 1942 }; | 
| 2027 | 1943 | 
| 2028 | 1944 | 
| 2029 class RawLinkedHashMap : public RawInstance { | 1945 class RawLinkedHashMap : public RawInstance { | 
| 2030   RAW_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap); | 1946   RAW_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap); | 
| 2031 | 1947 | 
| 2032   RawObject** from() { | 1948   RawObject** from() { | 
| 2033     return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); | 1949     return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); | 
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2157 | 2073 | 
| 2158 | 2074 | 
| 2159 class RawReceivePort : public RawInstance { | 2075 class RawReceivePort : public RawInstance { | 
| 2160   RAW_HEAP_OBJECT_IMPLEMENTATION(ReceivePort); | 2076   RAW_HEAP_OBJECT_IMPLEMENTATION(ReceivePort); | 
| 2161 | 2077 | 
| 2162   RawObject** from() { | 2078   RawObject** from() { | 
| 2163     return reinterpret_cast<RawObject**>(&ptr()->send_port_); | 2079     return reinterpret_cast<RawObject**>(&ptr()->send_port_); | 
| 2164   } | 2080   } | 
| 2165   RawSendPort* send_port_; | 2081   RawSendPort* send_port_; | 
| 2166   RawInstance* handler_; | 2082   RawInstance* handler_; | 
| 2167   RawObject** to() { | 2083   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->handler_); } | 
| 2168     return reinterpret_cast<RawObject**>(&ptr()->handler_); |  | 
| 2169   } |  | 
| 2170 }; | 2084 }; | 
| 2171 | 2085 | 
| 2172 | 2086 | 
| 2173 // VM type for capturing stacktraces when exceptions are thrown, | 2087 // VM type for capturing stacktraces when exceptions are thrown, | 
| 2174 // Currently we don't have any interface that this object is supposed | 2088 // Currently we don't have any interface that this object is supposed | 
| 2175 // to implement so we just support the 'toString' method which | 2089 // to implement so we just support the 'toString' method which | 
| 2176 // converts the stack trace into a string. | 2090 // converts the stack trace into a string. | 
| 2177 class RawStacktrace : public RawInstance { | 2091 class RawStacktrace : public RawInstance { | 
| 2178   RAW_HEAP_OBJECT_IMPLEMENTATION(Stacktrace); | 2092   RAW_HEAP_OBJECT_IMPLEMENTATION(Stacktrace); | 
| 2179 | 2093 | 
| 2180   RawObject** from() { | 2094   RawObject** from() { | 
| 2181     return reinterpret_cast<RawObject**>(&ptr()->code_array_); | 2095     return reinterpret_cast<RawObject**>(&ptr()->code_array_); | 
| 2182   } | 2096   } | 
| 2183   RawArray* code_array_;  // Code object for each frame in the stack trace. | 2097   RawArray* code_array_;       // Code object for each frame in the stack trace. | 
| 2184   RawArray* pc_offset_array_;  // Offset of PC for each frame. | 2098   RawArray* pc_offset_array_;  // Offset of PC for each frame. | 
| 2185   RawObject** to() { | 2099   RawObject** to() { | 
| 2186     return reinterpret_cast<RawObject**>(&ptr()->pc_offset_array_); | 2100     return reinterpret_cast<RawObject**>(&ptr()->pc_offset_array_); | 
| 2187   } | 2101   } | 
| 2188   // False for pre-allocated stack trace (used in OOM and Stack overflow). | 2102   // False for pre-allocated stack trace (used in OOM and Stack overflow). | 
| 2189   bool expand_inlined_; | 2103   bool expand_inlined_; | 
| 2190 }; | 2104 }; | 
| 2191 | 2105 | 
| 2192 | 2106 | 
| 2193 // VM type for capturing JS regular expressions. | 2107 // VM type for capturing JS regular expressions. | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 2214   // A bitfield with two fields: | 2128   // A bitfield with two fields: | 
| 2215   // type: Uninitialized, simple or complex. | 2129   // type: Uninitialized, simple or complex. | 
| 2216   // flags: Represents global/local, case insensitive, multiline. | 2130   // flags: Represents global/local, case insensitive, multiline. | 
| 2217   int8_t type_flags_; | 2131   int8_t type_flags_; | 
| 2218 }; | 2132 }; | 
| 2219 | 2133 | 
| 2220 | 2134 | 
| 2221 class RawWeakProperty : public RawInstance { | 2135 class RawWeakProperty : public RawInstance { | 
| 2222   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); | 2136   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); | 
| 2223 | 2137 | 
| 2224   RawObject** from() { | 2138   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->key_); } | 
| 2225     return reinterpret_cast<RawObject**>(&ptr()->key_); |  | 
| 2226   } |  | 
| 2227   RawObject* key_; | 2139   RawObject* key_; | 
| 2228   RawObject* value_; | 2140   RawObject* value_; | 
| 2229   RawObject** to() { | 2141   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->value_); } | 
| 2230     return reinterpret_cast<RawObject**>(&ptr()->value_); |  | 
| 2231   } |  | 
| 2232 | 2142 | 
| 2233   // Linked list is chaining all pending weak properties. | 2143   // Linked list is chaining all pending weak properties. | 
| 2234   // Untyped to make it clear that it is not to be visited by GC. | 2144   // Untyped to make it clear that it is not to be visited by GC. | 
| 2235   uword next_; | 2145   uword next_; | 
| 2236 | 2146 | 
| 2237   friend class GCMarker; | 2147   friend class GCMarker; | 
| 2238   template<bool> friend class MarkingVisitorBase; | 2148   template <bool> | 
|  | 2149   friend class MarkingVisitorBase; | 
| 2239   friend class Scavenger; | 2150   friend class Scavenger; | 
| 2240   friend class ScavengerVisitor; | 2151   friend class ScavengerVisitor; | 
| 2241 }; | 2152 }; | 
| 2242 | 2153 | 
| 2243 // MirrorReferences are used by mirrors to hold reflectees that are VM | 2154 // MirrorReferences are used by mirrors to hold reflectees that are VM | 
| 2244 // internal objects, such as libraries, classes, functions or types. | 2155 // internal objects, such as libraries, classes, functions or types. | 
| 2245 class RawMirrorReference : public RawInstance { | 2156 class RawMirrorReference : public RawInstance { | 
| 2246   RAW_HEAP_OBJECT_IMPLEMENTATION(MirrorReference); | 2157   RAW_HEAP_OBJECT_IMPLEMENTATION(MirrorReference); | 
| 2247 | 2158 | 
| 2248   RawObject** from() { | 2159   RawObject** from() { | 
| 2249     return reinterpret_cast<RawObject**>(&ptr()->referent_); | 2160     return reinterpret_cast<RawObject**>(&ptr()->referent_); | 
| 2250   } | 2161   } | 
| 2251   RawObject* referent_; | 2162   RawObject* referent_; | 
| 2252   RawObject** to() { | 2163   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->referent_); } | 
| 2253     return reinterpret_cast<RawObject**>(&ptr()->referent_); |  | 
| 2254   } |  | 
| 2255 }; | 2164 }; | 
| 2256 | 2165 | 
| 2257 | 2166 | 
| 2258 // UserTag are used by the profiler to track Dart script state. | 2167 // UserTag are used by the profiler to track Dart script state. | 
| 2259 class RawUserTag : public RawInstance { | 2168 class RawUserTag : public RawInstance { | 
| 2260   RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag); | 2169   RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag); | 
| 2261 | 2170 | 
| 2262   RawObject** from() { | 2171   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->label_); } | 
| 2263     return reinterpret_cast<RawObject**>(&ptr()->label_); |  | 
| 2264   } |  | 
| 2265 | 2172 | 
| 2266   RawString* label_; | 2173   RawString* label_; | 
| 2267 | 2174 | 
| 2268   RawObject** to() { | 2175   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->label_); } | 
| 2269     return reinterpret_cast<RawObject**>(&ptr()->label_); |  | 
| 2270   } |  | 
| 2271 | 2176 | 
| 2272   // Isolate unique tag. | 2177   // Isolate unique tag. | 
| 2273   uword tag_; | 2178   uword tag_; | 
| 2274 | 2179 | 
| 2275   friend class SnapshotReader; | 2180   friend class SnapshotReader; | 
| 2276   friend class Object; | 2181   friend class Object; | 
| 2277 | 2182 | 
| 2278  public: | 2183  public: | 
| 2279   uword tag() const { return tag_; } | 2184   uword tag() const { return tag_; } | 
| 2280 }; | 2185 }; | 
| 2281 | 2186 | 
| 2282 // Class Id predicates. | 2187 // Class Id predicates. | 
| 2283 | 2188 | 
| 2284 inline bool RawObject::IsErrorClassId(intptr_t index) { | 2189 inline bool RawObject::IsErrorClassId(intptr_t index) { | 
| 2285   // Make sure this function is updated when new Error types are added. | 2190   // Make sure this function is updated when new Error types are added. | 
| 2286   COMPILE_ASSERT(kApiErrorCid == kErrorCid + 1 && | 2191   COMPILE_ASSERT( | 
| 2287                  kLanguageErrorCid == kErrorCid + 2 && | 2192       kApiErrorCid == kErrorCid + 1 && kLanguageErrorCid == kErrorCid + 2 && | 
| 2288                  kUnhandledExceptionCid == kErrorCid + 3 && | 2193       kUnhandledExceptionCid == kErrorCid + 3 && | 
| 2289                  kUnwindErrorCid == kErrorCid + 4 && | 2194       kUnwindErrorCid == kErrorCid + 4 && kInstanceCid == kErrorCid + 5); | 
| 2290                  kInstanceCid == kErrorCid + 5); |  | 
| 2291   return (index >= kErrorCid && index < kInstanceCid); | 2195   return (index >= kErrorCid && index < kInstanceCid); | 
| 2292 } | 2196 } | 
| 2293 | 2197 | 
| 2294 | 2198 | 
| 2295 inline bool RawObject::IsNumberClassId(intptr_t index) { | 2199 inline bool RawObject::IsNumberClassId(intptr_t index) { | 
| 2296   // Make sure this function is updated when new Number types are added. | 2200   // Make sure this function is updated when new Number types are added. | 
| 2297   COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 && | 2201   COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 && kSmiCid == kNumberCid + 2 && | 
| 2298                  kSmiCid == kNumberCid + 2 && | 2202                  kMintCid == kNumberCid + 3 && kBigintCid == kNumberCid + 4 && | 
| 2299                  kMintCid == kNumberCid + 3 && |  | 
| 2300                  kBigintCid == kNumberCid + 4 && |  | 
| 2301                  kDoubleCid == kNumberCid + 5); | 2203                  kDoubleCid == kNumberCid + 5); | 
| 2302   return (index >= kNumberCid && index < kBoolCid); | 2204   return (index >= kNumberCid && index < kBoolCid); | 
| 2303 } | 2205 } | 
| 2304 | 2206 | 
| 2305 | 2207 | 
| 2306 inline bool RawObject::IsIntegerClassId(intptr_t index) { | 2208 inline bool RawObject::IsIntegerClassId(intptr_t index) { | 
| 2307   // Make sure this function is updated when new Integer types are added. | 2209   // Make sure this function is updated when new Integer types are added. | 
| 2308   COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 && | 2210   COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 && kMintCid == kIntegerCid + 2 && | 
| 2309                  kMintCid == kIntegerCid + 2 && |  | 
| 2310                  kBigintCid == kIntegerCid + 3 && | 2211                  kBigintCid == kIntegerCid + 3 && | 
| 2311                  kDoubleCid == kIntegerCid + 4); | 2212                  kDoubleCid == kIntegerCid + 4); | 
| 2312   return (index >= kIntegerCid && index < kDoubleCid); | 2213   return (index >= kIntegerCid && index < kDoubleCid); | 
| 2313 } | 2214 } | 
| 2314 | 2215 | 
| 2315 | 2216 | 
| 2316 inline bool RawObject::IsStringClassId(intptr_t index) { | 2217 inline bool RawObject::IsStringClassId(intptr_t index) { | 
| 2317   // Make sure this function is updated when new StringCid types are added. | 2218   // Make sure this function is updated when new StringCid types are added. | 
| 2318   COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 && | 2219   COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 && | 
| 2319                  kTwoByteStringCid == kStringCid + 2 && | 2220                  kTwoByteStringCid == kStringCid + 2 && | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2351                  kExternalTwoByteStringCid == kStringCid + 4); | 2252                  kExternalTwoByteStringCid == kStringCid + 4); | 
| 2352   return (index == kExternalOneByteStringCid || | 2253   return (index == kExternalOneByteStringCid || | 
| 2353           index == kExternalTwoByteStringCid); | 2254           index == kExternalTwoByteStringCid); | 
| 2354 } | 2255 } | 
| 2355 | 2256 | 
| 2356 | 2257 | 
| 2357 inline bool RawObject::IsBuiltinListClassId(intptr_t index) { | 2258 inline bool RawObject::IsBuiltinListClassId(intptr_t index) { | 
| 2358   // Make sure this function is updated when new builtin List types are added. | 2259   // Make sure this function is updated when new builtin List types are added. | 
| 2359   COMPILE_ASSERT(kImmutableArrayCid == kArrayCid + 1); | 2260   COMPILE_ASSERT(kImmutableArrayCid == kArrayCid + 1); | 
| 2360   return ((index >= kArrayCid && index <= kImmutableArrayCid) || | 2261   return ((index >= kArrayCid && index <= kImmutableArrayCid) || | 
| 2361           (index == kGrowableObjectArrayCid) || | 2262           (index == kGrowableObjectArrayCid) || IsTypedDataClassId(index) || | 
| 2362           IsTypedDataClassId(index) || | 2263           IsTypedDataViewClassId(index) || IsExternalTypedDataClassId(index) || | 
| 2363           IsTypedDataViewClassId(index) || |  | 
| 2364           IsExternalTypedDataClassId(index) || |  | 
| 2365           (index == kByteBufferCid)); | 2264           (index == kByteBufferCid)); | 
| 2366 } | 2265 } | 
| 2367 | 2266 | 
| 2368 | 2267 | 
| 2369 inline bool RawObject::IsTypedDataClassId(intptr_t index) { | 2268 inline bool RawObject::IsTypedDataClassId(intptr_t index) { | 
| 2370   // Make sure this is updated when new TypedData types are added. | 2269   // Make sure this is updated when new TypedData types are added. | 
| 2371   COMPILE_ASSERT(kTypedDataUint8ArrayCid == kTypedDataInt8ArrayCid + 1 && | 2270   COMPILE_ASSERT(kTypedDataUint8ArrayCid == kTypedDataInt8ArrayCid + 1 && | 
| 2372                  kTypedDataUint8ClampedArrayCid == kTypedDataInt8ArrayCid + 2 && | 2271                  kTypedDataUint8ClampedArrayCid == kTypedDataInt8ArrayCid + 2 && | 
| 2373                  kTypedDataInt16ArrayCid == kTypedDataInt8ArrayCid + 3 && | 2272                  kTypedDataInt16ArrayCid == kTypedDataInt8ArrayCid + 3 && | 
| 2374                  kTypedDataUint16ArrayCid == kTypedDataInt8ArrayCid + 4 && | 2273                  kTypedDataUint16ArrayCid == kTypedDataInt8ArrayCid + 4 && | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 2398       kTypedDataUint32ArrayViewCid == kTypedDataInt8ArrayViewCid + 6 && | 2297       kTypedDataUint32ArrayViewCid == kTypedDataInt8ArrayViewCid + 6 && | 
| 2399       kTypedDataInt64ArrayViewCid == kTypedDataInt8ArrayViewCid + 7 && | 2298       kTypedDataInt64ArrayViewCid == kTypedDataInt8ArrayViewCid + 7 && | 
| 2400       kTypedDataUint64ArrayViewCid == kTypedDataInt8ArrayViewCid + 8 && | 2299       kTypedDataUint64ArrayViewCid == kTypedDataInt8ArrayViewCid + 8 && | 
| 2401       kTypedDataFloat32ArrayViewCid == kTypedDataInt8ArrayViewCid + 9 && | 2300       kTypedDataFloat32ArrayViewCid == kTypedDataInt8ArrayViewCid + 9 && | 
| 2402       kTypedDataFloat64ArrayViewCid == kTypedDataInt8ArrayViewCid + 10 && | 2301       kTypedDataFloat64ArrayViewCid == kTypedDataInt8ArrayViewCid + 10 && | 
| 2403       kTypedDataFloat32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 11 && | 2302       kTypedDataFloat32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 11 && | 
| 2404       kTypedDataInt32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 12 && | 2303       kTypedDataInt32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 12 && | 
| 2405       kTypedDataFloat64x2ArrayViewCid == kTypedDataInt8ArrayViewCid + 13 && | 2304       kTypedDataFloat64x2ArrayViewCid == kTypedDataInt8ArrayViewCid + 13 && | 
| 2406       kByteDataViewCid == kTypedDataInt8ArrayViewCid + 14 && | 2305       kByteDataViewCid == kTypedDataInt8ArrayViewCid + 14 && | 
| 2407       kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15); | 2306       kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15); | 
| 2408   return (index >= kTypedDataInt8ArrayViewCid && | 2307   return (index >= kTypedDataInt8ArrayViewCid && index <= kByteDataViewCid); | 
| 2409           index <= kByteDataViewCid); |  | 
| 2410 } | 2308 } | 
| 2411 | 2309 | 
| 2412 | 2310 | 
| 2413 inline bool RawObject::IsExternalTypedDataClassId(intptr_t index) { | 2311 inline bool RawObject::IsExternalTypedDataClassId(intptr_t index) { | 
| 2414   // Make sure this is updated when new ExternalTypedData types are added. | 2312   // Make sure this is updated when new ExternalTypedData types are added. | 
| 2415   COMPILE_ASSERT( | 2313   COMPILE_ASSERT( | 
| 2416       (kExternalTypedDataUint8ArrayCid == | 2314       (kExternalTypedDataUint8ArrayCid == kExternalTypedDataInt8ArrayCid + 1) && | 
| 2417        kExternalTypedDataInt8ArrayCid + 1) && |  | 
| 2418       (kExternalTypedDataUint8ClampedArrayCid == | 2315       (kExternalTypedDataUint8ClampedArrayCid == | 
| 2419        kExternalTypedDataInt8ArrayCid + 2) && | 2316        kExternalTypedDataInt8ArrayCid + 2) && | 
| 2420       (kExternalTypedDataInt16ArrayCid == | 2317       (kExternalTypedDataInt16ArrayCid == kExternalTypedDataInt8ArrayCid + 3) && | 
| 2421        kExternalTypedDataInt8ArrayCid + 3) && |  | 
| 2422       (kExternalTypedDataUint16ArrayCid == | 2318       (kExternalTypedDataUint16ArrayCid == | 
| 2423        kExternalTypedDataInt8ArrayCid + 4) && | 2319        kExternalTypedDataInt8ArrayCid + 4) && | 
| 2424       (kExternalTypedDataInt32ArrayCid == | 2320       (kExternalTypedDataInt32ArrayCid == kExternalTypedDataInt8ArrayCid + 5) && | 
| 2425        kExternalTypedDataInt8ArrayCid + 5) && |  | 
| 2426       (kExternalTypedDataUint32ArrayCid == | 2321       (kExternalTypedDataUint32ArrayCid == | 
| 2427        kExternalTypedDataInt8ArrayCid + 6) && | 2322        kExternalTypedDataInt8ArrayCid + 6) && | 
| 2428       (kExternalTypedDataInt64ArrayCid == | 2323       (kExternalTypedDataInt64ArrayCid == kExternalTypedDataInt8ArrayCid + 7) && | 
| 2429        kExternalTypedDataInt8ArrayCid + 7) && |  | 
| 2430       (kExternalTypedDataUint64ArrayCid == | 2324       (kExternalTypedDataUint64ArrayCid == | 
| 2431        kExternalTypedDataInt8ArrayCid + 8) && | 2325        kExternalTypedDataInt8ArrayCid + 8) && | 
| 2432       (kExternalTypedDataFloat32ArrayCid == | 2326       (kExternalTypedDataFloat32ArrayCid == | 
| 2433        kExternalTypedDataInt8ArrayCid + 9) && | 2327        kExternalTypedDataInt8ArrayCid + 9) && | 
| 2434       (kExternalTypedDataFloat64ArrayCid == | 2328       (kExternalTypedDataFloat64ArrayCid == | 
| 2435        kExternalTypedDataInt8ArrayCid + 10) && | 2329        kExternalTypedDataInt8ArrayCid + 10) && | 
| 2436       (kExternalTypedDataFloat32x4ArrayCid == | 2330       (kExternalTypedDataFloat32x4ArrayCid == | 
| 2437        kExternalTypedDataInt8ArrayCid + 11) && | 2331        kExternalTypedDataInt8ArrayCid + 11) && | 
| 2438       (kExternalTypedDataInt32x4ArrayCid == | 2332       (kExternalTypedDataInt32x4ArrayCid == | 
| 2439        kExternalTypedDataInt8ArrayCid + 12) && | 2333        kExternalTypedDataInt8ArrayCid + 12) && | 
| 2440       (kExternalTypedDataFloat64x2ArrayCid == | 2334       (kExternalTypedDataFloat64x2ArrayCid == | 
| 2441        kExternalTypedDataInt8ArrayCid + 13) && | 2335        kExternalTypedDataInt8ArrayCid + 13) && | 
| 2442       (kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14)); | 2336       (kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14)); | 
| 2443   return (index >= kExternalTypedDataInt8ArrayCid && | 2337   return (index >= kExternalTypedDataInt8ArrayCid && | 
| 2444           index <= kExternalTypedDataFloat64x2ArrayCid); | 2338           index <= kExternalTypedDataFloat64x2ArrayCid); | 
| 2445 } | 2339 } | 
| 2446 | 2340 | 
| 2447 | 2341 | 
| 2448 inline bool RawObject::IsInternalVMdefinedClassId(intptr_t index) { | 2342 inline bool RawObject::IsInternalVMdefinedClassId(intptr_t index) { | 
| 2449   return ((index < kNumPredefinedCids) && | 2343   return ((index < kNumPredefinedCids) && | 
| 2450           !RawObject::IsImplicitFieldClassId(index)); | 2344           !RawObject::IsImplicitFieldClassId(index)); | 
| 2451 } | 2345 } | 
| 2452 | 2346 | 
| 2453 | 2347 | 
| 2454 inline bool RawObject::IsVariableSizeClassId(intptr_t index) { | 2348 inline bool RawObject::IsVariableSizeClassId(intptr_t index) { | 
| 2455   return (index == kArrayCid) || | 2349   return (index == kArrayCid) || (index == kImmutableArrayCid) || | 
| 2456          (index == kImmutableArrayCid) || |  | 
| 2457          RawObject::IsOneByteStringClassId(index) || | 2350          RawObject::IsOneByteStringClassId(index) || | 
| 2458          RawObject::IsTwoByteStringClassId(index) || | 2351          RawObject::IsTwoByteStringClassId(index) || | 
| 2459          RawObject::IsTypedDataClassId(index) || | 2352          RawObject::IsTypedDataClassId(index) || (index == kContextCid) || | 
| 2460          (index == kContextCid) || | 2353          (index == kTypeArgumentsCid) || (index == kInstructionsCid) || | 
| 2461          (index == kTypeArgumentsCid) || | 2354          (index == kObjectPoolCid) || (index == kPcDescriptorsCid) || | 
| 2462          (index == kInstructionsCid) || | 2355          (index == kCodeSourceMapCid) || (index == kStackmapCid) || | 
| 2463          (index == kObjectPoolCid) || |  | 
| 2464          (index == kPcDescriptorsCid) || |  | 
| 2465          (index == kCodeSourceMapCid) || |  | 
| 2466          (index == kStackmapCid) || |  | 
| 2467          (index == kLocalVarDescriptorsCid) || | 2356          (index == kLocalVarDescriptorsCid) || | 
| 2468          (index == kExceptionHandlersCid) || | 2357          (index == kExceptionHandlersCid) || (index == kCodeCid) || | 
| 2469          (index == kCodeCid) || | 2358          (index == kContextScopeCid) || (index == kInstanceCid) || | 
| 2470          (index == kContextScopeCid) || |  | 
| 2471          (index == kInstanceCid) || |  | 
| 2472          (index == kRegExpCid); | 2359          (index == kRegExpCid); | 
| 2473 } | 2360 } | 
| 2474 | 2361 | 
| 2475 | 2362 | 
| 2476 // This is a set of classes that are not Dart classes whose representation | 2363 // This is a set of classes that are not Dart classes whose representation | 
| 2477 // is defined by the VM but are used in the VM code by computing the | 2364 // is defined by the VM but are used in the VM code by computing the | 
| 2478 // implicit field offsets of the various fields in the dart object. | 2365 // implicit field offsets of the various fields in the dart object. | 
| 2479 inline bool RawObject::IsImplicitFieldClassId(intptr_t index) { | 2366 inline bool RawObject::IsImplicitFieldClassId(intptr_t index) { | 
| 2480   return (IsTypedDataViewClassId(index) || index == kByteBufferCid); | 2367   return (IsTypedDataViewClassId(index) || index == kByteBufferCid); | 
| 2481 } | 2368 } | 
| 2482 | 2369 | 
| 2483 | 2370 | 
| 2484 inline intptr_t RawObject::NumberOfTypedDataClasses() { | 2371 inline intptr_t RawObject::NumberOfTypedDataClasses() { | 
| 2485   // Make sure this is updated when new TypedData types are added. | 2372   // Make sure this is updated when new TypedData types are added. | 
| 2486   COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14); | 2373   COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14); | 
| 2487   COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == | 2374   COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == | 
| 2488                  kTypedDataInt8ArrayViewCid + 15); | 2375                  kTypedDataInt8ArrayViewCid + 15); | 
| 2489   COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); | 2376   COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); | 
| 2490   COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); | 2377   COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); | 
| 2491   return (kNullCid - kTypedDataInt8ArrayCid); | 2378   return (kNullCid - kTypedDataInt8ArrayCid); | 
| 2492 } | 2379 } | 
| 2493 | 2380 | 
| 2494 }  // namespace dart | 2381 }  // namespace dart | 
| 2495 | 2382 | 
| 2496 #endif  // RUNTIME_VM_RAW_OBJECT_H_ | 2383 #endif  // RUNTIME_VM_RAW_OBJECT_H_ | 
| OLD | NEW | 
|---|