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

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

Issue 2481873005: clang-format runtime/vm (Closed)
Patch Set: Merge Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/native_symbol_macos.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef RUNTIME_VM_OBJECT_H_ 5 #ifndef RUNTIME_VM_OBJECT_H_
6 #define RUNTIME_VM_OBJECT_H_ 6 #define RUNTIME_VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 11 matching lines...) Expand all
22 #include "vm/raw_object.h" 22 #include "vm/raw_object.h"
23 #include "vm/report.h" 23 #include "vm/report.h"
24 #include "vm/scanner.h" 24 #include "vm/scanner.h"
25 #include "vm/tags.h" 25 #include "vm/tags.h"
26 #include "vm/thread.h" 26 #include "vm/thread.h"
27 #include "vm/token_position.h" 27 #include "vm/token_position.h"
28 28
29 namespace dart { 29 namespace dart {
30 30
31 // Forward declarations. 31 // Forward declarations.
32 #define DEFINE_FORWARD_DECLARATION(clazz) \ 32 #define DEFINE_FORWARD_DECLARATION(clazz) class clazz;
33 class clazz;
34 CLASS_LIST(DEFINE_FORWARD_DECLARATION) 33 CLASS_LIST(DEFINE_FORWARD_DECLARATION)
35 #undef DEFINE_FORWARD_DECLARATION 34 #undef DEFINE_FORWARD_DECLARATION
36 class Api; 35 class Api;
37 class ArgumentsDescriptor; 36 class ArgumentsDescriptor;
38 class Assembler; 37 class Assembler;
39 class Closure; 38 class Closure;
40 class Code; 39 class Code;
41 class DisassemblyFormatter; 40 class DisassemblyFormatter;
42 class DeoptInstr; 41 class DeoptInstr;
43 class FinalizablePersistentHandle; 42 class FinalizablePersistentHandle;
44 class LocalScope; 43 class LocalScope;
45 44
46 #define REUSABLE_FORWARD_DECLARATION(name) \ 45 #define REUSABLE_FORWARD_DECLARATION(name) class Reusable##name##HandleScope;
47 class Reusable##name##HandleScope;
48 REUSABLE_HANDLE_LIST(REUSABLE_FORWARD_DECLARATION) 46 REUSABLE_HANDLE_LIST(REUSABLE_FORWARD_DECLARATION)
49 #undef REUSABLE_FORWARD_DECLARATION 47 #undef REUSABLE_FORWARD_DECLARATION
50 48
51 class Symbols; 49 class Symbols;
52 50
53 #if defined(DEBUG) 51 #if defined(DEBUG)
54 #define CHECK_HANDLE() CheckHandle(); 52 #define CHECK_HANDLE() CheckHandle();
55 #else 53 #else
56 #define CHECK_HANDLE() 54 #define CHECK_HANDLE()
57 #endif 55 #endif
58 56
59 #define BASE_OBJECT_IMPLEMENTATION(object, super) \ 57 #define BASE_OBJECT_IMPLEMENTATION(object, super) \
60 public: /* NOLINT */ \ 58 public: /* NOLINT */ \
61 Raw##object* raw() const { return reinterpret_cast<Raw##object*>(raw_); } \ 59 Raw##object* raw() const { return reinterpret_cast<Raw##object*>(raw_); } \
62 bool Is##object() const { return true; } \ 60 bool Is##object() const { return true; } \
63 static object& Handle(Zone* zone, Raw##object* raw_ptr) { \ 61 static object& Handle(Zone* zone, Raw##object* raw_ptr) { \
64 object* obj = \ 62 object* obj = reinterpret_cast<object*>(VMHandles::AllocateHandle(zone)); \
65 reinterpret_cast<object*>(VMHandles::AllocateHandle(zone)); \
66 initializeHandle(obj, raw_ptr); \ 63 initializeHandle(obj, raw_ptr); \
67 return *obj; \ 64 return *obj; \
68 } \ 65 } \
69 static object& Handle() { \ 66 static object& Handle() { \
70 return Handle(Thread::Current()->zone(), object::null()); \ 67 return Handle(Thread::Current()->zone(), object::null()); \
71 } \ 68 } \
72 static object& Handle(Zone* zone) { \ 69 static object& Handle(Zone* zone) { return Handle(zone, object::null()); } \
73 return Handle(zone, object::null()); \
74 } \
75 static object& Handle(Raw##object* raw_ptr) { \ 70 static object& Handle(Raw##object* raw_ptr) { \
76 return Handle(Thread::Current()->zone(), raw_ptr); \ 71 return Handle(Thread::Current()->zone(), raw_ptr); \
77 } \ 72 } \
78 static object& CheckedHandle(Zone* zone, RawObject* raw_ptr) { \ 73 static object& CheckedHandle(Zone* zone, RawObject* raw_ptr) { \
79 object* obj = \ 74 object* obj = reinterpret_cast<object*>(VMHandles::AllocateHandle(zone)); \
80 reinterpret_cast<object*>(VMHandles::AllocateHandle(zone)); \
81 initializeHandle(obj, raw_ptr); \ 75 initializeHandle(obj, raw_ptr); \
82 if (!obj->Is##object()) { \ 76 if (!obj->Is##object()) { \
83 FATAL2("Handle check failed: saw %s expected %s", \ 77 FATAL2("Handle check failed: saw %s expected %s", obj->ToCString(), \
84 obj->ToCString(), #object); \ 78 #object); \
85 } \ 79 } \
86 return *obj; \ 80 return *obj; \
87 } \ 81 } \
88 static object& CheckedHandle(RawObject* raw_ptr) { \ 82 static object& CheckedHandle(RawObject* raw_ptr) { \
89 return CheckedHandle(Thread::Current()->zone(), raw_ptr); \ 83 return CheckedHandle(Thread::Current()->zone(), raw_ptr); \
90 } \ 84 } \
91 static object& ZoneHandle(Zone* zone, Raw##object* raw_ptr) { \ 85 static object& ZoneHandle(Zone* zone, Raw##object* raw_ptr) { \
92 object* obj = reinterpret_cast<object*>( \ 86 object* obj = \
93 VMHandles::AllocateZoneHandle(zone)); \ 87 reinterpret_cast<object*>(VMHandles::AllocateZoneHandle(zone)); \
94 initializeHandle(obj, raw_ptr); \ 88 initializeHandle(obj, raw_ptr); \
95 return *obj; \ 89 return *obj; \
96 } \ 90 } \
97 static object* ReadOnlyHandle() { \ 91 static object* ReadOnlyHandle() { \
98 object* obj = reinterpret_cast<object*>( \ 92 object* obj = reinterpret_cast<object*>(Dart::AllocateReadOnlyHandle()); \
99 Dart::AllocateReadOnlyHandle()); \
100 initializeHandle(obj, object::null()); \ 93 initializeHandle(obj, object::null()); \
101 return obj; \ 94 return obj; \
102 } \ 95 } \
103 static object& ZoneHandle(Zone* zone) { \ 96 static object& ZoneHandle(Zone* zone) { \
104 return ZoneHandle(zone, object::null()); \ 97 return ZoneHandle(zone, object::null()); \
105 } \ 98 } \
106 static object& ZoneHandle() { \ 99 static object& ZoneHandle() { \
107 return ZoneHandle(Thread::Current()->zone(), object::null()); \ 100 return ZoneHandle(Thread::Current()->zone(), object::null()); \
108 } \ 101 } \
109 static object& ZoneHandle(Raw##object* raw_ptr) { \ 102 static object& ZoneHandle(Raw##object* raw_ptr) { \
110 return ZoneHandle(Thread::Current()->zone(), raw_ptr); \ 103 return ZoneHandle(Thread::Current()->zone(), raw_ptr); \
111 } \ 104 } \
112 static object& CheckedZoneHandle(Zone* zone, RawObject* raw_ptr) { \ 105 static object& CheckedZoneHandle(Zone* zone, RawObject* raw_ptr) { \
113 object* obj = reinterpret_cast<object*>( \ 106 object* obj = \
114 VMHandles::AllocateZoneHandle(zone)); \ 107 reinterpret_cast<object*>(VMHandles::AllocateZoneHandle(zone)); \
115 initializeHandle(obj, raw_ptr); \ 108 initializeHandle(obj, raw_ptr); \
116 if (!obj->Is##object()) { \ 109 if (!obj->Is##object()) { \
117 FATAL2("Handle check failed: saw %s expected %s", \ 110 FATAL2("Handle check failed: saw %s expected %s", obj->ToCString(), \
118 obj->ToCString(), #object); \ 111 #object); \
119 } \ 112 } \
120 return *obj; \ 113 return *obj; \
121 } \ 114 } \
122 static object& CheckedZoneHandle(RawObject* raw_ptr) { \ 115 static object& CheckedZoneHandle(RawObject* raw_ptr) { \
123 return CheckedZoneHandle(Thread::Current()->zone(), raw_ptr); \ 116 return CheckedZoneHandle(Thread::Current()->zone(), raw_ptr); \
124 } \ 117 } \
125 /* T::Cast cannot be applied to a null Object, because the object vtable */ \ 118 /* T::Cast cannot be applied to a null Object, because the object vtable */ \
126 /* is not setup for type T, although some methods are supposed to work */ \ 119 /* is not setup for type T, although some methods are supposed to work */ \
127 /* with null, for example Instance::Equals(). */ \ 120 /* with null, for example Instance::Equals(). */ \
128 static const object& Cast(const Object& obj) { \ 121 static const object& Cast(const Object& obj) { \
129 ASSERT(obj.Is##object()); \ 122 ASSERT(obj.Is##object()); \
130 return reinterpret_cast<const object&>(obj); \ 123 return reinterpret_cast<const object&>(obj); \
131 } \ 124 } \
132 static Raw##object* RawCast(RawObject* raw) { \ 125 static Raw##object* RawCast(RawObject* raw) { \
133 ASSERT(Object::Handle(raw).Is##object()); \ 126 ASSERT(Object::Handle(raw).Is##object()); \
134 return reinterpret_cast<Raw##object*>(raw); \ 127 return reinterpret_cast<Raw##object*>(raw); \
135 } \ 128 } \
136 static Raw##object* null() { \ 129 static Raw##object* null() { \
137 return reinterpret_cast<Raw##object*>(Object::null()); \ 130 return reinterpret_cast<Raw##object*>(Object::null()); \
138 } \ 131 } \
139 virtual const char* ToCString() const; \ 132 virtual const char* ToCString() const; \
140 static const ClassId kClassId = k##object##Cid; \ 133 static const ClassId kClassId = k##object##Cid; \
141 private: /* NOLINT */ \ 134 \
135 private: /* NOLINT */ \
142 /* Initialize the handle based on the raw_ptr in the presence of null. */ \ 136 /* Initialize the handle based on the raw_ptr in the presence of null. */ \
143 static void initializeHandle(object* obj, RawObject* raw_ptr) { \ 137 static void initializeHandle(object* obj, RawObject* raw_ptr) { \
144 if (raw_ptr != Object::null()) { \ 138 if (raw_ptr != Object::null()) { \
145 obj->SetRaw(raw_ptr); \ 139 obj->SetRaw(raw_ptr); \
146 } else { \ 140 } else { \
147 obj->raw_ = Object::null(); \ 141 obj->raw_ = Object::null(); \
148 object fake_object; \ 142 object fake_object; \
149 obj->set_vtable(fake_object.vtable()); \ 143 obj->set_vtable(fake_object.vtable()); \
150 } \ 144 } \
151 } \ 145 } \
152 /* Disallow allocation, copy constructors and override super assignment. */ \ 146 /* Disallow allocation, copy constructors and override super assignment. */ \
153 public: /* NOLINT */ \ 147 public: /* NOLINT */ \
154 void operator delete(void* pointer) { \ 148 void operator delete(void* pointer) { UNREACHABLE(); } \
155 UNREACHABLE(); \ 149 \
156 } \ 150 private: /* NOLINT */ \
157 private: /* NOLINT */ \
158 void* operator new(size_t size); \ 151 void* operator new(size_t size); \
159 object(const object& value); \ 152 object(const object& value); \
160 void operator=(Raw##super* value); \ 153 void operator=(Raw##super* value); \
161 void operator=(const object& value); \ 154 void operator=(const object& value); \
162 void operator=(const super& value); \ 155 void operator=(const super& value);
163 156
164 // Conditionally include object_service.cc functionality in the vtable to avoid 157 // Conditionally include object_service.cc functionality in the vtable to avoid
165 // link errors like the following: 158 // link errors like the following:
166 // 159 //
167 // object.o:(.rodata._ZTVN4....E[_ZTVN4...E]+0x278): 160 // object.o:(.rodata._ZTVN4....E[_ZTVN4...E]+0x278):
168 // undefined reference to 161 // undefined reference to
169 // `dart::Instance::PrintSharedInstanceJSON(dart::JSONObject*, bool) const'. 162 // `dart::Instance::PrintSharedInstanceJSON(dart::JSONObject*, bool) const'.
170 // 163 //
171 #ifndef PRODUCT 164 #ifndef PRODUCT
172 #define OBJECT_SERVICE_SUPPORT(object) \ 165 #define OBJECT_SERVICE_SUPPORT(object) \
173 protected: /* NOLINT */ \ 166 protected: /* NOLINT */ \
174 /* Object is printed as JSON into stream. If ref is true only a header */ \ 167 /* Object is printed as JSON into stream. If ref is true only a header */ \
175 /* with an object id is printed. If ref is false the object is fully */ \ 168 /* with an object id is printed. If ref is false the object is fully */ \
176 /* printed. */ \ 169 /* printed. */ \
177 virtual void PrintJSONImpl(JSONStream* stream, bool ref) const; \ 170 virtual void PrintJSONImpl(JSONStream* stream, bool ref) const; \
178 virtual const char* JSONType() const { \ 171 virtual const char* JSONType() const { return "" #object; }
179 return ""#object; \
180 }
181 #else 172 #else
182 #define OBJECT_SERVICE_SUPPORT(object) \ 173 #define OBJECT_SERVICE_SUPPORT(object) protected: /* NOLINT */
183 protected: /* NOLINT */ 174 #endif // !PRODUCT
184 #endif // !PRODUCT
185 175
186 #define SNAPSHOT_READER_SUPPORT(object) \ 176 #define SNAPSHOT_READER_SUPPORT(object) \
187 static Raw##object* ReadFrom(SnapshotReader* reader, \ 177 static Raw##object* ReadFrom(SnapshotReader* reader, intptr_t object_id, \
188 intptr_t object_id, \ 178 intptr_t tags, Snapshot::Kind, \
189 intptr_t tags, \
190 Snapshot::Kind, \
191 bool as_reference); \ 179 bool as_reference); \
192 friend class SnapshotReader; \ 180 friend class SnapshotReader;
193 181
194 #define OBJECT_IMPLEMENTATION(object, super) \ 182 #define OBJECT_IMPLEMENTATION(object, super) \
195 public: /* NOLINT */ \ 183 public: /* NOLINT */ \
196 void operator=(Raw##object* value) { \ 184 void operator=(Raw##object* value) { initializeHandle(this, value); } \
197 initializeHandle(this, value); \
198 } \
199 void operator^=(RawObject* value) { \ 185 void operator^=(RawObject* value) { \
200 initializeHandle(this, value); \ 186 initializeHandle(this, value); \
201 ASSERT(IsNull() || Is##object()); \ 187 ASSERT(IsNull() || Is##object()); \
202 } \ 188 } \
203 protected: /* NOLINT */ \ 189 \
190 protected: /* NOLINT */ \
204 object() : super() {} \ 191 object() : super() {} \
205 BASE_OBJECT_IMPLEMENTATION(object, super) \ 192 BASE_OBJECT_IMPLEMENTATION(object, super) \
206 OBJECT_SERVICE_SUPPORT(object) 193 OBJECT_SERVICE_SUPPORT(object)
207 194
208 #define HEAP_OBJECT_IMPLEMENTATION(object, super) \ 195 #define HEAP_OBJECT_IMPLEMENTATION(object, super) \
209 OBJECT_IMPLEMENTATION(object, super); \ 196 OBJECT_IMPLEMENTATION(object, super); \
210 const Raw##object* raw_ptr() const { \ 197 const Raw##object* raw_ptr() const { \
211 ASSERT(raw() != null()); \ 198 ASSERT(raw() != null()); \
212 return raw()->ptr(); \ 199 return raw()->ptr(); \
213 } \ 200 } \
214 SNAPSHOT_READER_SUPPORT(object) \ 201 SNAPSHOT_READER_SUPPORT(object) \
215 friend class StackFrame; \ 202 friend class StackFrame; \
216 friend class Thread; \ 203 friend class Thread;
217 204
218 // This macro is used to denote types that do not have a sub-type. 205 // This macro is used to denote types that do not have a sub-type.
219 #define FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super) \ 206 #define FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super) \
220 public: /* NOLINT */ \ 207 public: /* NOLINT */ \
221 void operator=(Raw##object* value) { \ 208 void operator=(Raw##object* value) { \
222 raw_ = value; \ 209 raw_ = value; \
223 CHECK_HANDLE(); \ 210 CHECK_HANDLE(); \
224 } \ 211 } \
225 void operator^=(RawObject* value) { \ 212 void operator^=(RawObject* value) { \
226 raw_ = value; \ 213 raw_ = value; \
227 CHECK_HANDLE(); \ 214 CHECK_HANDLE(); \
228 } \ 215 } \
229 private: /* NOLINT */ \ 216 \
217 private: /* NOLINT */ \
230 object() : super() {} \ 218 object() : super() {} \
231 BASE_OBJECT_IMPLEMENTATION(object, super) \ 219 BASE_OBJECT_IMPLEMENTATION(object, super) \
232 OBJECT_SERVICE_SUPPORT(object) \ 220 OBJECT_SERVICE_SUPPORT(object) \
233 const Raw##object* raw_ptr() const { \ 221 const Raw##object* raw_ptr() const { \
234 ASSERT(raw() != null()); \ 222 ASSERT(raw() != null()); \
235 return raw()->ptr(); \ 223 return raw()->ptr(); \
236 } \ 224 } \
237 static intptr_t NextFieldOffset() { \ 225 static intptr_t NextFieldOffset() { return -kWordSize; } \
238 return -kWordSize; \
239 } \
240 SNAPSHOT_READER_SUPPORT(rettype) \ 226 SNAPSHOT_READER_SUPPORT(rettype) \
241 friend class StackFrame; \ 227 friend class StackFrame; \
242 friend class Thread; \ 228 friend class Thread;
243 229
244 #define FINAL_HEAP_OBJECT_IMPLEMENTATION(object, super) \ 230 #define FINAL_HEAP_OBJECT_IMPLEMENTATION(object, super) \
245 FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, object, super) \ 231 FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, object, super)
246 232
247 #define MINT_OBJECT_IMPLEMENTATION(object, rettype, super) \ 233 #define MINT_OBJECT_IMPLEMENTATION(object, rettype, super) \
248 FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super) \ 234 FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super)
249 235
250 class Object { 236 class Object {
251 public: 237 public:
252 virtual ~Object() { } 238 virtual ~Object() {}
253 239
254 RawObject* raw() const { return raw_; } 240 RawObject* raw() const { return raw_; }
255 void operator=(RawObject* value) { 241 void operator=(RawObject* value) { initializeHandle(this, value); }
256 initializeHandle(this, value);
257 }
258 242
259 uword CompareAndSwapTags(uword old_tags, uword new_tags) const { 243 uword CompareAndSwapTags(uword old_tags, uword new_tags) const {
260 return AtomicOperations::CompareAndSwapWord( 244 return AtomicOperations::CompareAndSwapWord(&raw()->ptr()->tags_, old_tags,
261 &raw()->ptr()->tags_, old_tags, new_tags); 245 new_tags);
262 } 246 }
263 bool IsCanonical() const { 247 bool IsCanonical() const { return raw()->IsCanonical(); }
264 return raw()->IsCanonical(); 248 void SetCanonical() const { raw()->SetCanonical(); }
265 } 249 void ClearCanonical() const { raw()->ClearCanonical(); }
266 void SetCanonical() const {
267 raw()->SetCanonical();
268 }
269 void ClearCanonical() const {
270 raw()->ClearCanonical();
271 }
272 intptr_t GetClassId() const { 250 intptr_t GetClassId() const {
273 return !raw()->IsHeapObject() ? 251 return !raw()->IsHeapObject() ? static_cast<intptr_t>(kSmiCid)
274 static_cast<intptr_t>(kSmiCid) : raw()->GetClassId(); 252 : raw()->GetClassId();
275 } 253 }
276 inline RawClass* clazz() const; 254 inline RawClass* clazz() const;
277 static intptr_t tags_offset() { return OFFSET_OF(RawObject, tags_); } 255 static intptr_t tags_offset() { return OFFSET_OF(RawObject, tags_); }
278 256
279 // Class testers. 257 // Class testers.
280 #define DEFINE_CLASS_TESTER(clazz) \ 258 #define DEFINE_CLASS_TESTER(clazz) \
281 virtual bool Is##clazz() const { return false; } 259 virtual bool Is##clazz() const { return false; }
282 CLASS_LIST_FOR_HANDLES(DEFINE_CLASS_TESTER); 260 CLASS_LIST_FOR_HANDLES(DEFINE_CLASS_TESTER);
283 #undef DEFINE_CLASS_TESTER 261 #undef DEFINE_CLASS_TESTER
284 262
285 bool IsNull() const { return raw_ == null_; } 263 bool IsNull() const { return raw_ == null_; }
286 264
287 // Matches Object.toString on instances (except String::ToCString, bug 20583). 265 // Matches Object.toString on instances (except String::ToCString, bug 20583).
288 virtual const char* ToCString() const { 266 virtual const char* ToCString() const {
289 if (IsNull()) { 267 if (IsNull()) {
290 return "null"; 268 return "null";
291 } else { 269 } else {
292 return "Object"; 270 return "Object";
293 } 271 }
294 } 272 }
295 273
296 #ifndef PRODUCT 274 #ifndef PRODUCT
297 void PrintJSON(JSONStream* stream, bool ref = true) const; 275 void PrintJSON(JSONStream* stream, bool ref = true) const;
298 virtual void PrintJSONImpl(JSONStream* stream, bool ref) const; 276 virtual void PrintJSONImpl(JSONStream* stream, bool ref) const;
299 virtual const char* JSONType() const { 277 virtual const char* JSONType() const { return IsNull() ? "null" : "Object"; }
300 return IsNull() ? "null" : "Object";
301 }
302 #endif 278 #endif
303 279
304 // Returns the name that is used to identify an object in the 280 // Returns the name that is used to identify an object in the
305 // namespace dictionary. 281 // namespace dictionary.
306 // Object::DictionaryName() returns String::null(). Only subclasses 282 // Object::DictionaryName() returns String::null(). Only subclasses
307 // of Object that need to be entered in the library and library prefix 283 // of Object that need to be entered in the library and library prefix
308 // namespaces need to provide an implementation. 284 // namespaces need to provide an implementation.
309 virtual RawString* DictionaryName() const; 285 virtual RawString* DictionaryName() const;
310 286
311 bool IsNew() const { return raw()->IsNewObject(); } 287 bool IsNew() const { return raw()->IsNewObject(); }
(...skipping 14 matching lines...) Expand all
326 bool IsReadOnlyHandle() const; 302 bool IsReadOnlyHandle() const;
327 303
328 bool IsNotTemporaryScopedHandle() const; 304 bool IsNotTemporaryScopedHandle() const;
329 305
330 static Object& Handle(Zone* zone, RawObject* raw_ptr) { 306 static Object& Handle(Zone* zone, RawObject* raw_ptr) {
331 Object* obj = reinterpret_cast<Object*>(VMHandles::AllocateHandle(zone)); 307 Object* obj = reinterpret_cast<Object*>(VMHandles::AllocateHandle(zone));
332 initializeHandle(obj, raw_ptr); 308 initializeHandle(obj, raw_ptr);
333 return *obj; 309 return *obj;
334 } 310 }
335 static Object* ReadOnlyHandle() { 311 static Object* ReadOnlyHandle() {
336 Object* obj = reinterpret_cast<Object*>( 312 Object* obj = reinterpret_cast<Object*>(Dart::AllocateReadOnlyHandle());
337 Dart::AllocateReadOnlyHandle());
338 initializeHandle(obj, Object::null()); 313 initializeHandle(obj, Object::null());
339 return obj; 314 return obj;
340 } 315 }
341 316
342 static Object& Handle() { 317 static Object& Handle() { return Handle(Thread::Current()->zone(), null_); }
343 return Handle(Thread::Current()->zone(), null_);
344 }
345 318
346 static Object& Handle(Zone* zone) { 319 static Object& Handle(Zone* zone) { return Handle(zone, null_); }
347 return Handle(zone, null_);
348 }
349 320
350 static Object& Handle(RawObject* raw_ptr) { 321 static Object& Handle(RawObject* raw_ptr) {
351 return Handle(Thread::Current()->zone(), raw_ptr); 322 return Handle(Thread::Current()->zone(), raw_ptr);
352 } 323 }
353 324
354 static Object& ZoneHandle(Zone* zone, RawObject* raw_ptr) { 325 static Object& ZoneHandle(Zone* zone, RawObject* raw_ptr) {
355 Object* obj = reinterpret_cast<Object*>( 326 Object* obj =
356 VMHandles::AllocateZoneHandle(zone)); 327 reinterpret_cast<Object*>(VMHandles::AllocateZoneHandle(zone));
357 initializeHandle(obj, raw_ptr); 328 initializeHandle(obj, raw_ptr);
358 return *obj; 329 return *obj;
359 } 330 }
360 331
361 static Object& ZoneHandle() { 332 static Object& ZoneHandle() {
362 return ZoneHandle(Thread::Current()->zone(), null_); 333 return ZoneHandle(Thread::Current()->zone(), null_);
363 } 334 }
364 335
365 static Object& ZoneHandle(RawObject* raw_ptr) { 336 static Object& ZoneHandle(RawObject* raw_ptr) {
366 return ZoneHandle(Thread::Current()->zone(), raw_ptr); 337 return ZoneHandle(Thread::Current()->zone(), raw_ptr);
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 534
564 static intptr_t InstanceSize() { 535 static intptr_t InstanceSize() {
565 return RoundedAllocationSize(sizeof(RawObject)); 536 return RoundedAllocationSize(sizeof(RawObject));
566 } 537 }
567 538
568 static void VerifyBuiltinVtables(); 539 static void VerifyBuiltinVtables();
569 540
570 static const ClassId kClassId = kObjectCid; 541 static const ClassId kClassId = kObjectCid;
571 542
572 // Different kinds of type tests. 543 // Different kinds of type tests.
573 enum TypeTestKind { 544 enum TypeTestKind { kIsSubtypeOf = 0, kIsMoreSpecificThan };
574 kIsSubtypeOf = 0,
575 kIsMoreSpecificThan
576 };
577 545
578 // Different kinds of name visibility. 546 // Different kinds of name visibility.
579 enum NameVisibility { 547 enum NameVisibility {
580 // Internal names are the true names of classes, fields, 548 // Internal names are the true names of classes, fields,
581 // etc. inside the vm. These names include privacy suffixes, 549 // etc. inside the vm. These names include privacy suffixes,
582 // getter prefixes, and trailing dots on unnamed constructors. 550 // getter prefixes, and trailing dots on unnamed constructors.
583 // 551 //
584 // The names of core implementation classes (like _OneByteString) 552 // The names of core implementation classes (like _OneByteString)
585 // are preserved as well. 553 // are preserved as well.
586 // 554 //
(...skipping 25 matching lines...) Expand all
612 // _MyClass@6b3832b. -> _MyClass 580 // _MyClass@6b3832b. -> _MyClass
613 // _MyClass@6b3832b.named -> _MyClass.named 581 // _MyClass@6b3832b.named -> _MyClass.named
614 // _OneByteString -> String (remapped) 582 // _OneByteString -> String (remapped)
615 kUserVisibleName 583 kUserVisibleName
616 }; 584 };
617 585
618 protected: 586 protected:
619 // Used for extracting the C++ vtable during bringup. 587 // Used for extracting the C++ vtable during bringup.
620 Object() : raw_(null_) {} 588 Object() : raw_(null_) {}
621 589
622 uword raw_value() const { 590 uword raw_value() const { return reinterpret_cast<uword>(raw()); }
623 return reinterpret_cast<uword>(raw());
624 }
625 591
626 inline void SetRaw(RawObject* value); 592 inline void SetRaw(RawObject* value);
627 void CheckHandle() const; 593 void CheckHandle() const;
628 594
629 cpp_vtable vtable() const { return bit_copy<cpp_vtable>(*this); } 595 cpp_vtable vtable() const { return bit_copy<cpp_vtable>(*this); }
630 void set_vtable(cpp_vtable value) { *vtable_address() = value; } 596 void set_vtable(cpp_vtable value) { *vtable_address() = value; }
631 597
632 static RawObject* Allocate(intptr_t cls_id, 598 static RawObject* Allocate(intptr_t cls_id, intptr_t size, Heap::Space space);
633 intptr_t size,
634 Heap::Space space);
635 599
636 static intptr_t RoundedAllocationSize(intptr_t size) { 600 static intptr_t RoundedAllocationSize(intptr_t size) {
637 return Utils::RoundUp(size, kObjectAlignment); 601 return Utils::RoundUp(size, kObjectAlignment);
638 } 602 }
639 603
640 bool Contains(uword addr) const { return raw()->Contains(addr); } 604 bool Contains(uword addr) const { return raw()->Contains(addr); }
641 605
642 // Start of field mutator guards. 606 // Start of field mutator guards.
643 // 607 //
644 // All writes to heap objects should ultimately pass through one of the 608 // All writes to heap objects should ultimately pass through one of the
645 // methods below or their counterparts in RawObject, to ensure that the 609 // methods below or their counterparts in RawObject, to ensure that the
646 // write barrier is correctly applied. 610 // write barrier is correctly applied.
647 611
648 template<typename type> 612 template <typename type>
649 void StorePointer(type const* addr, type value) const { 613 void StorePointer(type const* addr, type value) const {
650 raw()->StorePointer(addr, value); 614 raw()->StorePointer(addr, value);
651 } 615 }
652 616
653 // Store a range of pointers [from, from + count) into [to, to + count). 617 // Store a range of pointers [from, from + count) into [to, to + count).
654 // TODO(koda): Use this to fix Object::Clone's broken store buffer logic. 618 // TODO(koda): Use this to fix Object::Clone's broken store buffer logic.
655 void StorePointers(RawObject* const* to, 619 void StorePointers(RawObject* const* to,
656 RawObject* const* from, 620 RawObject* const* from,
657 intptr_t count) { 621 intptr_t count) {
658 ASSERT(Contains(reinterpret_cast<uword>(to))); 622 ASSERT(Contains(reinterpret_cast<uword>(to)));
659 if (raw()->IsNewObject()) { 623 if (raw()->IsNewObject()) {
660 memmove(const_cast<RawObject**>(to), from, count * kWordSize); 624 memmove(const_cast<RawObject**>(to), from, count * kWordSize);
661 } else { 625 } else {
662 for (intptr_t i = 0; i < count; ++i) { 626 for (intptr_t i = 0; i < count; ++i) {
663 StorePointer(&to[i], from[i]); 627 StorePointer(&to[i], from[i]);
664 } 628 }
665 } 629 }
666 } 630 }
667 631
668 // Use for storing into an explicitly Smi-typed field of an object 632 // Use for storing into an explicitly Smi-typed field of an object
669 // (i.e., both the previous and new value are Smis). 633 // (i.e., both the previous and new value are Smis).
670 void StoreSmi(RawSmi* const* addr, RawSmi* value) const { 634 void StoreSmi(RawSmi* const* addr, RawSmi* value) const {
671 raw()->StoreSmi(addr, value); 635 raw()->StoreSmi(addr, value);
672 } 636 }
673 637
674 template<typename FieldType> 638 template <typename FieldType>
675 void StoreSimd128(const FieldType* addr, simd128_value_t value) const { 639 void StoreSimd128(const FieldType* addr, simd128_value_t value) const {
676 ASSERT(Contains(reinterpret_cast<uword>(addr))); 640 ASSERT(Contains(reinterpret_cast<uword>(addr)));
677 value.writeTo(const_cast<FieldType*>(addr)); 641 value.writeTo(const_cast<FieldType*>(addr));
678 } 642 }
679 643
680 // Needs two template arguments to allow assigning enums to fixed-size ints. 644 // Needs two template arguments to allow assigning enums to fixed-size ints.
681 template<typename FieldType, typename ValueType> 645 template <typename FieldType, typename ValueType>
682 void StoreNonPointer(const FieldType* addr, ValueType value) const { 646 void StoreNonPointer(const FieldType* addr, ValueType value) const {
683 // Can't use Contains, as it uses tags_, which is set through this method. 647 // Can't use Contains, as it uses tags_, which is set through this method.
684 ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(raw())); 648 ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(raw()));
685 *const_cast<FieldType*>(addr) = value; 649 *const_cast<FieldType*>(addr) = value;
686 } 650 }
687 651
688 // Provides non-const access to non-pointer fields within the object. Such 652 // Provides non-const access to non-pointer fields within the object. Such
689 // access does not need a write barrier, but it is *not* GC-safe, since the 653 // access does not need a write barrier, but it is *not* GC-safe, since the
690 // object might move, hence must be fully contained within a NoSafepointScope. 654 // object might move, hence must be fully contained within a NoSafepointScope.
691 template<typename FieldType> 655 template <typename FieldType>
692 FieldType* UnsafeMutableNonPointer(const FieldType* addr) const { 656 FieldType* UnsafeMutableNonPointer(const FieldType* addr) const {
693 // Allow pointers at the end of variable-length data, and disallow pointers 657 // Allow pointers at the end of variable-length data, and disallow pointers
694 // within the header word. 658 // within the header word.
695 ASSERT(Contains(reinterpret_cast<uword>(addr) - 1) && 659 ASSERT(Contains(reinterpret_cast<uword>(addr) - 1) &&
696 Contains(reinterpret_cast<uword>(addr) - kWordSize)); 660 Contains(reinterpret_cast<uword>(addr) - kWordSize));
697 // At least check that there is a NoSafepointScope and hope it's big enough. 661 // At least check that there is a NoSafepointScope and hope it's big enough.
698 ASSERT(Thread::Current()->no_safepoint_scope_depth() > 0); 662 ASSERT(Thread::Current()->no_safepoint_scope_depth() > 0);
699 return const_cast<FieldType*>(addr); 663 return const_cast<FieldType*>(addr);
700 } 664 }
701 665
702 // Fail at link time if StoreNonPointer or UnsafeMutableNonPointer is 666 // Fail at link time if StoreNonPointer or UnsafeMutableNonPointer is
703 // instantiated with an object pointer type. 667 // instantiated with an object pointer type.
704 #define STORE_NON_POINTER_ILLEGAL_TYPE(type) \ 668 #define STORE_NON_POINTER_ILLEGAL_TYPE(type) \
705 template<typename ValueType> \ 669 template <typename ValueType> \
706 void StoreNonPointer(Raw##type* const* addr, ValueType value) const { \ 670 void StoreNonPointer(Raw##type* const* addr, ValueType value) const { \
707 UnimplementedMethod(); \ 671 UnimplementedMethod(); \
708 } \ 672 } \
709 Raw##type** UnsafeMutableNonPointer(Raw##type* const* addr) const { \ 673 Raw##type** UnsafeMutableNonPointer(Raw##type* const* addr) const { \
710 UnimplementedMethod(); \ 674 UnimplementedMethod(); \
711 return NULL; \ 675 return NULL; \
712 } 676 }
713 677
714 CLASS_LIST(STORE_NON_POINTER_ILLEGAL_TYPE); 678 CLASS_LIST(STORE_NON_POINTER_ILLEGAL_TYPE);
715 void UnimplementedMethod() const; 679 void UnimplementedMethod() const;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 return reinterpret_cast<cpp_vtable*>(vtable_addr); 725 return reinterpret_cast<cpp_vtable*>(vtable_addr);
762 } 726 }
763 727
764 static cpp_vtable handle_vtable_; 728 static cpp_vtable handle_vtable_;
765 static cpp_vtable builtin_vtables_[kNumPredefinedCids]; 729 static cpp_vtable builtin_vtables_[kNumPredefinedCids];
766 730
767 // The static values below are singletons shared between the different 731 // The static values below are singletons shared between the different
768 // isolates. They are all allocated in the non-GC'd Dart::vm_isolate_. 732 // isolates. They are all allocated in the non-GC'd Dart::vm_isolate_.
769 static RawObject* null_; 733 static RawObject* null_;
770 734
771 static RawClass* class_class_; // Class of the Class vm object. 735 static RawClass* class_class_; // Class of the Class vm object.
772 static RawClass* dynamic_class_; // Class of the 'dynamic' type. 736 static RawClass* dynamic_class_; // Class of the 'dynamic' type.
773 static RawClass* void_class_; // Class of the 'void' type. 737 static RawClass* void_class_; // Class of the 'void' type.
774 static RawClass* unresolved_class_class_; // Class of UnresolvedClass. 738 static RawClass* unresolved_class_class_; // Class of UnresolvedClass.
775 static RawClass* type_arguments_class_; // Class of TypeArguments vm object. 739 static RawClass* type_arguments_class_; // Class of TypeArguments vm object.
776 static RawClass* patch_class_class_; // Class of the PatchClass vm object. 740 static RawClass* patch_class_class_; // Class of the PatchClass vm object.
777 static RawClass* function_class_; // Class of the Function vm object. 741 static RawClass* function_class_; // Class of the Function vm object.
778 static RawClass* closure_data_class_; // Class of ClosureData vm obj. 742 static RawClass* closure_data_class_; // Class of ClosureData vm obj.
779 static RawClass* redirection_data_class_; // Class of RedirectionData vm obj. 743 static RawClass* redirection_data_class_; // Class of RedirectionData vm obj.
780 static RawClass* field_class_; // Class of the Field vm object. 744 static RawClass* field_class_; // Class of the Field vm object.
781 static RawClass* literal_token_class_; // Class of LiteralToken vm object. 745 static RawClass* literal_token_class_; // Class of LiteralToken vm object.
782 static RawClass* token_stream_class_; // Class of the TokenStream vm object. 746 static RawClass* token_stream_class_; // Class of the TokenStream vm object.
783 static RawClass* script_class_; // Class of the Script vm object. 747 static RawClass* script_class_; // Class of the Script vm object.
784 static RawClass* library_class_; // Class of the Library vm object. 748 static RawClass* library_class_; // Class of the Library vm object.
785 static RawClass* namespace_class_; // Class of Namespace vm object. 749 static RawClass* namespace_class_; // Class of Namespace vm object.
786 static RawClass* code_class_; // Class of the Code vm object. 750 static RawClass* code_class_; // Class of the Code vm object.
787 static RawClass* instructions_class_; // Class of the Instructions vm object. 751 static RawClass* instructions_class_; // Class of the Instructions vm object.
788 static RawClass* object_pool_class_; // Class of the ObjectPool vm object. 752 static RawClass* object_pool_class_; // Class of the ObjectPool vm object.
789 static RawClass* pc_descriptors_class_; // Class of PcDescriptors vm object. 753 static RawClass* pc_descriptors_class_; // Class of PcDescriptors vm object.
790 static RawClass* code_source_map_class_; // Class of CodeSourceMap vm object. 754 static RawClass* code_source_map_class_; // Class of CodeSourceMap vm object.
791 static RawClass* stackmap_class_; // Class of Stackmap vm object. 755 static RawClass* stackmap_class_; // Class of Stackmap vm object.
792 static RawClass* var_descriptors_class_; // Class of LocalVarDescriptors. 756 static RawClass* var_descriptors_class_; // Class of LocalVarDescriptors.
793 static RawClass* exception_handlers_class_; // Class of ExceptionHandlers. 757 static RawClass* exception_handlers_class_; // Class of ExceptionHandlers.
794 static RawClass* deopt_info_class_; // Class of DeoptInfo. 758 static RawClass* deopt_info_class_; // Class of DeoptInfo.
795 static RawClass* context_class_; // Class of the Context vm object. 759 static RawClass* context_class_; // Class of the Context vm object.
796 static RawClass* context_scope_class_; // Class of ContextScope vm object. 760 static RawClass* context_scope_class_; // Class of ContextScope vm object.
797 static RawClass* singletargetcache_class_; // Class of SingleTargetCache. 761 static RawClass* singletargetcache_class_; // Class of SingleTargetCache.
798 static RawClass* unlinkedcall_class_; // Class of UnlinkedCall. 762 static RawClass* unlinkedcall_class_; // Class of UnlinkedCall.
799 static RawClass* icdata_class_; // Class of ICData. 763 static RawClass* icdata_class_; // Class of ICData.
800 static RawClass* megamorphic_cache_class_; // Class of MegamorphiCache. 764 static RawClass* megamorphic_cache_class_; // Class of MegamorphiCache.
801 static RawClass* subtypetestcache_class_; // Class of SubtypeTestCache. 765 static RawClass* subtypetestcache_class_; // Class of SubtypeTestCache.
802 static RawClass* api_error_class_; // Class of ApiError. 766 static RawClass* api_error_class_; // Class of ApiError.
803 static RawClass* language_error_class_; // Class of LanguageError. 767 static RawClass* language_error_class_; // Class of LanguageError.
804 static RawClass* unhandled_exception_class_; // Class of UnhandledException. 768 static RawClass* unhandled_exception_class_; // Class of UnhandledException.
805 static RawClass* unwind_error_class_; // Class of UnwindError. 769 static RawClass* unwind_error_class_; // Class of UnwindError.
806 770
807 // The static values below are read-only handle pointers for singleton 771 // The static values below are read-only handle pointers for singleton
808 // objects that are shared between the different isolates. 772 // objects that are shared between the different isolates.
809 static Object* null_object_; 773 static Object* null_object_;
810 static Array* null_array_; 774 static Array* null_array_;
811 static String* null_string_; 775 static String* null_string_;
812 static Instance* null_instance_; 776 static Instance* null_instance_;
813 static TypeArguments* null_type_arguments_; 777 static TypeArguments* null_type_arguments_;
814 static Array* empty_array_; 778 static Array* empty_array_;
815 static Array* zero_array_; 779 static Array* zero_array_;
(...skipping 25 matching lines...) Expand all
841 friend class SnapshotReader; 805 friend class SnapshotReader;
842 friend class InstanceDeserializationCluster; 806 friend class InstanceDeserializationCluster;
843 friend class OneByteString; 807 friend class OneByteString;
844 friend class TwoByteString; 808 friend class TwoByteString;
845 friend class ExternalOneByteString; 809 friend class ExternalOneByteString;
846 friend class ExternalTwoByteString; 810 friend class ExternalTwoByteString;
847 friend class Thread; 811 friend class Thread;
848 812
849 #define REUSABLE_FRIEND_DECLARATION(name) \ 813 #define REUSABLE_FRIEND_DECLARATION(name) \
850 friend class Reusable##name##HandleScope; 814 friend class Reusable##name##HandleScope;
851 REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) 815 REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
852 #undef REUSABLE_FRIEND_DECLARATION 816 #undef REUSABLE_FRIEND_DECLARATION
853 817
854 DISALLOW_ALLOCATION(); 818 DISALLOW_ALLOCATION();
855 DISALLOW_COPY_AND_ASSIGN(Object); 819 DISALLOW_COPY_AND_ASSIGN(Object);
856 }; 820 };
857 821
858 822
859 class PassiveObject : public Object { 823 class PassiveObject : public Object {
860 public: 824 public:
861 void operator=(RawObject* value) { 825 void operator=(RawObject* value) { raw_ = value; }
862 raw_ = value; 826 void operator^=(RawObject* value) { raw_ = value; }
863 }
864 void operator^=(RawObject* value) {
865 raw_ = value;
866 }
867 827
868 static PassiveObject& Handle(Zone* zone, RawObject* raw_ptr) { 828 static PassiveObject& Handle(Zone* zone, RawObject* raw_ptr) {
869 PassiveObject* obj = reinterpret_cast<PassiveObject*>( 829 PassiveObject* obj =
870 VMHandles::AllocateHandle(zone)); 830 reinterpret_cast<PassiveObject*>(VMHandles::AllocateHandle(zone));
871 obj->raw_ = raw_ptr; 831 obj->raw_ = raw_ptr;
872 obj->set_vtable(0); 832 obj->set_vtable(0);
873 return *obj; 833 return *obj;
874 } 834 }
875 static PassiveObject& Handle(RawObject* raw_ptr) { 835 static PassiveObject& Handle(RawObject* raw_ptr) {
876 return Handle(Thread::Current()->zone(), raw_ptr); 836 return Handle(Thread::Current()->zone(), raw_ptr);
877 } 837 }
878 static PassiveObject& Handle() { 838 static PassiveObject& Handle() {
879 return Handle(Thread::Current()->zone(), Object::null()); 839 return Handle(Thread::Current()->zone(), Object::null());
880 } 840 }
881 static PassiveObject& Handle(Zone* zone) { 841 static PassiveObject& Handle(Zone* zone) {
882 return Handle(zone, Object::null()); 842 return Handle(zone, Object::null());
883 } 843 }
884 static PassiveObject& ZoneHandle(Zone* zone, RawObject* raw_ptr) { 844 static PassiveObject& ZoneHandle(Zone* zone, RawObject* raw_ptr) {
885 PassiveObject* obj = reinterpret_cast<PassiveObject*>( 845 PassiveObject* obj =
886 VMHandles::AllocateZoneHandle(zone)); 846 reinterpret_cast<PassiveObject*>(VMHandles::AllocateZoneHandle(zone));
887 obj->raw_ = raw_ptr; 847 obj->raw_ = raw_ptr;
888 obj->set_vtable(0); 848 obj->set_vtable(0);
889 return *obj; 849 return *obj;
890 } 850 }
891 static PassiveObject& ZoneHandle(RawObject* raw_ptr) { 851 static PassiveObject& ZoneHandle(RawObject* raw_ptr) {
892 return ZoneHandle(Thread::Current()->zone(), raw_ptr); 852 return ZoneHandle(Thread::Current()->zone(), raw_ptr);
893 } 853 }
894 static PassiveObject& ZoneHandle() { 854 static PassiveObject& ZoneHandle() {
895 return ZoneHandle(Thread::Current()->zone(), Object::null()); 855 return ZoneHandle(Thread::Current()->zone(), Object::null());
896 } 856 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 // class C<R> extends B<R, int> 947 // class C<R> extends B<R, int>
988 // C.DeclarationType() --> C [R, int, R] 948 // C.DeclarationType() --> C [R, int, R]
989 RawAbstractType* DeclarationType() const; 949 RawAbstractType* DeclarationType() const;
990 950
991 RawLibrary* library() const { return raw_ptr()->library_; } 951 RawLibrary* library() const { return raw_ptr()->library_; }
992 void set_library(const Library& value) const; 952 void set_library(const Library& value) const;
993 953
994 // The type parameters (and their bounds) are specified as an array of 954 // The type parameters (and their bounds) are specified as an array of
995 // TypeParameter. 955 // TypeParameter.
996 RawTypeArguments* type_parameters() const { 956 RawTypeArguments* type_parameters() const {
997 return raw_ptr()->type_parameters_; 957 return raw_ptr()->type_parameters_;
998 } 958 }
999 void set_type_parameters(const TypeArguments& value) const; 959 void set_type_parameters(const TypeArguments& value) const;
1000 intptr_t NumTypeParameters(Thread* thread) const; 960 intptr_t NumTypeParameters(Thread* thread) const;
1001 intptr_t NumTypeParameters() const { 961 intptr_t NumTypeParameters() const {
1002 return NumTypeParameters(Thread::Current()); 962 return NumTypeParameters(Thread::Current());
1003 } 963 }
1004 static intptr_t type_parameters_offset() { 964 static intptr_t type_parameters_offset() {
1005 return OFFSET_OF(RawClass, type_parameters_); 965 return OFFSET_OF(RawClass, type_parameters_);
1006 } 966 }
1007 967
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1103 // Check if this class represents the 'void' class. 1063 // Check if this class represents the 'void' class.
1104 bool IsVoidClass() const { return id() == kVoidCid; } 1064 bool IsVoidClass() const { return id() == kVoidCid; }
1105 1065
1106 // Check if this class represents the 'Object' class. 1066 // Check if this class represents the 'Object' class.
1107 bool IsObjectClass() const { return id() == kInstanceCid; } 1067 bool IsObjectClass() const { return id() == kInstanceCid; }
1108 1068
1109 // Check if this class represents the 'Function' class. 1069 // Check if this class represents the 'Function' class.
1110 bool IsDartFunctionClass() const; 1070 bool IsDartFunctionClass() const;
1111 1071
1112 // Check if this class represents the 'Closure' class. 1072 // Check if this class represents the 'Closure' class.
1113 bool IsClosureClass() const { return id() == kClosureCid; } 1073 bool IsClosureClass() const { return id() == kClosureCid; }
1114 static bool IsClosureClass(RawClass* cls) { 1074 static bool IsClosureClass(RawClass* cls) {
1115 NoSafepointScope no_safepoint; 1075 NoSafepointScope no_safepoint;
1116 return cls->ptr()->id_ == kClosureCid; 1076 return cls->ptr()->id_ == kClosureCid;
1117 } 1077 }
1118 1078
1119 // Check if this class represents a typedef class. 1079 // Check if this class represents a typedef class.
1120 bool IsTypedefClass() const { 1080 bool IsTypedefClass() const { return signature_function() != Object::null(); }
1121 return signature_function() != Object::null();
1122 }
1123 1081
1124 static bool IsInFullSnapshot(RawClass* cls) { 1082 static bool IsInFullSnapshot(RawClass* cls) {
1125 NoSafepointScope no_safepoint; 1083 NoSafepointScope no_safepoint;
1126 return cls->ptr()->library_->ptr()->is_in_fullsnapshot_; 1084 return cls->ptr()->library_->ptr()->is_in_fullsnapshot_;
1127 } 1085 }
1128 1086
1129 // Check the subtype relationship. 1087 // Check the subtype relationship.
1130 bool IsSubtypeOf(const TypeArguments& type_arguments, 1088 bool IsSubtypeOf(const TypeArguments& type_arguments,
1131 const Class& other, 1089 const Class& other,
1132 const TypeArguments& other_type_arguments, 1090 const TypeArguments& other_type_arguments,
1133 Error* bound_error, 1091 Error* bound_error,
1134 TrailPtr bound_trail, 1092 TrailPtr bound_trail,
1135 Heap::Space space) const { 1093 Heap::Space space) const {
1136 return TypeTest(kIsSubtypeOf, 1094 return TypeTest(kIsSubtypeOf, type_arguments, other, other_type_arguments,
1137 type_arguments, 1095 bound_error, bound_trail, space);
1138 other,
1139 other_type_arguments,
1140 bound_error,
1141 bound_trail,
1142 space);
1143 } 1096 }
1144 1097
1145 // Check the 'more specific' relationship. 1098 // Check the 'more specific' relationship.
1146 bool IsMoreSpecificThan(const TypeArguments& type_arguments, 1099 bool IsMoreSpecificThan(const TypeArguments& type_arguments,
1147 const Class& other, 1100 const Class& other,
1148 const TypeArguments& other_type_arguments, 1101 const TypeArguments& other_type_arguments,
1149 Error* bound_error, 1102 Error* bound_error,
1150 TrailPtr bound_trail, 1103 TrailPtr bound_trail,
1151 Heap::Space space) const { 1104 Heap::Space space) const {
1152 return TypeTest(kIsMoreSpecificThan, 1105 return TypeTest(kIsMoreSpecificThan, type_arguments, other,
1153 type_arguments, 1106 other_type_arguments, bound_error, bound_trail, space);
1154 other,
1155 other_type_arguments,
1156 bound_error,
1157 bound_trail,
1158 space);
1159 } 1107 }
1160 1108
1161 // Check if this is the top level class. 1109 // Check if this is the top level class.
1162 bool IsTopLevel() const; 1110 bool IsTopLevel() const;
1163 1111
1164 bool IsPrivate() const; 1112 bool IsPrivate() const;
1165 1113
1166 // Returns an array of instance and static fields defined by this class. 1114 // Returns an array of instance and static fields defined by this class.
1167 RawArray* fields() const { return raw_ptr()->fields_; } 1115 RawArray* fields() const { return raw_ptr()->fields_; }
1168 void SetFields(const Array& value) const; 1116 void SetFields(const Array& value) const;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1206 RawField* LookupInstanceFieldAllowPrivate(const String& name) const; 1154 RawField* LookupInstanceFieldAllowPrivate(const String& name) const;
1207 RawField* LookupStaticFieldAllowPrivate(const String& name) const; 1155 RawField* LookupStaticFieldAllowPrivate(const String& name) const;
1208 1156
1209 RawLibraryPrefix* LookupLibraryPrefix(const String& name) const; 1157 RawLibraryPrefix* LookupLibraryPrefix(const String& name) const;
1210 1158
1211 // Returns an instance of Double or Double::null(). 1159 // Returns an instance of Double or Double::null().
1212 // 'index' points to either: 1160 // 'index' points to either:
1213 // - constants_list_ position of found element, or 1161 // - constants_list_ position of found element, or
1214 // - constants_list_ position where new canonical can be inserted. 1162 // - constants_list_ position where new canonical can be inserted.
1215 RawDouble* LookupCanonicalDouble(Zone* zone, 1163 RawDouble* LookupCanonicalDouble(Zone* zone,
1216 double value, intptr_t* index) const; 1164 double value,
1165 intptr_t* index) const;
1217 RawMint* LookupCanonicalMint(Zone* zone, 1166 RawMint* LookupCanonicalMint(Zone* zone,
1218 int64_t value, intptr_t* index) const; 1167 int64_t value,
1168 intptr_t* index) const;
1219 RawBigint* LookupCanonicalBigint(Zone* zone, 1169 RawBigint* LookupCanonicalBigint(Zone* zone,
1220 const Bigint& value, intptr_t* index) const; 1170 const Bigint& value,
1171 intptr_t* index) const;
1221 // The methods above are more efficient than this generic one. 1172 // The methods above are more efficient than this generic one.
1222 RawInstance* LookupCanonicalInstance(Zone* zone, 1173 RawInstance* LookupCanonicalInstance(Zone* zone, const Instance& value) const;
1223 const Instance& value) const;
1224 1174
1225 RawInstance* InsertCanonicalConstant(Zone* zone, 1175 RawInstance* InsertCanonicalConstant(Zone* zone,
1226 const Instance& constant) const; 1176 const Instance& constant) const;
1227 void InsertCanonicalNumber(Zone* zone, 1177 void InsertCanonicalNumber(Zone* zone,
1228 intptr_t index, 1178 intptr_t index,
1229 const Number& constant) const; 1179 const Number& constant) const;
1230 1180
1231 void RehashConstants(Zone* zone) const; 1181 void RehashConstants(Zone* zone) const;
1232 1182
1233 static intptr_t InstanceSize() { 1183 static intptr_t InstanceSize() {
1234 return RoundedAllocationSize(sizeof(RawClass)); 1184 return RoundedAllocationSize(sizeof(RawClass));
1235 } 1185 }
1236 1186
1237 bool is_implemented() const { 1187 bool is_implemented() const {
1238 return ImplementedBit::decode(raw_ptr()->state_bits_); 1188 return ImplementedBit::decode(raw_ptr()->state_bits_);
1239 } 1189 }
1240 void set_is_implemented() const; 1190 void set_is_implemented() const;
1241 1191
1242 bool is_abstract() const { 1192 bool is_abstract() const {
1243 return AbstractBit::decode(raw_ptr()->state_bits_); 1193 return AbstractBit::decode(raw_ptr()->state_bits_);
1244 } 1194 }
1245 void set_is_abstract() const; 1195 void set_is_abstract() const;
1246 1196
1247 bool is_type_finalized() const { 1197 bool is_type_finalized() const {
1248 return TypeFinalizedBit::decode(raw_ptr()->state_bits_); 1198 return TypeFinalizedBit::decode(raw_ptr()->state_bits_);
1249 } 1199 }
1250 void set_is_type_finalized() const; 1200 void set_is_type_finalized() const;
1251 1201
1252 bool is_patch() const { 1202 bool is_patch() const { return PatchBit::decode(raw_ptr()->state_bits_); }
1253 return PatchBit::decode(raw_ptr()->state_bits_);
1254 }
1255 void set_is_patch() const; 1203 void set_is_patch() const;
1256 1204
1257 bool is_synthesized_class() const { 1205 bool is_synthesized_class() const {
1258 return SynthesizedClassBit::decode(raw_ptr()->state_bits_); 1206 return SynthesizedClassBit::decode(raw_ptr()->state_bits_);
1259 } 1207 }
1260 void set_is_synthesized_class() const; 1208 void set_is_synthesized_class() const;
1261 1209
1262 bool is_enum_class() const { 1210 bool is_enum_class() const { return EnumBit::decode(raw_ptr()->state_bits_); }
1263 return EnumBit::decode(raw_ptr()->state_bits_);
1264 }
1265 void set_is_enum_class() const; 1211 void set_is_enum_class() const;
1266 1212
1267 bool is_finalized() const { 1213 bool is_finalized() const {
1268 return ClassFinalizedBits::decode(raw_ptr()->state_bits_) 1214 return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
1269 == RawClass::kFinalized; 1215 RawClass::kFinalized;
1270 } 1216 }
1271 void set_is_finalized() const; 1217 void set_is_finalized() const;
1272 1218
1273 bool is_prefinalized() const { 1219 bool is_prefinalized() const {
1274 return ClassFinalizedBits::decode(raw_ptr()->state_bits_) 1220 return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
1275 == RawClass::kPreFinalized; 1221 RawClass::kPreFinalized;
1276 } 1222 }
1277 1223
1278 void set_is_prefinalized() const; 1224 void set_is_prefinalized() const;
1279 1225
1280 bool is_refinalize_after_patch() const { 1226 bool is_refinalize_after_patch() const {
1281 return ClassFinalizedBits::decode(raw_ptr()->state_bits_) 1227 return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
1282 == RawClass::kRefinalizeAfterPatch; 1228 RawClass::kRefinalizeAfterPatch;
1283 } 1229 }
1284 1230
1285 void SetRefinalizeAfterPatch() const; 1231 void SetRefinalizeAfterPatch() const;
1286 void ResetFinalization() const; 1232 void ResetFinalization() const;
1287 1233
1288 bool is_marked_for_parsing() const { 1234 bool is_marked_for_parsing() const {
1289 return MarkedForParsingBit::decode(raw_ptr()->state_bits_); 1235 return MarkedForParsingBit::decode(raw_ptr()->state_bits_);
1290 } 1236 }
1291 void set_is_marked_for_parsing() const; 1237 void set_is_marked_for_parsing() const;
1292 void reset_is_marked_for_parsing() const; 1238 void reset_is_marked_for_parsing() const;
(...skipping 19 matching lines...) Expand all
1312 bool is_cycle_free() const { 1258 bool is_cycle_free() const {
1313 return CycleFreeBit::decode(raw_ptr()->state_bits_); 1259 return CycleFreeBit::decode(raw_ptr()->state_bits_);
1314 } 1260 }
1315 void set_is_cycle_free() const; 1261 void set_is_cycle_free() const;
1316 1262
1317 bool is_allocated() const { 1263 bool is_allocated() const {
1318 return IsAllocatedBit::decode(raw_ptr()->state_bits_); 1264 return IsAllocatedBit::decode(raw_ptr()->state_bits_);
1319 } 1265 }
1320 void set_is_allocated(bool value) const; 1266 void set_is_allocated(bool value) const;
1321 1267
1322 uint16_t num_native_fields() const { 1268 uint16_t num_native_fields() const { return raw_ptr()->num_native_fields_; }
1323 return raw_ptr()->num_native_fields_;
1324 }
1325 void set_num_native_fields(uint16_t value) const { 1269 void set_num_native_fields(uint16_t value) const {
1326 StoreNonPointer(&raw_ptr()->num_native_fields_, value); 1270 StoreNonPointer(&raw_ptr()->num_native_fields_, value);
1327 } 1271 }
1328 1272
1329 RawCode* allocation_stub() const { 1273 RawCode* allocation_stub() const { return raw_ptr()->allocation_stub_; }
1330 return raw_ptr()->allocation_stub_;
1331 }
1332 void set_allocation_stub(const Code& value) const; 1274 void set_allocation_stub(const Code& value) const;
1333 1275
1334 void DisableAllocationStub() const; 1276 void DisableAllocationStub() const;
1335 1277
1336 RawArray* constants() const; 1278 RawArray* constants() const;
1337 void set_constants(const Array& value) const; 1279 void set_constants(const Array& value) const;
1338 1280
1339 intptr_t FindInvocationDispatcherFunctionIndex(const Function& needle) const; 1281 intptr_t FindInvocationDispatcherFunctionIndex(const Function& needle) const;
1340 RawFunction* InvocationDispatcherFunctionFromIndex(intptr_t idx) const; 1282 RawFunction* InvocationDispatcherFunctionFromIndex(intptr_t idx) const;
1341 1283
(...skipping 13 matching lines...) Expand all
1355 // error object if evaluating the expression fails. The method has 1297 // error object if evaluating the expression fails. The method has
1356 // the formal parameters given in param_names, and is invoked with 1298 // the formal parameters given in param_names, and is invoked with
1357 // the argument values given in param_values. 1299 // the argument values given in param_values.
1358 RawObject* Evaluate(const String& expr, 1300 RawObject* Evaluate(const String& expr,
1359 const Array& param_names, 1301 const Array& param_names,
1360 const Array& param_values) const; 1302 const Array& param_values) const;
1361 1303
1362 RawError* EnsureIsFinalized(Thread* thread) const; 1304 RawError* EnsureIsFinalized(Thread* thread) const;
1363 1305
1364 // Allocate a class used for VM internal objects. 1306 // Allocate a class used for VM internal objects.
1365 template <class FakeObject> static RawClass* New(); 1307 template <class FakeObject>
1308 static RawClass* New();
1366 1309
1367 // Allocate instance classes. 1310 // Allocate instance classes.
1368 static RawClass* New(const Library& lib, 1311 static RawClass* New(const Library& lib,
1369 const String& name, 1312 const String& name,
1370 const Script& script, 1313 const Script& script,
1371 TokenPosition token_pos); 1314 TokenPosition token_pos);
1372 static RawClass* NewNativeWrapper(const Library& library, 1315 static RawClass* NewNativeWrapper(const Library& library,
1373 const String& name, 1316 const String& name,
1374 int num_fields); 1317 int num_fields);
1375 1318
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 1359
1417 private: 1360 private:
1418 bool CanReloadFinalized(const Class& replacement, 1361 bool CanReloadFinalized(const Class& replacement,
1419 IsolateReloadContext* context) const; 1362 IsolateReloadContext* context) const;
1420 bool CanReloadPreFinalized(const Class& replacement, 1363 bool CanReloadPreFinalized(const Class& replacement,
1421 IsolateReloadContext* context) const; 1364 IsolateReloadContext* context) const;
1422 1365
1423 // Tells whether instances need morphing for reload. 1366 // Tells whether instances need morphing for reload.
1424 bool RequiresInstanceMorphing(const Class& replacement) const; 1367 bool RequiresInstanceMorphing(const Class& replacement) const;
1425 1368
1426 template <class FakeObject> static RawClass* NewCommon(intptr_t index); 1369 template <class FakeObject>
1370 static RawClass* NewCommon(intptr_t index);
1427 1371
1428 enum MemberKind { 1372 enum MemberKind {
1429 kAny = 0, 1373 kAny = 0,
1430 kStatic, 1374 kStatic,
1431 kInstance, 1375 kInstance,
1432 kInstanceAllowAbstract, 1376 kInstanceAllowAbstract,
1433 kConstructor, 1377 kConstructor,
1434 kFactory, 1378 kFactory,
1435 }; 1379 };
1436 enum StateBits { 1380 enum StateBits {
1437 kConstBit = 0, 1381 kConstBit = 0,
1438 kImplementedBit = 1, 1382 kImplementedBit = 1,
1439 kTypeFinalizedBit = 2, 1383 kTypeFinalizedBit = 2,
1440 kClassFinalizedPos = 3, 1384 kClassFinalizedPos = 3,
1441 kClassFinalizedSize = 2, 1385 kClassFinalizedSize = 2,
1442 kAbstractBit = kClassFinalizedPos + kClassFinalizedSize, // = 5 1386 kAbstractBit = kClassFinalizedPos + kClassFinalizedSize, // = 5
1443 kPatchBit = 6, 1387 kPatchBit = 6,
1444 kSynthesizedClassBit = 7, 1388 kSynthesizedClassBit = 7,
1445 kMarkedForParsingBit = 8, 1389 kMarkedForParsingBit = 8,
1446 kMixinAppAliasBit = 9, 1390 kMixinAppAliasBit = 9,
1447 kMixinTypeAppliedBit = 10, 1391 kMixinTypeAppliedBit = 10,
1448 kFieldsMarkedNullableBit = 11, 1392 kFieldsMarkedNullableBit = 11,
1449 kCycleFreeBit = 12, 1393 kCycleFreeBit = 12,
1450 kEnumBit = 13, 1394 kEnumBit = 13,
1451 kIsAllocatedBit = 15, 1395 kIsAllocatedBit = 15,
1452 }; 1396 };
1453 class ConstBit : public BitField<uint16_t, bool, kConstBit, 1> {}; 1397 class ConstBit : public BitField<uint16_t, bool, kConstBit, 1> {};
1454 class ImplementedBit : public BitField<uint16_t, bool, kImplementedBit, 1> {}; 1398 class ImplementedBit : public BitField<uint16_t, bool, kImplementedBit, 1> {};
1455 class TypeFinalizedBit : 1399 class TypeFinalizedBit
1456 public BitField<uint16_t, bool, kTypeFinalizedBit, 1> {}; 1400 : public BitField<uint16_t, bool, kTypeFinalizedBit, 1> {};
1457 class ClassFinalizedBits : public BitField<uint16_t, 1401 class ClassFinalizedBits : public BitField<uint16_t,
1458 RawClass::ClassFinalizedState, 1402 RawClass::ClassFinalizedState,
1459 kClassFinalizedPos, 1403 kClassFinalizedPos,
1460 kClassFinalizedSize> {}; 1404 kClassFinalizedSize> {};
1461 class AbstractBit : public BitField<uint16_t, bool, kAbstractBit, 1> {}; 1405 class AbstractBit : public BitField<uint16_t, bool, kAbstractBit, 1> {};
1462 class PatchBit : public BitField<uint16_t, bool, kPatchBit, 1> {}; 1406 class PatchBit : public BitField<uint16_t, bool, kPatchBit, 1> {};
1463 class SynthesizedClassBit : 1407 class SynthesizedClassBit
1464 public BitField<uint16_t, bool, kSynthesizedClassBit, 1> {}; 1408 : public BitField<uint16_t, bool, kSynthesizedClassBit, 1> {};
1465 class MarkedForParsingBit : 1409 class MarkedForParsingBit
1466 public BitField<uint16_t, bool, kMarkedForParsingBit, 1> {}; 1410 : public BitField<uint16_t, bool, kMarkedForParsingBit, 1> {};
1467 class MixinAppAliasBit : 1411 class MixinAppAliasBit
1468 public BitField<uint16_t, bool, kMixinAppAliasBit, 1> {}; 1412 : public BitField<uint16_t, bool, kMixinAppAliasBit, 1> {};
1469 class MixinTypeAppliedBit : 1413 class MixinTypeAppliedBit
1470 public BitField<uint16_t, bool, kMixinTypeAppliedBit, 1> {}; 1414 : public BitField<uint16_t, bool, kMixinTypeAppliedBit, 1> {};
1471 class FieldsMarkedNullableBit : 1415 class FieldsMarkedNullableBit
1472 public BitField<uint16_t, bool, kFieldsMarkedNullableBit, 1> {}; 1416 : public BitField<uint16_t, bool, kFieldsMarkedNullableBit, 1> {};
1473 class CycleFreeBit : public BitField<uint16_t, bool, kCycleFreeBit, 1> {}; 1417 class CycleFreeBit : public BitField<uint16_t, bool, kCycleFreeBit, 1> {};
1474 class EnumBit : public BitField<uint16_t, bool, kEnumBit, 1> {}; 1418 class EnumBit : public BitField<uint16_t, bool, kEnumBit, 1> {};
1475 class IsAllocatedBit : public BitField<uint16_t, bool, kIsAllocatedBit, 1> {}; 1419 class IsAllocatedBit : public BitField<uint16_t, bool, kIsAllocatedBit, 1> {};
1476 1420
1477 void set_name(const String& value) const; 1421 void set_name(const String& value) const;
1478 void set_user_name(const String& value) const; 1422 void set_user_name(const String& value) const;
1479 RawString* GenerateUserVisibleName() const; 1423 RawString* GenerateUserVisibleName() const;
1480 void set_state_bits(intptr_t bits) const; 1424 void set_state_bits(intptr_t bits) const;
1481 1425
1482 void set_canonical_type(const Type& value) const; 1426 void set_canonical_type(const Type& value) const;
1483 RawType* canonical_type() const; 1427 RawType* canonical_type() const;
1484 1428
1485 RawArray* invocation_dispatcher_cache() const; 1429 RawArray* invocation_dispatcher_cache() const;
1486 void set_invocation_dispatcher_cache(const Array& cache) const; 1430 void set_invocation_dispatcher_cache(const Array& cache) const;
1487 RawFunction* CreateInvocationDispatcher(const String& target_name, 1431 RawFunction* CreateInvocationDispatcher(const String& target_name,
1488 const Array& args_desc, 1432 const Array& args_desc,
1489 RawFunction::Kind kind) const; 1433 RawFunction::Kind kind) const;
1490 1434
1491 void CalculateFieldOffsets() const; 1435 void CalculateFieldOffsets() const;
1492 1436
1493 // functions_hash_table is in use iff there are at least this many functions. 1437 // functions_hash_table is in use iff there are at least this many functions.
1494 static const intptr_t kFunctionLookupHashTreshold = 16; 1438 static const intptr_t kFunctionLookupHashTreshold = 16;
1495 1439
1496 // Initial value for the cached number of type arguments. 1440 // Initial value for the cached number of type arguments.
1497 static const intptr_t kUnknownNumTypeArguments = -1; 1441 static const intptr_t kUnknownNumTypeArguments = -1;
1498 1442
1499 int16_t num_type_arguments() const { 1443 int16_t num_type_arguments() const { return raw_ptr()->num_type_arguments_; }
1500 return raw_ptr()->num_type_arguments_;
1501 }
1502 void set_num_type_arguments(intptr_t value) const; 1444 void set_num_type_arguments(intptr_t value) const;
1503 static intptr_t num_type_arguments_offset() { 1445 static intptr_t num_type_arguments_offset() {
1504 return OFFSET_OF(RawClass, num_type_arguments_); 1446 return OFFSET_OF(RawClass, num_type_arguments_);
1505 } 1447 }
1506 1448
1507 int16_t num_own_type_arguments() const { 1449 int16_t num_own_type_arguments() const {
1508 return raw_ptr()->num_own_type_arguments_; 1450 return raw_ptr()->num_own_type_arguments_;
1509 } 1451 }
1510 void set_num_own_type_arguments(intptr_t value) const; 1452 void set_num_own_type_arguments(intptr_t value) const;
1511 1453
1512 // Assigns empty array to all raw class array fields. 1454 // Assigns empty array to all raw class array fields.
1513 void InitEmptyFields(); 1455 void InitEmptyFields();
1514 1456
1515 static RawFunction* CheckFunctionType(const Function& func, MemberKind kind); 1457 static RawFunction* CheckFunctionType(const Function& func, MemberKind kind);
1516 RawFunction* LookupFunction(const String& name, MemberKind kind) const; 1458 RawFunction* LookupFunction(const String& name, MemberKind kind) const;
1517 RawFunction* LookupFunctionAllowPrivate(const String& name, 1459 RawFunction* LookupFunctionAllowPrivate(const String& name,
1518 MemberKind kind) const; 1460 MemberKind kind) const;
1519 RawField* LookupField(const String& name, MemberKind kind) const; 1461 RawField* LookupField(const String& name, MemberKind kind) const;
1520 1462
1521 RawFunction* LookupAccessorFunction(const char* prefix, 1463 RawFunction* LookupAccessorFunction(const char* prefix,
1522 intptr_t prefix_length, 1464 intptr_t prefix_length,
1523 const String& name) const; 1465 const String& name) const;
1524 1466
1525 // Allocate an instance class which has a VM implementation. 1467 // Allocate an instance class which has a VM implementation.
1526 template <class FakeInstance> static RawClass* New(intptr_t id); 1468 template <class FakeInstance>
1469 static RawClass* New(intptr_t id);
1527 1470
1528 // Helper that calls 'Class::New<Instance>(kIllegalCid)'. 1471 // Helper that calls 'Class::New<Instance>(kIllegalCid)'.
1529 static RawClass* NewInstanceClass(); 1472 static RawClass* NewInstanceClass();
1530 1473
1531 // Check the subtype or 'more specific' relationship. 1474 // Check the subtype or 'more specific' relationship.
1532 bool TypeTest(TypeTestKind test_kind, 1475 bool TypeTest(TypeTestKind test_kind,
1533 const TypeArguments& type_arguments, 1476 const TypeArguments& type_arguments,
1534 const Class& other, 1477 const Class& other,
1535 const TypeArguments& other_type_arguments, 1478 const TypeArguments& other_type_arguments,
1536 Error* bound_error, 1479 Error* bound_error,
1537 TrailPtr bound_trail, 1480 TrailPtr bound_trail,
1538 Heap::Space space) const; 1481 Heap::Space space) const;
1539 1482
1540 static bool TypeTestNonRecursive( 1483 static bool TypeTestNonRecursive(const Class& cls,
1541 const Class& cls, 1484 TypeTestKind test_kind,
1542 TypeTestKind test_kind, 1485 const TypeArguments& type_arguments,
1543 const TypeArguments& type_arguments, 1486 const Class& other,
1544 const Class& other, 1487 const TypeArguments& other_type_arguments,
1545 const TypeArguments& other_type_arguments, 1488 Error* bound_error,
1546 Error* bound_error, 1489 TrailPtr bound_trail,
1547 TrailPtr bound_trail, 1490 Heap::Space space);
1548 Heap::Space space);
1549 1491
1550 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); 1492 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object);
1551 friend class AbstractType; 1493 friend class AbstractType;
1552 friend class Instance; 1494 friend class Instance;
1553 friend class Object; 1495 friend class Object;
1554 friend class Type; 1496 friend class Type;
1555 friend class Intrinsifier; 1497 friend class Intrinsifier;
1556 friend class Precompiler; 1498 friend class Precompiler;
1557 }; 1499 };
1558 1500
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1593 class TypeArguments : public Object { 1535 class TypeArguments : public Object {
1594 public: 1536 public:
1595 // We use 30 bits for the hash code so hashes in a snapshot taken on a 1537 // We use 30 bits for the hash code so hashes in a snapshot taken on a
1596 // 64-bit architecture stay in Smi range when loaded on a 32-bit 1538 // 64-bit architecture stay in Smi range when loaded on a 32-bit
1597 // architecture. 1539 // architecture.
1598 static const intptr_t kHashBits = 30; 1540 static const intptr_t kHashBits = 30;
1599 1541
1600 intptr_t Length() const; 1542 intptr_t Length() const;
1601 RawAbstractType* TypeAt(intptr_t index) const; 1543 RawAbstractType* TypeAt(intptr_t index) const;
1602 static intptr_t type_at_offset(intptr_t index) { 1544 static intptr_t type_at_offset(intptr_t index) {
1603 return OFFSET_OF_RETURNED_VALUE( 1545 return OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types) +
1604 RawTypeArguments, types) + index * kWordSize; 1546 index * kWordSize;
1605 } 1547 }
1606 void SetTypeAt(intptr_t index, const AbstractType& value) const; 1548 void SetTypeAt(intptr_t index, const AbstractType& value) const;
1607 1549
1608 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>". 1550 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
1609 RawString* Name() const { 1551 RawString* Name() const { return SubvectorName(0, Length(), kInternalName); }
1610 return SubvectorName(0, Length(), kInternalName);
1611 }
1612 1552
1613 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>". 1553 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>".
1614 // Names of internal classes are mapped to their public interfaces. 1554 // Names of internal classes are mapped to their public interfaces.
1615 RawString* UserVisibleName() const { 1555 RawString* UserVisibleName() const {
1616 return SubvectorName(0, Length(), kUserVisibleName); 1556 return SubvectorName(0, Length(), kUserVisibleName);
1617 } 1557 }
1618 1558
1619 // Check if the subvector of length 'len' starting at 'from_index' of this 1559 // Check if the subvector of length 'len' starting at 'from_index' of this
1620 // type argument vector consists solely of DynamicType. 1560 // type argument vector consists solely of DynamicType.
1621 bool IsRaw(intptr_t from_index, intptr_t len) const { 1561 bool IsRaw(intptr_t from_index, intptr_t len) const {
1622 return IsDynamicTypes(false, from_index, len); 1562 return IsDynamicTypes(false, from_index, len);
1623 } 1563 }
1624 1564
1625 // Check if this type argument vector would consist solely of DynamicType if 1565 // Check if this type argument vector would consist solely of DynamicType if
1626 // it was instantiated from a raw (null) instantiator, i.e. consider each type 1566 // it was instantiated from a raw (null) instantiator, i.e. consider each type
1627 // parameter as it would be first instantiated from a vector of dynamic types. 1567 // parameter as it would be first instantiated from a vector of dynamic types.
1628 // Consider only a prefix of length 'len'. 1568 // Consider only a prefix of length 'len'.
1629 bool IsRawInstantiatedRaw(intptr_t len) const { 1569 bool IsRawInstantiatedRaw(intptr_t len) const {
1630 return IsDynamicTypes(true, 0, len); 1570 return IsDynamicTypes(true, 0, len);
1631 } 1571 }
1632 1572
1633 // Check the subtype relationship, considering only a subvector of length 1573 // Check the subtype relationship, considering only a subvector of length
1634 // 'len' starting at 'from_index'. 1574 // 'len' starting at 'from_index'.
1635 bool IsSubtypeOf(const TypeArguments& other, 1575 bool IsSubtypeOf(const TypeArguments& other,
1636 intptr_t from_index, 1576 intptr_t from_index,
1637 intptr_t len, 1577 intptr_t len,
1638 Error* bound_error, 1578 Error* bound_error,
1639 TrailPtr bound_trail, 1579 TrailPtr bound_trail,
1640 Heap::Space space) const { 1580 Heap::Space space) const {
1641 return TypeTest(kIsSubtypeOf, other, from_index, len, 1581 return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error,
1642 bound_error, bound_trail, space); 1582 bound_trail, space);
1643 } 1583 }
1644 1584
1645 // Check the 'more specific' relationship, considering only a subvector of 1585 // Check the 'more specific' relationship, considering only a subvector of
1646 // length 'len' starting at 'from_index'. 1586 // length 'len' starting at 'from_index'.
1647 bool IsMoreSpecificThan(const TypeArguments& other, 1587 bool IsMoreSpecificThan(const TypeArguments& other,
1648 intptr_t from_index, 1588 intptr_t from_index,
1649 intptr_t len, 1589 intptr_t len,
1650 Error* bound_error, 1590 Error* bound_error,
1651 TrailPtr bound_trail, 1591 TrailPtr bound_trail,
1652 Heap::Space space) const { 1592 Heap::Space space) const {
1653 return TypeTest(kIsMoreSpecificThan, other, from_index, len, 1593 return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error,
1654 bound_error, bound_trail, space); 1594 bound_trail, space);
1655 } 1595 }
1656 1596
1657 // Check if the vectors are equal (they may be null). 1597 // Check if the vectors are equal (they may be null).
1658 bool Equals(const TypeArguments& other) const { 1598 bool Equals(const TypeArguments& other) const {
1659 return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length()); 1599 return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length());
1660 } 1600 }
1661 1601
1662 bool IsEquivalent(const TypeArguments& other, TrailPtr trail = NULL) const { 1602 bool IsEquivalent(const TypeArguments& other, TrailPtr trail = NULL) const {
1663 return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length(), trail); 1603 return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length(), trail);
1664 } 1604 }
(...skipping 21 matching lines...) Expand all
1686 // Return true if this vector contains a recursive type argument. 1626 // Return true if this vector contains a recursive type argument.
1687 bool IsRecursive() const; 1627 bool IsRecursive() const;
1688 1628
1689 // Clone this type argument vector and clone all unfinalized type arguments. 1629 // Clone this type argument vector and clone all unfinalized type arguments.
1690 // Finalized type arguments are shared. 1630 // Finalized type arguments are shared.
1691 RawTypeArguments* CloneUnfinalized() const; 1631 RawTypeArguments* CloneUnfinalized() const;
1692 1632
1693 // Clone this type argument vector and clone all uninstantiated type 1633 // Clone this type argument vector and clone all uninstantiated type
1694 // arguments, changing the class owner of type parameters. 1634 // arguments, changing the class owner of type parameters.
1695 // Instantiated type arguments are shared. 1635 // Instantiated type arguments are shared.
1696 RawTypeArguments* CloneUninstantiated( 1636 RawTypeArguments* CloneUninstantiated(const Class& new_owner,
1697 const Class& new_owner, TrailPtr trail = NULL) const; 1637 TrailPtr trail = NULL) const;
1698 1638
1699 // Canonicalize only if instantiated, otherwise returns 'this'. 1639 // Canonicalize only if instantiated, otherwise returns 'this'.
1700 RawTypeArguments* Canonicalize(TrailPtr trail = NULL) const; 1640 RawTypeArguments* Canonicalize(TrailPtr trail = NULL) const;
1701 1641
1702 // Returns a formatted list of occuring type arguments with their URI. 1642 // Returns a formatted list of occuring type arguments with their URI.
1703 RawString* EnumerateURIs() const; 1643 RawString* EnumerateURIs() const;
1704 1644
1705 // Return 'this' if this type argument vector is instantiated, i.e. if it does 1645 // Return 'this' if this type argument vector is instantiated, i.e. if it does
1706 // not refer to type parameters. Otherwise, return a new type argument vector 1646 // not refer to type parameters. Otherwise, return a new type argument vector
1707 // where each reference to a type parameter is replaced with the corresponding 1647 // where each reference to a type parameter is replaced with the corresponding
(...skipping 30 matching lines...) Expand all
1738 OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types)); 1678 OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types));
1739 return 0; 1679 return 0;
1740 } 1680 }
1741 1681
1742 static intptr_t InstanceSize(intptr_t len) { 1682 static intptr_t InstanceSize(intptr_t len) {
1743 // Ensure that the types() is not adding to the object size, which includes 1683 // Ensure that the types() is not adding to the object size, which includes
1744 // 3 fields: instantiations_, length_ and hash_. 1684 // 3 fields: instantiations_, length_ and hash_.
1745 ASSERT(sizeof(RawTypeArguments) == 1685 ASSERT(sizeof(RawTypeArguments) ==
1746 (sizeof(RawObject) + (kNumFields * kWordSize))); 1686 (sizeof(RawObject) + (kNumFields * kWordSize)));
1747 ASSERT(0 <= len && len <= kMaxElements); 1687 ASSERT(0 <= len && len <= kMaxElements);
1748 return RoundedAllocationSize( 1688 return RoundedAllocationSize(sizeof(RawTypeArguments) +
1749 sizeof(RawTypeArguments) + (len * kBytesPerElement)); 1689 (len * kBytesPerElement));
1750 } 1690 }
1751 1691
1752 intptr_t Hash() const; 1692 intptr_t Hash() const;
1753 1693
1754 static RawTypeArguments* New(intptr_t len, Heap::Space space = Heap::kOld); 1694 static RawTypeArguments* New(intptr_t len, Heap::Space space = Heap::kOld);
1755 1695
1756 private: 1696 private:
1757 intptr_t ComputeHash() const; 1697 intptr_t ComputeHash() const;
1758 void SetHash(intptr_t value) const; 1698 void SetHash(intptr_t value) const;
1759 1699
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1804 return RoundedAllocationSize(sizeof(RawPatchClass)); 1744 return RoundedAllocationSize(sizeof(RawPatchClass));
1805 } 1745 }
1806 static bool IsInFullSnapshot(RawPatchClass* cls) { 1746 static bool IsInFullSnapshot(RawPatchClass* cls) {
1807 NoSafepointScope no_safepoint; 1747 NoSafepointScope no_safepoint;
1808 return Class::IsInFullSnapshot(cls->ptr()->patched_class_); 1748 return Class::IsInFullSnapshot(cls->ptr()->patched_class_);
1809 } 1749 }
1810 1750
1811 static RawPatchClass* New(const Class& patched_class, 1751 static RawPatchClass* New(const Class& patched_class,
1812 const Class& origin_class); 1752 const Class& origin_class);
1813 1753
1814 static RawPatchClass* New(const Class& patched_class, 1754 static RawPatchClass* New(const Class& patched_class, const Script& source);
1815 const Script& source);
1816 1755
1817 private: 1756 private:
1818 void set_patched_class(const Class& value) const; 1757 void set_patched_class(const Class& value) const;
1819 void set_origin_class(const Class& value) const; 1758 void set_origin_class(const Class& value) const;
1820 void set_script(const Script& value) const; 1759 void set_script(const Script& value) const;
1821 1760
1822 static RawPatchClass* New(); 1761 static RawPatchClass* New();
1823 1762
1824 FINAL_HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object); 1763 FINAL_HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object);
1825 friend class Class; 1764 friend class Class;
1826 }; 1765 };
1827 1766
1828 1767
1829 class SingleTargetCache : public Object { 1768 class SingleTargetCache : public Object {
1830 public: 1769 public:
1831 RawCode* target() const { return raw_ptr()->target_; } 1770 RawCode* target() const { return raw_ptr()->target_; }
1832 void set_target(const Code& target) const; 1771 void set_target(const Code& target) const;
1833 static intptr_t target_offset() { 1772 static intptr_t target_offset() {
1834 return OFFSET_OF(RawSingleTargetCache, target_); 1773 return OFFSET_OF(RawSingleTargetCache, target_);
1835 } 1774 }
1836 1775
1837 #define DEFINE_NON_POINTER_FIELD_ACCESSORS(type, name) \ 1776 #define DEFINE_NON_POINTER_FIELD_ACCESSORS(type, name) \
1838 type name() const { return raw_ptr()->name##_; } \ 1777 type name() const { return raw_ptr()->name##_; } \
1839 void set_##name(type value) const { \ 1778 void set_##name(type value) const { \
1840 StoreNonPointer(&raw_ptr()->name##_, value); \ 1779 StoreNonPointer(&raw_ptr()->name##_, value); \
1841 } \ 1780 } \
1842 static intptr_t name##_offset() { \ 1781 static intptr_t name##_offset() { \
1843 return OFFSET_OF(RawSingleTargetCache, name##_); \ 1782 return OFFSET_OF(RawSingleTargetCache, name##_); \
1844 } \ 1783 }
1845 1784
1846 DEFINE_NON_POINTER_FIELD_ACCESSORS(uword, entry_point); 1785 DEFINE_NON_POINTER_FIELD_ACCESSORS(uword, entry_point);
1847 DEFINE_NON_POINTER_FIELD_ACCESSORS(intptr_t, lower_limit); 1786 DEFINE_NON_POINTER_FIELD_ACCESSORS(intptr_t, lower_limit);
1848 DEFINE_NON_POINTER_FIELD_ACCESSORS(intptr_t, upper_limit); 1787 DEFINE_NON_POINTER_FIELD_ACCESSORS(intptr_t, upper_limit);
1849 #undef DEFINE_NON_POINTER_FIELD_ACCESSORS 1788 #undef DEFINE_NON_POINTER_FIELD_ACCESSORS
1850 1789
1851 static intptr_t InstanceSize() { 1790 static intptr_t InstanceSize() {
1852 return RoundedAllocationSize(sizeof(RawSingleTargetCache)); 1791 return RoundedAllocationSize(sizeof(RawSingleTargetCache));
1853 } 1792 }
1854 1793
1855 static RawSingleTargetCache* New(); 1794 static RawSingleTargetCache* New();
1856 1795
1857 private: 1796 private:
1858 FINAL_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache, Object); 1797 FINAL_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache, Object);
(...skipping 26 matching lines...) Expand all
1885 // copy the ICData in a child object, thus freezing it during background 1824 // copy the ICData in a child object, thus freezing it during background
1886 // compilation. Code may contain only original ICData objects. 1825 // compilation. Code may contain only original ICData objects.
1887 class ICData : public Object { 1826 class ICData : public Object {
1888 public: 1827 public:
1889 RawFunction* Owner() const; 1828 RawFunction* Owner() const;
1890 1829
1891 RawICData* Original() const; 1830 RawICData* Original() const;
1892 1831
1893 void SetOriginal(const ICData& value) const; 1832 void SetOriginal(const ICData& value) const;
1894 1833
1895 bool IsOriginal() const { 1834 bool IsOriginal() const { return Original() == this->raw(); }
1896 return Original() == this->raw();
1897 }
1898 1835
1899 RawString* target_name() const { 1836 RawString* target_name() const { return raw_ptr()->target_name_; }
1900 return raw_ptr()->target_name_;
1901 }
1902 1837
1903 RawArray* arguments_descriptor() const { 1838 RawArray* arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
1904 return raw_ptr()->args_descriptor_;
1905 }
1906 1839
1907 intptr_t NumArgsTested() const; 1840 intptr_t NumArgsTested() const;
1908 1841
1909 intptr_t deopt_id() const { 1842 intptr_t deopt_id() const {
1910 #if defined(DART_PRECOMPILED_RUNTIME) 1843 #if defined(DART_PRECOMPILED_RUNTIME)
1911 UNREACHABLE(); 1844 UNREACHABLE();
1912 return -1; 1845 return -1;
1913 #else 1846 #else
1914 return raw_ptr()->deopt_id_; 1847 return raw_ptr()->deopt_id_;
1915 #endif 1848 #endif
1916 } 1849 }
1917 1850
1918 bool IsImmutable() const; 1851 bool IsImmutable() const;
1919 1852
1920 void Reset(Zone* zone) const; 1853 void Reset(Zone* zone) const;
1921 void ResetSwitchable(Zone* zone) const; 1854 void ResetSwitchable(Zone* zone) const;
1922 1855
1923 // Note: only deopts with reasons before Unknown in this list are recorded in 1856 // Note: only deopts with reasons before Unknown in this list are recorded in
1924 // the ICData. All other reasons are used purely for informational messages 1857 // the ICData. All other reasons are used purely for informational messages
1925 // printed during deoptimization itself. 1858 // printed during deoptimization itself.
1926 #define DEOPT_REASONS(V) \ 1859 #define DEOPT_REASONS(V) \
1927 V(BinarySmiOp) \ 1860 V(BinarySmiOp) \
1928 V(BinaryMintOp) \ 1861 V(BinaryMintOp) \
1929 V(DoubleToSmi) \ 1862 V(DoubleToSmi) \
1930 V(CheckSmi) \ 1863 V(CheckSmi) \
1931 V(Unknown) \ 1864 V(Unknown) \
1932 V(PolymorphicInstanceCallTestFail) \ 1865 V(PolymorphicInstanceCallTestFail) \
1933 V(UnaryMintOp) \ 1866 V(UnaryMintOp) \
1934 V(BinaryDoubleOp) \ 1867 V(BinaryDoubleOp) \
1935 V(UnaryOp) \ 1868 V(UnaryOp) \
1936 V(UnboxInteger) \ 1869 V(UnboxInteger) \
1937 V(CheckClass) \ 1870 V(CheckClass) \
1938 V(CheckArrayBound) \ 1871 V(CheckArrayBound) \
1939 V(AtCall) \ 1872 V(AtCall) \
1940 V(GuardField) \ 1873 V(GuardField) \
1941 V(TestCids) \ 1874 V(TestCids) \
1942 V(NumReasons) \ 1875 V(NumReasons)
1943 1876
1944 enum DeoptReasonId { 1877 enum DeoptReasonId {
1945 #define DEFINE_ENUM_LIST(name) kDeopt##name, 1878 #define DEFINE_ENUM_LIST(name) kDeopt##name,
1946 DEOPT_REASONS(DEFINE_ENUM_LIST) 1879 DEOPT_REASONS(DEFINE_ENUM_LIST)
1947 #undef DEFINE_ENUM_LIST 1880 #undef DEFINE_ENUM_LIST
1948 }; 1881 };
1949 1882
1950 static const intptr_t kLastRecordedDeoptReason = kDeoptUnknown - 1; 1883 static const intptr_t kLastRecordedDeoptReason = kDeoptUnknown - 1;
1951 1884
1952 enum DeoptFlags { 1885 enum DeoptFlags {
1953 // Deoptimization is caused by an optimistically hoisted instruction. 1886 // Deoptimization is caused by an optimistically hoisted instruction.
1954 kHoisted = 1 << 0, 1887 kHoisted = 1 << 0,
1955 1888
1956 // Deoptimization is caused by an optimistically generalized bounds check. 1889 // Deoptimization is caused by an optimistically generalized bounds check.
1957 kGeneralized = 1 << 1 1890 kGeneralized = 1 << 1
(...skipping 20 matching lines...) Expand all
1978 } 1911 }
1979 1912
1980 static intptr_t target_name_offset() { 1913 static intptr_t target_name_offset() {
1981 return OFFSET_OF(RawICData, target_name_); 1914 return OFFSET_OF(RawICData, target_name_);
1982 } 1915 }
1983 1916
1984 static intptr_t state_bits_offset() { 1917 static intptr_t state_bits_offset() {
1985 return OFFSET_OF(RawICData, state_bits_); 1918 return OFFSET_OF(RawICData, state_bits_);
1986 } 1919 }
1987 1920
1988 static intptr_t NumArgsTestedShift() { 1921 static intptr_t NumArgsTestedShift() { return kNumArgsTestedPos; }
1989 return kNumArgsTestedPos;
1990 }
1991 1922
1992 static intptr_t NumArgsTestedMask() { 1923 static intptr_t NumArgsTestedMask() {
1993 return ((1 << kNumArgsTestedSize) - 1) << kNumArgsTestedPos; 1924 return ((1 << kNumArgsTestedSize) - 1) << kNumArgsTestedPos;
1994 } 1925 }
1995 1926
1996 static intptr_t arguments_descriptor_offset() { 1927 static intptr_t arguments_descriptor_offset() {
1997 return OFFSET_OF(RawICData, args_descriptor_); 1928 return OFFSET_OF(RawICData, args_descriptor_);
1998 } 1929 }
1999 1930
2000 static intptr_t ic_data_offset() { 1931 static intptr_t ic_data_offset() { return OFFSET_OF(RawICData, ic_data_); }
2001 return OFFSET_OF(RawICData, ic_data_);
2002 }
2003 1932
2004 static intptr_t owner_offset() { 1933 static intptr_t owner_offset() { return OFFSET_OF(RawICData, owner_); }
2005 return OFFSET_OF(RawICData, owner_);
2006 }
2007 1934
2008 // Replaces entry |index| with the sentinel. 1935 // Replaces entry |index| with the sentinel.
2009 void WriteSentinelAt(intptr_t index) const; 1936 void WriteSentinelAt(intptr_t index) const;
2010 1937
2011 // Clears the count for entry |index|. 1938 // Clears the count for entry |index|.
2012 void ClearCountAt(intptr_t index) const; 1939 void ClearCountAt(intptr_t index) const;
2013 1940
2014 // Clear all entries with the sentinel value (but will preserve initial 1941 // Clear all entries with the sentinel value (but will preserve initial
2015 // smi smi checks). 1942 // smi smi checks).
2016 void ClearWithSentinel() const; 1943 void ClearWithSentinel() const;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2075 intptr_t GetCountAt(intptr_t index) const; 2002 intptr_t GetCountAt(intptr_t index) const;
2076 intptr_t AggregateCount() const; 2003 intptr_t AggregateCount() const;
2077 2004
2078 // Returns this->raw() if num_args_tested == 1 and arg_nr == 1, otherwise 2005 // Returns this->raw() if num_args_tested == 1 and arg_nr == 1, otherwise
2079 // returns a new ICData object containing only unique arg_nr checks. 2006 // returns a new ICData object containing only unique arg_nr checks.
2080 // Returns only used entries. 2007 // Returns only used entries.
2081 RawICData* AsUnaryClassChecksForArgNr(intptr_t arg_nr) const; 2008 RawICData* AsUnaryClassChecksForArgNr(intptr_t arg_nr) const;
2082 RawICData* AsUnaryClassChecks() const { 2009 RawICData* AsUnaryClassChecks() const {
2083 return AsUnaryClassChecksForArgNr(0); 2010 return AsUnaryClassChecksForArgNr(0);
2084 } 2011 }
2085 RawICData* AsUnaryClassChecksForCid( 2012 RawICData* AsUnaryClassChecksForCid(intptr_t cid,
2086 intptr_t cid, const Function& target) const; 2013 const Function& target) const;
2087 2014
2088 // Returns ICData with aggregated receiver count, sorted by highest count. 2015 // Returns ICData with aggregated receiver count, sorted by highest count.
2089 // Smi not first!! (the convention for ICData used in code generation is that 2016 // Smi not first!! (the convention for ICData used in code generation is that
2090 // Smi check is first) 2017 // Smi check is first)
2091 // Used for printing and optimizations. 2018 // Used for printing and optimizations.
2092 RawICData* AsUnaryClassChecksSortedByCount() const; 2019 RawICData* AsUnaryClassChecksSortedByCount() const;
2093 2020
2094 // Consider only used entries. 2021 // Consider only used entries.
2095 bool AllTargetsHaveSameOwner(intptr_t owner_cid) const; 2022 bool AllTargetsHaveSameOwner(intptr_t owner_cid) const;
2096 bool AllReceiversAreNumbers() const; 2023 bool AllReceiversAreNumbers() const;
2097 bool HasOneTarget() const; 2024 bool HasOneTarget() const;
2098 bool HasOnlyDispatcherTargets() const; 2025 bool HasOnlyDispatcherTargets() const;
2099 bool HasReceiverClassId(intptr_t class_id) const; 2026 bool HasReceiverClassId(intptr_t class_id) const;
2100 2027
2101 static RawICData* New(const Function& owner, 2028 static RawICData* New(const Function& owner,
2102 const String& target_name, 2029 const String& target_name,
2103 const Array& arguments_descriptor, 2030 const Array& arguments_descriptor,
2104 intptr_t deopt_id, 2031 intptr_t deopt_id,
2105 intptr_t num_args_tested, 2032 intptr_t num_args_tested,
2106 bool is_static_call); 2033 bool is_static_call);
2107 static RawICData* NewFrom(const ICData& from, intptr_t num_args_tested); 2034 static RawICData* NewFrom(const ICData& from, intptr_t num_args_tested);
2108 2035
2109 // Generates a new ICData with descriptor and data array copied (deep clone). 2036 // Generates a new ICData with descriptor and data array copied (deep clone).
2110 static RawICData* Clone(const ICData& from); 2037 static RawICData* Clone(const ICData& from);
2111 2038
2112 static intptr_t TestEntryLengthFor(intptr_t num_args); 2039 static intptr_t TestEntryLengthFor(intptr_t num_args);
2113 2040
2114 static intptr_t TargetIndexFor(intptr_t num_args) { 2041 static intptr_t TargetIndexFor(intptr_t num_args) { return num_args; }
2115 return num_args; 2042 static intptr_t CodeIndexFor(intptr_t num_args) { return num_args; }
2116 }
2117 static intptr_t CodeIndexFor(intptr_t num_args) {
2118 return num_args;
2119 }
2120 2043
2121 static intptr_t CountIndexFor(intptr_t num_args) { 2044 static intptr_t CountIndexFor(intptr_t num_args) { return (num_args + 1); }
2122 return (num_args + 1);
2123 }
2124 static intptr_t EntryPointIndexFor(intptr_t num_args) { 2045 static intptr_t EntryPointIndexFor(intptr_t num_args) {
2125 return (num_args + 1); 2046 return (num_args + 1);
2126 } 2047 }
2127 2048
2128 bool IsUsedAt(intptr_t i) const; 2049 bool IsUsedAt(intptr_t i) const;
2129 2050
2130 void GetUsedCidsForTwoArgs(GrowableArray<intptr_t>* first, 2051 void GetUsedCidsForTwoArgs(GrowableArray<intptr_t>* first,
2131 GrowableArray<intptr_t>* second) const; 2052 GrowableArray<intptr_t>* second) const;
2132 2053
2133 void PrintToJSONArray(const JSONArray& jsarray, 2054 void PrintToJSONArray(const JSONArray& jsarray,
2134 TokenPosition token_pos) const; 2055 TokenPosition token_pos) const;
2135 2056
2136 // Initialize the preallocated empty ICData entry arrays. 2057 // Initialize the preallocated empty ICData entry arrays.
2137 static void InitOnce(); 2058 static void InitOnce();
2138 2059
2139 enum { 2060 enum { kCachedICDataArrayCount = 4 };
2140 kCachedICDataArrayCount = 4
2141 };
2142 2061
2143 #if defined(TAG_IC_DATA) 2062 #if defined(TAG_IC_DATA)
2144 void set_tag(intptr_t value) const; 2063 void set_tag(intptr_t value) const;
2145 intptr_t tag() const { return raw_ptr()->tag_; } 2064 intptr_t tag() const { return raw_ptr()->tag_; }
2146 #endif 2065 #endif
2147 2066
2148 void SetIsStaticCall(bool static_call) const; 2067 void SetIsStaticCall(bool static_call) const;
2149 bool is_static_call() const; 2068 bool is_static_call() const;
2150 2069
2151 private: 2070 private:
2152 static RawICData* New(); 2071 static RawICData* New();
2153 2072
2154 RawArray* ic_data() const { 2073 RawArray* ic_data() const { return raw_ptr()->ic_data_; }
2155 return raw_ptr()->ic_data_;
2156 }
2157 2074
2158 void set_owner(const Function& value) const; 2075 void set_owner(const Function& value) const;
2159 void set_target_name(const String& value) const; 2076 void set_target_name(const String& value) const;
2160 void set_arguments_descriptor(const Array& value) const; 2077 void set_arguments_descriptor(const Array& value) const;
2161 void set_deopt_id(intptr_t value) const; 2078 void set_deopt_id(intptr_t value) const;
2162 void SetNumArgsTested(intptr_t value) const; 2079 void SetNumArgsTested(intptr_t value) const;
2163 void set_ic_data_array(const Array& value) const; 2080 void set_ic_data_array(const Array& value) const;
2164 void set_state_bits(uint32_t bits) const; 2081 void set_state_bits(uint32_t bits) const;
2165 2082
2166 bool ValidateInterceptor(const Function& target) const; 2083 bool ValidateInterceptor(const Function& target) const;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2249 } 2166 }
2250 2167
2251 // Build a string of the form '(T, {B b, C c}) => R' representing the 2168 // Build a string of the form '(T, {B b, C c}) => R' representing the
2252 // user visible signature of the given function. In this example, T and R are 2169 // user visible signature of the given function. In this example, T and R are
2253 // type parameters of class C, the owner of the function, also called the 2170 // type parameters of class C, the owner of the function, also called the
2254 // scope class of the function type. 2171 // scope class of the function type.
2255 // Implicit parameters are hidden, as well as the prefix denoting the 2172 // Implicit parameters are hidden, as well as the prefix denoting the
2256 // scope class and its type parameters. 2173 // scope class and its type parameters.
2257 RawString* UserVisibleSignature() const { 2174 RawString* UserVisibleSignature() const {
2258 const bool instantiate = false; 2175 const bool instantiate = false;
2259 return BuildSignature( 2176 return BuildSignature(instantiate, kUserVisibleName,
2260 instantiate, kUserVisibleName, TypeArguments::Handle()); 2177 TypeArguments::Handle());
2261 } 2178 }
2262 2179
2263 // Build a string of the form '(A, {B b, C c}) => D' representing the 2180 // Build a string of the form '(A, {B b, C c}) => D' representing the
2264 // signature of the given function, where all generic types (e.g. '<T, R>' in 2181 // signature of the given function, where all generic types (e.g. '<T, R>' in
2265 // 'C<T, R>(T, {B b, C c}) => R') are instantiated using the given 2182 // 'C<T, R>(T, {B b, C c}) => R') are instantiated using the given
2266 // instantiator type argument vector of a C instance (e.g. '<A, D>'). 2183 // instantiator type argument vector of a C instance (e.g. '<A, D>').
2267 RawString* InstantiatedSignatureFrom(const TypeArguments& instantiator, 2184 RawString* InstantiatedSignatureFrom(const TypeArguments& instantiator,
2268 NameVisibility name_visibility) const { 2185 NameVisibility name_visibility) const {
2269 const bool instantiate = true; 2186 const bool instantiate = true;
2270 return BuildSignature(instantiate, name_visibility, instantiator); 2187 return BuildSignature(instantiate, name_visibility, instantiator);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2306 // Parameter names are valid for all valid parameter indices, and are not 2223 // Parameter names are valid for all valid parameter indices, and are not
2307 // limited to named optional parameters. 2224 // limited to named optional parameters.
2308 RawString* ParameterNameAt(intptr_t index) const; 2225 RawString* ParameterNameAt(intptr_t index) const;
2309 void SetParameterNameAt(intptr_t index, const String& value) const; 2226 void SetParameterNameAt(intptr_t index, const String& value) const;
2310 RawArray* parameter_names() const { return raw_ptr()->parameter_names_; } 2227 RawArray* parameter_names() const { return raw_ptr()->parameter_names_; }
2311 void set_parameter_names(const Array& value) const; 2228 void set_parameter_names(const Array& value) const;
2312 2229
2313 // The type parameters (and their bounds) are specified as an array of 2230 // The type parameters (and their bounds) are specified as an array of
2314 // TypeParameter. 2231 // TypeParameter.
2315 RawTypeArguments* type_parameters() const { 2232 RawTypeArguments* type_parameters() const {
2316 return raw_ptr()->type_parameters_; 2233 return raw_ptr()->type_parameters_;
2317 } 2234 }
2318 void set_type_parameters(const TypeArguments& value) const; 2235 void set_type_parameters(const TypeArguments& value) const;
2319 intptr_t NumTypeParameters(Thread* thread) const; 2236 intptr_t NumTypeParameters(Thread* thread) const;
2320 2237
2321 // Return a TypeParameter if the type_name is a type parameter of this 2238 // Return a TypeParameter if the type_name is a type parameter of this
2322 // function or of one of its parent functions. 2239 // function or of one of its parent functions.
2323 // Unless NULL, adjust function_level accordingly (in and out parameter). 2240 // Unless NULL, adjust function_level accordingly (in and out parameter).
2324 // Return null otherwise. 2241 // Return null otherwise.
2325 RawTypeParameter* LookupTypeParameter(const String& type_name, 2242 RawTypeParameter* LookupTypeParameter(const String& type_name,
2326 intptr_t* function_level) const; 2243 intptr_t* function_level) const;
(...skipping 13 matching lines...) Expand all
2340 2257
2341 // Disables optimized code and switches to unoptimized code (or the lazy 2258 // Disables optimized code and switches to unoptimized code (or the lazy
2342 // compilation stub). 2259 // compilation stub).
2343 void SwitchToLazyCompiledUnoptimizedCode() const; 2260 void SwitchToLazyCompiledUnoptimizedCode() const;
2344 2261
2345 // Compiles unoptimized code (if necessary) and attaches it to the function. 2262 // Compiles unoptimized code (if necessary) and attaches it to the function.
2346 void EnsureHasCompiledUnoptimizedCode() const; 2263 void EnsureHasCompiledUnoptimizedCode() const;
2347 2264
2348 // Return the most recently compiled and installed code for this function. 2265 // Return the most recently compiled and installed code for this function.
2349 // It is not the only Code object that points to this function. 2266 // It is not the only Code object that points to this function.
2350 RawCode* CurrentCode() const { 2267 RawCode* CurrentCode() const { return raw_ptr()->code_; }
2351 return raw_ptr()->code_;
2352 }
2353 2268
2354 RawCode* unoptimized_code() const { 2269 RawCode* unoptimized_code() const {
2355 #if defined(DART_PRECOMPILED_RUNTIME) 2270 #if defined(DART_PRECOMPILED_RUNTIME)
2356 return static_cast<RawCode*>(Object::null()); 2271 return static_cast<RawCode*>(Object::null());
2357 #else 2272 #else
2358 return raw_ptr()->unoptimized_code_; 2273 return raw_ptr()->unoptimized_code_;
2359 #endif 2274 #endif
2360 } 2275 }
2361 void set_unoptimized_code(const Code& value) const; 2276 void set_unoptimized_code(const Code& value) const;
2362 bool HasCode() const; 2277 bool HasCode() const;
2363 2278
2364 static intptr_t code_offset() { 2279 static intptr_t code_offset() { return OFFSET_OF(RawFunction, code_); }
2365 return OFFSET_OF(RawFunction, code_);
2366 }
2367 2280
2368 static intptr_t entry_point_offset() { 2281 static intptr_t entry_point_offset() {
2369 return OFFSET_OF(RawFunction, entry_point_); 2282 return OFFSET_OF(RawFunction, entry_point_);
2370 } 2283 }
2371 2284
2372 virtual intptr_t Hash() const; 2285 virtual intptr_t Hash() const;
2373 2286
2374 // Returns true if there is at least one debugger breakpoint 2287 // Returns true if there is at least one debugger breakpoint
2375 // set in this function. 2288 // set in this function.
2376 bool HasBreakpoint() const; 2289 bool HasBreakpoint() const;
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2499 #endif 2412 #endif
2500 } 2413 }
2501 void set_token_pos(TokenPosition value) const; 2414 void set_token_pos(TokenPosition value) const;
2502 2415
2503 TokenPosition end_token_pos() const { 2416 TokenPosition end_token_pos() const {
2504 #if defined(DART_PRECOMPILED_RUNTIME) 2417 #if defined(DART_PRECOMPILED_RUNTIME)
2505 return TokenPosition(); 2418 return TokenPosition();
2506 #else 2419 #else
2507 return raw_ptr()->end_token_pos_; 2420 return raw_ptr()->end_token_pos_;
2508 #endif 2421 #endif
2509 } 2422 }
2510 void set_end_token_pos(TokenPosition value) const { 2423 void set_end_token_pos(TokenPosition value) const {
2511 #if defined(DART_PRECOMPILED_RUNTIME) 2424 #if defined(DART_PRECOMPILED_RUNTIME)
2512 UNREACHABLE(); 2425 UNREACHABLE();
2513 #else 2426 #else
2514 StoreNonPointer(&raw_ptr()->end_token_pos_, value); 2427 StoreNonPointer(&raw_ptr()->end_token_pos_, value);
2515 #endif 2428 #endif
2516 } 2429 }
2517 2430
2518 intptr_t num_fixed_parameters() const { 2431 intptr_t num_fixed_parameters() const {
2519 return raw_ptr()->num_fixed_parameters_; 2432 return raw_ptr()->num_fixed_parameters_;
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
2693 bool HasCompatibleParametersWith(const Function& other, 2606 bool HasCompatibleParametersWith(const Function& other,
2694 Error* bound_error) const; 2607 Error* bound_error) const;
2695 2608
2696 // Returns true if the type of this function is a subtype of the type of 2609 // Returns true if the type of this function is a subtype of the type of
2697 // the other function. 2610 // the other function.
2698 bool IsSubtypeOf(const TypeArguments& type_arguments, 2611 bool IsSubtypeOf(const TypeArguments& type_arguments,
2699 const Function& other, 2612 const Function& other,
2700 const TypeArguments& other_type_arguments, 2613 const TypeArguments& other_type_arguments,
2701 Error* bound_error, 2614 Error* bound_error,
2702 Heap::Space space) const { 2615 Heap::Space space) const {
2703 return TypeTest(kIsSubtypeOf, 2616 return TypeTest(kIsSubtypeOf, type_arguments, other, other_type_arguments,
2704 type_arguments, 2617 bound_error, space);
2705 other,
2706 other_type_arguments,
2707 bound_error,
2708 space);
2709 } 2618 }
2710 2619
2711 // Returns true if the type of this function is more specific than the type of 2620 // Returns true if the type of this function is more specific than the type of
2712 // the other function. 2621 // the other function.
2713 bool IsMoreSpecificThan(const TypeArguments& type_arguments, 2622 bool IsMoreSpecificThan(const TypeArguments& type_arguments,
2714 const Function& other, 2623 const Function& other,
2715 const TypeArguments& other_type_arguments, 2624 const TypeArguments& other_type_arguments,
2716 Error* bound_error, 2625 Error* bound_error,
2717 Heap::Space space) const { 2626 Heap::Space space) const {
2718 return TypeTest(kIsMoreSpecificThan, 2627 return TypeTest(kIsMoreSpecificThan, type_arguments, other,
2719 type_arguments, 2628 other_type_arguments, bound_error, space);
2720 other,
2721 other_type_arguments,
2722 bound_error,
2723 space);
2724 } 2629 }
2725 2630
2726 // Check the subtype or 'more specific' relationship. 2631 // Check the subtype or 'more specific' relationship.
2727 bool TypeTest(TypeTestKind test_kind, 2632 bool TypeTest(TypeTestKind test_kind,
2728 const TypeArguments& type_arguments, 2633 const TypeArguments& type_arguments,
2729 const Function& other, 2634 const Function& other,
2730 const TypeArguments& other_type_arguments, 2635 const TypeArguments& other_type_arguments,
2731 Error* bound_error, 2636 Error* bound_error,
2732 Heap::Space space) const; 2637 Heap::Space space) const;
2733 2638
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2779 2684
2780 // Returns true if this function represents an implicit instance closure 2685 // Returns true if this function represents an implicit instance closure
2781 // function. 2686 // function.
2782 bool IsImplicitInstanceClosureFunction() const { 2687 bool IsImplicitInstanceClosureFunction() const {
2783 return !is_static() && IsImplicitClosureFunction(); 2688 return !is_static() && IsImplicitClosureFunction();
2784 } 2689 }
2785 2690
2786 bool IsConstructorClosureFunction() const; 2691 bool IsConstructorClosureFunction() const;
2787 2692
2788 // Returns true if this function represents a local function. 2693 // Returns true if this function represents a local function.
2789 bool IsLocalFunction() const { 2694 bool IsLocalFunction() const { return parent_function() != Function::null(); }
2790 return parent_function() != Function::null();
2791 }
2792 2695
2793 // Returns true if this function represents a signature function without code. 2696 // Returns true if this function represents a signature function without code.
2794 bool IsSignatureFunction() const { 2697 bool IsSignatureFunction() const {
2795 return kind() == RawFunction::kSignatureFunction; 2698 return kind() == RawFunction::kSignatureFunction;
2796 } 2699 }
2797 static bool IsSignatureFunction(RawFunction* function) { 2700 static bool IsSignatureFunction(RawFunction* function) {
2798 NoSafepointScope no_safepoint; 2701 NoSafepointScope no_safepoint;
2799 return KindBits::decode(function->ptr()->kind_tag_) == 2702 return KindBits::decode(function->ptr()->kind_tag_) ==
2800 RawFunction::kSignatureFunction; 2703 RawFunction::kSignatureFunction;
2801 } 2704 }
2802 2705
2803 bool IsAsyncFunction() const { 2706 bool IsAsyncFunction() const { return modifier() == RawFunction::kAsync; }
2804 return modifier() == RawFunction::kAsync;
2805 }
2806 2707
2807 bool IsAsyncClosure() const { 2708 bool IsAsyncClosure() const {
2808 return is_generated_body() && 2709 return is_generated_body() &&
2809 Function::Handle(parent_function()).IsAsyncFunction(); 2710 Function::Handle(parent_function()).IsAsyncFunction();
2810 } 2711 }
2811 2712
2812 bool IsGenerator() const { 2713 bool IsGenerator() const {
2813 return (modifier() & RawFunction::kGeneratorBit) != 0; 2714 return (modifier() & RawFunction::kGeneratorBit) != 0;
2814 } 2715 }
2815 2716
2816 bool IsSyncGenerator() const { 2717 bool IsSyncGenerator() const { return modifier() == RawFunction::kSyncGen; }
2817 return modifier() == RawFunction::kSyncGen;
2818 }
2819 2718
2820 bool IsSyncGenClosure() const { 2719 bool IsSyncGenClosure() const {
2821 return is_generated_body() && 2720 return is_generated_body() &&
2822 Function::Handle(parent_function()).IsSyncGenerator(); 2721 Function::Handle(parent_function()).IsSyncGenerator();
2823 } 2722 }
2824 2723
2825 bool IsGeneratorClosure() const { 2724 bool IsGeneratorClosure() const {
2826 return is_generated_body() && 2725 return is_generated_body() &&
2827 Function::Handle(parent_function()).IsGenerator(); 2726 Function::Handle(parent_function()).IsGenerator();
2828 } 2727 }
2829 2728
2830 bool IsAsyncGenerator() const { 2729 bool IsAsyncGenerator() const { return modifier() == RawFunction::kAsyncGen; }
2831 return modifier() == RawFunction::kAsyncGen;
2832 }
2833 2730
2834 bool IsAsyncGenClosure() const { 2731 bool IsAsyncGenClosure() const {
2835 return is_generated_body() && 2732 return is_generated_body() &&
2836 Function::Handle(parent_function()).IsAsyncGenerator(); 2733 Function::Handle(parent_function()).IsAsyncGenerator();
2837 } 2734 }
2838 2735
2839 bool IsAsyncOrGenerator() const { 2736 bool IsAsyncOrGenerator() const {
2840 return modifier() != RawFunction::kNoModifier; 2737 return modifier() != RawFunction::kNoModifier;
2841 } 2738 }
2842 2739
2843 static intptr_t InstanceSize() { 2740 static intptr_t InstanceSize() {
2844 return RoundedAllocationSize(sizeof(RawFunction)); 2741 return RoundedAllocationSize(sizeof(RawFunction));
2845 } 2742 }
2846 2743
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2911 } 2808 }
2912 bool was_compiled() const { 2809 bool was_compiled() const {
2913 #if defined(DART_PRECOMPILED_RUNTIME) 2810 #if defined(DART_PRECOMPILED_RUNTIME)
2914 UNREACHABLE(); 2811 UNREACHABLE();
2915 return true; 2812 return true;
2916 #else 2813 #else
2917 return raw_ptr()->was_compiled_ == 1; 2814 return raw_ptr()->was_compiled_ == 1;
2918 #endif 2815 #endif
2919 } 2816 }
2920 2817
2921 // static: Considered during class-side or top-level resolution rather than 2818 // static: Considered during class-side or top-level resolution rather than
2922 // instance-side resolution. 2819 // instance-side resolution.
2923 // const: Valid target of a const constructor call. 2820 // const: Valid target of a const constructor call.
2924 // abstract: Skipped during instance-side resolution. 2821 // abstract: Skipped during instance-side resolution.
2925 // reflectable: Enumerated by mirrors, invocable by mirrors. False for private 2822 // reflectable: Enumerated by mirrors, invocable by mirrors. False for private
2926 // functions of dart: libraries. 2823 // functions of dart: libraries.
2927 // debuggable: Valid location of a breakpoint. Synthetic code is not 2824 // debuggable: Valid location of a breakpoint. Synthetic code is not
2928 // debuggable. 2825 // debuggable.
2929 // visible: Frame is included in stack traces. Synthetic code such as 2826 // visible: Frame is included in stack traces. Synthetic code such as
2930 // dispatchers is not visible. Synthetic code that can trigger 2827 // dispatchers is not visible. Synthetic code that can trigger
2931 // exceptions such as the outer async functions that create Futures 2828 // exceptions such as the outer async functions that create Futures
2932 // is visible. 2829 // is visible.
2933 // optimizable: Candidate for going through the optimizing compiler. False for 2830 // optimizable: Candidate for going through the optimizing compiler. False for
2934 // some functions known to be execute infrequently and functions 2831 // some functions known to be execute infrequently and functions
2935 // which have been de-optimized too many times. 2832 // which have been de-optimized too many times.
2936 // instrinsic: Has a hand-written assembly prologue. 2833 // instrinsic: Has a hand-written assembly prologue.
2937 // inlinable: Candidate for inlining. False for functions with features we 2834 // inlinable: Candidate for inlining. False for functions with features we
2938 // don't support during inlining (e.g., optional parameters), 2835 // don't support during inlining (e.g., optional parameters),
2939 // functions which are too big, etc. 2836 // functions which are too big, etc.
2940 // native: Bridge to C/C++ code. 2837 // native: Bridge to C/C++ code.
2941 // redirecting: Redirecting generative or factory constructor. 2838 // redirecting: Redirecting generative or factory constructor.
2942 // external: Just a declaration that expects to be defined in another patch 2839 // external: Just a declaration that expects to be defined in another patch
2943 // file. 2840 // file.
2944 2841
2945 #define FOR_EACH_FUNCTION_KIND_BIT(V) \ 2842 #define FOR_EACH_FUNCTION_KIND_BIT(V) \
2946 V(Static, is_static) \ 2843 V(Static, is_static) \
2947 V(Const, is_const) \ 2844 V(Const, is_const) \
2948 V(Abstract, is_abstract) \ 2845 V(Abstract, is_abstract) \
2949 V(Reflectable, is_reflectable) \ 2846 V(Reflectable, is_reflectable) \
2950 V(Visible, is_visible) \ 2847 V(Visible, is_visible) \
2951 V(Debuggable, is_debuggable) \ 2848 V(Debuggable, is_debuggable) \
2952 V(Optimizable, is_optimizable) \ 2849 V(Optimizable, is_optimizable) \
2953 V(Inlinable, is_inlinable) \ 2850 V(Inlinable, is_inlinable) \
2954 V(Intrinsic, is_intrinsic) \ 2851 V(Intrinsic, is_intrinsic) \
2955 V(Native, is_native) \ 2852 V(Native, is_native) \
2956 V(Redirecting, is_redirecting) \ 2853 V(Redirecting, is_redirecting) \
2957 V(External, is_external) \ 2854 V(External, is_external) \
2958 V(AllowsHoistingCheckClass, allows_hoisting_check_class) \ 2855 V(AllowsHoistingCheckClass, allows_hoisting_check_class) \
2959 V(AllowsBoundsCheckGeneralization, allows_bounds_check_generalization) \ 2856 V(AllowsBoundsCheckGeneralization, allows_bounds_check_generalization) \
2960 V(GeneratedBody, is_generated_body) \ 2857 V(GeneratedBody, is_generated_body) \
2961 V(AlwaysInline, always_inline) \ 2858 V(AlwaysInline, always_inline) \
2962 V(PolymorphicTarget, is_polymorphic_target) \ 2859 V(PolymorphicTarget, is_polymorphic_target)
2963 2860
2964 #define DEFINE_ACCESSORS(name, accessor_name) \ 2861 #define DEFINE_ACCESSORS(name, accessor_name) \
2965 void set_##accessor_name(bool value) const { \ 2862 void set_##accessor_name(bool value) const { \
2966 set_kind_tag(name##Bit::update(value, raw_ptr()->kind_tag_)); \ 2863 set_kind_tag(name##Bit::update(value, raw_ptr()->kind_tag_)); \
2967 } \ 2864 } \
2968 bool accessor_name() const { \ 2865 bool accessor_name() const { return name##Bit::decode(raw_ptr()->kind_tag_); }
2969 return name##Bit::decode(raw_ptr()->kind_tag_); \ 2866 FOR_EACH_FUNCTION_KIND_BIT(DEFINE_ACCESSORS)
2970 }
2971 FOR_EACH_FUNCTION_KIND_BIT(DEFINE_ACCESSORS)
2972 #undef DEFINE_ACCESSORS 2867 #undef DEFINE_ACCESSORS
2973 2868
2974 private: 2869 private:
2975 void set_ic_data_array(const Array& value) const; 2870 void set_ic_data_array(const Array& value) const;
2976 void SetInstructionsSafe(const Code& value) const; 2871 void SetInstructionsSafe(const Code& value) const;
2977 2872
2978 enum KindTagBits { 2873 enum KindTagBits {
2979 kKindTagPos = 0, 2874 kKindTagPos = 0,
2980 kKindTagSize = 4, 2875 kKindTagSize = 4,
2981 kRecognizedTagPos = kKindTagPos + kKindTagSize, 2876 kRecognizedTagPos = kKindTagPos + kKindTagSize,
2982 kRecognizedTagSize = 9, 2877 kRecognizedTagSize = 9,
2983 kModifierPos = kRecognizedTagPos + kRecognizedTagSize, 2878 kModifierPos = kRecognizedTagPos + kRecognizedTagSize,
2984 kModifierSize = 2, 2879 kModifierSize = 2,
2985 kLastModifierBitPos = kModifierPos + (kModifierSize - 1), 2880 kLastModifierBitPos = kModifierPos + (kModifierSize - 1),
2986 // Single bit sized fields start here. 2881 // Single bit sized fields start here.
2987 #define DECLARE_BIT(name, _) k##name##Bit, 2882 #define DECLARE_BIT(name, _) k##name##Bit,
2988 FOR_EACH_FUNCTION_KIND_BIT(DECLARE_BIT) 2883 FOR_EACH_FUNCTION_KIND_BIT(DECLARE_BIT)
2989 #undef DECLARE_BIT 2884 #undef DECLARE_BIT
2990 kNumTagBits 2885 kNumTagBits
2991 }; 2886 };
2992 2887
2993 COMPILE_ASSERT( 2888 COMPILE_ASSERT(MethodRecognizer::kNumRecognizedMethods <
2994 MethodRecognizer::kNumRecognizedMethods < (1 << kRecognizedTagSize)); 2889 (1 << kRecognizedTagSize));
2995 COMPILE_ASSERT( 2890 COMPILE_ASSERT(kNumTagBits <=
2996 kNumTagBits <= 2891 (kBitsPerByte *
2997 (kBitsPerByte * sizeof(static_cast<RawFunction*>(0)->kind_tag_))); 2892 sizeof(static_cast<RawFunction*>(0)->kind_tag_)));
2998 2893
2999 class KindBits : 2894 class KindBits : public BitField<uint32_t,
3000 public BitField<uint32_t, RawFunction::Kind, kKindTagPos, kKindTagSize> {}; 2895 RawFunction::Kind,
2896 kKindTagPos,
2897 kKindTagSize> {};
3001 2898
3002 class RecognizedBits : public BitField<uint32_t, 2899 class RecognizedBits : public BitField<uint32_t,
3003 MethodRecognizer::Kind, 2900 MethodRecognizer::Kind,
3004 kRecognizedTagPos, 2901 kRecognizedTagPos,
3005 kRecognizedTagSize> {}; 2902 kRecognizedTagSize> {};
3006 class ModifierBits : public BitField<uint32_t, 2903 class ModifierBits : public BitField<uint32_t,
3007 RawFunction::AsyncModifier, 2904 RawFunction::AsyncModifier,
3008 kModifierPos, 2905 kModifierPos,
3009 kModifierSize> {}; 2906 kModifierSize> {};
3010 2907
3011 #define DEFINE_BIT(name, _) \ 2908 #define DEFINE_BIT(name, _) \
3012 class name##Bit : public BitField<uint32_t, bool, k##name##Bit, 1> {}; 2909 class name##Bit : public BitField<uint32_t, bool, k##name##Bit, 1> {};
3013 FOR_EACH_FUNCTION_KIND_BIT(DEFINE_BIT) 2910 FOR_EACH_FUNCTION_KIND_BIT(DEFINE_BIT)
3014 #undef DEFINE_BIT 2911 #undef DEFINE_BIT
3015 2912
3016 void set_name(const String& value) const; 2913 void set_name(const String& value) const;
3017 void set_kind(RawFunction::Kind value) const; 2914 void set_kind(RawFunction::Kind value) const;
3018 void set_parent_function(const Function& value) const; 2915 void set_parent_function(const Function& value) const;
3019 void set_owner(const Object& value) const; 2916 void set_owner(const Object& value) const;
3020 RawFunction* implicit_closure_function() const; 2917 RawFunction* implicit_closure_function() const;
3021 void set_implicit_closure_function(const Function& value) const; 2918 void set_implicit_closure_function(const Function& value) const;
3022 RawInstance* implicit_static_closure() const; 2919 RawInstance* implicit_static_closure() const;
3023 void set_implicit_static_closure(const Instance& closure) const; 2920 void set_implicit_static_closure(const Instance& closure) const;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3057 FINAL_HEAP_OBJECT_IMPLEMENTATION(Function, Object); 2954 FINAL_HEAP_OBJECT_IMPLEMENTATION(Function, Object);
3058 friend class Class; 2955 friend class Class;
3059 friend class SnapshotWriter; 2956 friend class SnapshotWriter;
3060 friend class Parser; // For set_eval_script. 2957 friend class Parser; // For set_eval_script.
3061 // RawFunction::VisitFunctionPointers accesses the private constructor of 2958 // RawFunction::VisitFunctionPointers accesses the private constructor of
3062 // Function. 2959 // Function.
3063 friend class RawFunction; 2960 friend class RawFunction;
3064 }; 2961 };
3065 2962
3066 2963
3067 class ClosureData: public Object { 2964 class ClosureData : public Object {
3068 public: 2965 public:
3069 static intptr_t InstanceSize() { 2966 static intptr_t InstanceSize() {
3070 return RoundedAllocationSize(sizeof(RawClosureData)); 2967 return RoundedAllocationSize(sizeof(RawClosureData));
3071 } 2968 }
3072 2969
3073 private: 2970 private:
3074 RawContextScope* context_scope() const { return raw_ptr()->context_scope_; } 2971 RawContextScope* context_scope() const { return raw_ptr()->context_scope_; }
3075 void set_context_scope(const ContextScope& value) const; 2972 void set_context_scope(const ContextScope& value) const;
3076 2973
3077 // Enclosing function of this local function. 2974 // Enclosing function of this local function.
3078 RawFunction* parent_function() const { return raw_ptr()->parent_function_; } 2975 RawFunction* parent_function() const { return raw_ptr()->parent_function_; }
3079 void set_parent_function(const Function& value) const; 2976 void set_parent_function(const Function& value) const;
3080 2977
3081 // Signature type of this closure function. 2978 // Signature type of this closure function.
3082 RawType* signature_type() const { return raw_ptr()->signature_type_; } 2979 RawType* signature_type() const { return raw_ptr()->signature_type_; }
3083 void set_signature_type(const Type& value) const; 2980 void set_signature_type(const Type& value) const;
3084 2981
3085 RawInstance* implicit_static_closure() const { 2982 RawInstance* implicit_static_closure() const { return raw_ptr()->closure_; }
3086 return raw_ptr()->closure_;
3087 }
3088 void set_implicit_static_closure(const Instance& closure) const; 2983 void set_implicit_static_closure(const Instance& closure) const;
3089 2984
3090 static RawClosureData* New(); 2985 static RawClosureData* New();
3091 2986
3092 FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object); 2987 FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object);
3093 friend class Class; 2988 friend class Class;
3094 friend class Function; 2989 friend class Function;
3095 friend class HeapProfiler; 2990 friend class HeapProfiler;
3096 }; 2991 };
3097 2992
3098 2993
3099 class RedirectionData: public Object { 2994 class RedirectionData : public Object {
3100 public: 2995 public:
3101 static intptr_t InstanceSize() { 2996 static intptr_t InstanceSize() {
3102 return RoundedAllocationSize(sizeof(RawRedirectionData)); 2997 return RoundedAllocationSize(sizeof(RawRedirectionData));
3103 } 2998 }
3104 2999
3105 private: 3000 private:
3106 // The type specifies the class and type arguments of the target constructor. 3001 // The type specifies the class and type arguments of the target constructor.
3107 RawType* type() const { return raw_ptr()->type_; } 3002 RawType* type() const { return raw_ptr()->type_; }
3108 void set_type(const Type& value) const; 3003 void set_type(const Type& value) const;
3109 3004
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
3187 3082
3188 inline RawInstance* StaticValue() const; 3083 inline RawInstance* StaticValue() const;
3189 inline void SetStaticValue(const Instance& value, 3084 inline void SetStaticValue(const Instance& value,
3190 bool save_initial_value = false) const; 3085 bool save_initial_value = false) const;
3191 3086
3192 RawClass* Owner() const; 3087 RawClass* Owner() const;
3193 RawClass* Origin() const; // Either mixin class, or same as owner(). 3088 RawClass* Origin() const; // Either mixin class, or same as owner().
3194 RawScript* Script() const; 3089 RawScript* Script() const;
3195 RawObject* RawOwner() const; 3090 RawObject* RawOwner() const;
3196 3091
3197 RawAbstractType* type() const { return raw_ptr()->type_; } 3092 RawAbstractType* type() const { return raw_ptr()->type_; }
3198 // Used by class finalizer, otherwise initialized in constructor. 3093 // Used by class finalizer, otherwise initialized in constructor.
3199 void SetFieldType(const AbstractType& value) const; 3094 void SetFieldType(const AbstractType& value) const;
3200 3095
3201 static intptr_t InstanceSize() { 3096 static intptr_t InstanceSize() {
3202 return RoundedAllocationSize(sizeof(RawField)); 3097 return RoundedAllocationSize(sizeof(RawField));
3203 } 3098 }
3204 3099
3205 static RawField* New(const String& name, 3100 static RawField* New(const String& name,
3206 bool is_static, 3101 bool is_static,
3207 bool is_final, 3102 bool is_final,
(...skipping 27 matching lines...) Expand all
3235 3130
3236 TokenPosition token_pos() const { return raw_ptr()->token_pos_; } 3131 TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
3237 3132
3238 bool has_initializer() const { 3133 bool has_initializer() const {
3239 return HasInitializerBit::decode(raw_ptr()->kind_bits_); 3134 return HasInitializerBit::decode(raw_ptr()->kind_bits_);
3240 } 3135 }
3241 // Called by parser after allocating field. 3136 // Called by parser after allocating field.
3242 void set_has_initializer(bool has_initializer) const { 3137 void set_has_initializer(bool has_initializer) const {
3243 ASSERT(IsOriginal()); 3138 ASSERT(IsOriginal());
3244 ASSERT(Thread::Current()->IsMutatorThread()); 3139 ASSERT(Thread::Current()->IsMutatorThread());
3245 set_kind_bits(HasInitializerBit::update(has_initializer, 3140 set_kind_bits(
3246 raw_ptr()->kind_bits_)); 3141 HasInitializerBit::update(has_initializer, raw_ptr()->kind_bits_));
3247 } 3142 }
3248 3143
3249 // Return class id that any non-null value read from this field is guaranteed 3144 // Return class id that any non-null value read from this field is guaranteed
3250 // to have or kDynamicCid if such class id is not known. 3145 // to have or kDynamicCid if such class id is not known.
3251 // Stores to this field must update this information hence the name. 3146 // Stores to this field must update this information hence the name.
3252 intptr_t guarded_cid() const { 3147 intptr_t guarded_cid() const {
3253 #if defined(DEGUG) 3148 #if defined(DEGUG)
3254 Thread* thread = Thread::Current(); 3149 Thread* thread = Thread::Current();
3255 ASSERT(!IsOriginal() || thread->IsMutator() || thread->IsAtSafepoint()); 3150 ASSERT(!IsOriginal() || thread->IsMutator() || thread->IsAtSafepoint());
3256 #endif 3151 #endif
(...skipping 26 matching lines...) Expand all
3283 } 3178 }
3284 3179
3285 bool needs_length_check() const { 3180 bool needs_length_check() const {
3286 const bool r = guarded_list_length() >= Field::kUnknownFixedLength; 3181 const bool r = guarded_list_length() >= Field::kUnknownFixedLength;
3287 ASSERT(!r || is_final()); 3182 ASSERT(!r || is_final());
3288 return r; 3183 return r;
3289 } 3184 }
3290 3185
3291 const char* GuardedPropertiesAsCString() const; 3186 const char* GuardedPropertiesAsCString() const;
3292 3187
3293 intptr_t UnboxedFieldCid() const { 3188 intptr_t UnboxedFieldCid() const { return guarded_cid(); }
3294 return guarded_cid();
3295 }
3296 3189
3297 bool is_unboxing_candidate() const { 3190 bool is_unboxing_candidate() const {
3298 return UnboxingCandidateBit::decode(raw_ptr()->kind_bits_); 3191 return UnboxingCandidateBit::decode(raw_ptr()->kind_bits_);
3299 } 3192 }
3300 // Default 'true', set to false once optimizing compiler determines it should 3193 // Default 'true', set to false once optimizing compiler determines it should
3301 // be boxed. 3194 // be boxed.
3302 void set_is_unboxing_candidate(bool b) const { 3195 void set_is_unboxing_candidate(bool b) const {
3303 ASSERT(IsOriginal()); 3196 ASSERT(IsOriginal());
3304 set_kind_bits(UnboxingCandidateBit::update(b, raw_ptr()->kind_bits_)); 3197 set_kind_bits(UnboxingCandidateBit::update(b, raw_ptr()->kind_bits_));
3305 } 3198 }
3306 3199
3307 static bool IsExternalizableCid(intptr_t cid); 3200 static bool IsExternalizableCid(intptr_t cid);
3308 3201
3309 enum { 3202 enum {
3310 kUnknownLengthOffset = -1, 3203 kUnknownLengthOffset = -1,
3311 kUnknownFixedLength = -1, 3204 kUnknownFixedLength = -1,
3312 kNoFixedLength = -2, 3205 kNoFixedLength = -2,
3313 }; 3206 };
3314 // Returns false if any value read from this field is guaranteed to be 3207 // Returns false if any value read from this field is guaranteed to be
3315 // not null. 3208 // not null.
3316 // Internally we is_nullable_ field contains either kNullCid (nullable) or 3209 // Internally we is_nullable_ field contains either kNullCid (nullable) or
3317 // any other value (non-nullable) instead of boolean. This is done to simplify 3210 // any other value (non-nullable) instead of boolean. This is done to simplify
3318 // guarding sequence in the generated code. 3211 // guarding sequence in the generated code.
3319 bool is_nullable() const { 3212 bool is_nullable() const { return raw_ptr()->is_nullable_ == kNullCid; }
3320 return raw_ptr()->is_nullable_ == kNullCid;
3321 }
3322 void set_is_nullable(bool val) const { 3213 void set_is_nullable(bool val) const {
3323 ASSERT(Thread::Current()->IsMutatorThread()); 3214 ASSERT(Thread::Current()->IsMutatorThread());
3324 StoreNonPointer(&raw_ptr()->is_nullable_, val ? kNullCid : kIllegalCid); 3215 StoreNonPointer(&raw_ptr()->is_nullable_, val ? kNullCid : kIllegalCid);
3325 } 3216 }
3326 static intptr_t is_nullable_offset() { 3217 static intptr_t is_nullable_offset() {
3327 return OFFSET_OF(RawField, is_nullable_); 3218 return OFFSET_OF(RawField, is_nullable_);
3328 } 3219 }
3329 3220
3330 // Record store of the given value into this field. May trigger 3221 // Record store of the given value into this field. May trigger
3331 // deoptimization of dependent optimized code. 3222 // deoptimization of dependent optimized code.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
3401 kStaticBit, 3292 kStaticBit,
3402 kFinalBit, 3293 kFinalBit,
3403 kHasInitializerBit, 3294 kHasInitializerBit,
3404 kUnboxingCandidateBit, 3295 kUnboxingCandidateBit,
3405 kReflectableBit, 3296 kReflectableBit,
3406 kDoubleInitializedBit, 3297 kDoubleInitializedBit,
3407 }; 3298 };
3408 class ConstBit : public BitField<uint8_t, bool, kConstBit, 1> {}; 3299 class ConstBit : public BitField<uint8_t, bool, kConstBit, 1> {};
3409 class StaticBit : public BitField<uint8_t, bool, kStaticBit, 1> {}; 3300 class StaticBit : public BitField<uint8_t, bool, kStaticBit, 1> {};
3410 class FinalBit : public BitField<uint8_t, bool, kFinalBit, 1> {}; 3301 class FinalBit : public BitField<uint8_t, bool, kFinalBit, 1> {};
3411 class HasInitializerBit : 3302 class HasInitializerBit
3412 public BitField<uint8_t, bool, kHasInitializerBit, 1> {}; 3303 : public BitField<uint8_t, bool, kHasInitializerBit, 1> {};
3413 class UnboxingCandidateBit : 3304 class UnboxingCandidateBit
3414 public BitField<uint8_t, bool, kUnboxingCandidateBit, 1> {}; 3305 : public BitField<uint8_t, bool, kUnboxingCandidateBit, 1> {};
3415 class ReflectableBit : public BitField<uint8_t, bool, kReflectableBit, 1> {}; 3306 class ReflectableBit : public BitField<uint8_t, bool, kReflectableBit, 1> {};
3416 class DoubleInitializedBit : 3307 class DoubleInitializedBit
3417 public BitField<uint8_t, bool, kDoubleInitializedBit, 1> {}; 3308 : public BitField<uint8_t, bool, kDoubleInitializedBit, 1> {};
3418 3309
3419 // Update guarded cid and guarded length for this field. Returns true, if 3310 // Update guarded cid and guarded length for this field. Returns true, if
3420 // deoptimization of dependent code is required. 3311 // deoptimization of dependent code is required.
3421 bool UpdateGuardedCidAndLength(const Object& value) const; 3312 bool UpdateGuardedCidAndLength(const Object& value) const;
3422 3313
3423 // Force this field's guard to be dynamic and deoptimize dependent code. 3314 // Force this field's guard to be dynamic and deoptimize dependent code.
3424 void ForceDynamicGuardedCidAndLength() const; 3315 void ForceDynamicGuardedCidAndLength() const;
3425 3316
3426 void set_name(const String& value) const; 3317 void set_name(const String& value) const;
3427 void set_is_static(bool is_static) const { 3318 void set_is_static(bool is_static) const {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3480 3371
3481 class TokenStream : public Object { 3372 class TokenStream : public Object {
3482 public: 3373 public:
3483 RawGrowableObjectArray* TokenObjects() const; 3374 RawGrowableObjectArray* TokenObjects() const;
3484 void SetTokenObjects(const GrowableObjectArray& value) const; 3375 void SetTokenObjects(const GrowableObjectArray& value) const;
3485 3376
3486 RawExternalTypedData* GetStream() const; 3377 RawExternalTypedData* GetStream() const;
3487 void SetStream(const ExternalTypedData& stream) const; 3378 void SetStream(const ExternalTypedData& stream) const;
3488 3379
3489 RawString* GenerateSource() const; 3380 RawString* GenerateSource() const;
3490 RawString* GenerateSource(TokenPosition start, 3381 RawString* GenerateSource(TokenPosition start, TokenPosition end) const;
3491 TokenPosition end) const;
3492 intptr_t ComputeSourcePosition(TokenPosition tok_pos) const; 3382 intptr_t ComputeSourcePosition(TokenPosition tok_pos) const;
3493 3383
3494 RawString* PrivateKey() const; 3384 RawString* PrivateKey() const;
3495 3385
3496 static const intptr_t kBytesPerElement = 1; 3386 static const intptr_t kBytesPerElement = 1;
3497 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; 3387 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
3498 3388
3499 static intptr_t InstanceSize() { 3389 static intptr_t InstanceSize() {
3500 return RoundedAllocationSize(sizeof(RawTokenStream)); 3390 return RoundedAllocationSize(sizeof(RawTokenStream));
3501 } 3391 }
3502 3392
3503 static RawTokenStream* New(intptr_t length); 3393 static RawTokenStream* New(intptr_t length);
3504 static RawTokenStream* New(const String& source, 3394 static RawTokenStream* New(const String& source,
3505 const String& private_key, 3395 const String& private_key,
3506 bool use_shared_tokens); 3396 bool use_shared_tokens);
3507 3397
3508 static void OpenSharedTokenList(Isolate* isolate); 3398 static void OpenSharedTokenList(Isolate* isolate);
3509 static void CloseSharedTokenList(Isolate* isolate); 3399 static void CloseSharedTokenList(Isolate* isolate);
3510 3400
3511 // The class Iterator encapsulates iteration over the tokens 3401 // The class Iterator encapsulates iteration over the tokens
3512 // in a TokenStream object. 3402 // in a TokenStream object.
3513 class Iterator : ValueObject { 3403 class Iterator : ValueObject {
3514 public: 3404 public:
3515 enum StreamType { 3405 enum StreamType { kNoNewlines, kAllTokens };
3516 kNoNewlines,
3517 kAllTokens
3518 };
3519 3406
3520 Iterator(Zone* zone, 3407 Iterator(Zone* zone,
3521 const TokenStream& tokens, 3408 const TokenStream& tokens,
3522 TokenPosition token_pos, 3409 TokenPosition token_pos,
3523 Iterator::StreamType stream_type = kNoNewlines); 3410 Iterator::StreamType stream_type = kNoNewlines);
3524 3411
3525 void SetStream(const TokenStream& tokens, TokenPosition token_pos); 3412 void SetStream(const TokenStream& tokens, TokenPosition token_pos);
3526 bool IsValid() const; 3413 bool IsValid() const;
3527 3414
3528 inline Token::Kind CurrentTokenKind() const { 3415 inline Token::Kind CurrentTokenKind() const { return cur_token_kind_; }
3529 return cur_token_kind_;
3530 }
3531 3416
3532 Token::Kind LookaheadTokenKind(intptr_t num_tokens); 3417 Token::Kind LookaheadTokenKind(intptr_t num_tokens);
3533 3418
3534 TokenPosition CurrentPosition() const; 3419 TokenPosition CurrentPosition() const;
3535 void SetCurrentPosition(TokenPosition token_pos); 3420 void SetCurrentPosition(TokenPosition token_pos);
3536 3421
3537 void Advance(); 3422 void Advance();
3538 3423
3539 RawObject* CurrentToken() const; 3424 RawObject* CurrentToken() const;
3540 RawString* CurrentLiteral() const; 3425 RawString* CurrentLiteral() const;
(...skipping 18 matching lines...) Expand all
3559 intptr_t cur_token_obj_index_; 3444 intptr_t cur_token_obj_index_;
3560 Iterator::StreamType stream_type_; 3445 Iterator::StreamType stream_type_;
3561 }; 3446 };
3562 3447
3563 private: 3448 private:
3564 void SetPrivateKey(const String& value) const; 3449 void SetPrivateKey(const String& value) const;
3565 3450
3566 static RawTokenStream* New(); 3451 static RawTokenStream* New();
3567 static void DataFinalizer(void* isolate_callback_data, 3452 static void DataFinalizer(void* isolate_callback_data,
3568 Dart_WeakPersistentHandle handle, 3453 Dart_WeakPersistentHandle handle,
3569 void *peer); 3454 void* peer);
3570 3455
3571 FINAL_HEAP_OBJECT_IMPLEMENTATION(TokenStream, Object); 3456 FINAL_HEAP_OBJECT_IMPLEMENTATION(TokenStream, Object);
3572 friend class Class; 3457 friend class Class;
3573 }; 3458 };
3574 3459
3575 3460
3576 class Script : public Object { 3461 class Script : public Object {
3577 public: 3462 public:
3578 RawString* url() const { return raw_ptr()->url_; } 3463 RawString* url() const { return raw_ptr()->url_; }
3579 3464
(...skipping 13 matching lines...) Expand all
3593 // The load time in milliseconds since epoch. 3478 // The load time in milliseconds since epoch.
3594 int64_t load_timestamp() const { return raw_ptr()->load_timestamp_; } 3479 int64_t load_timestamp() const { return raw_ptr()->load_timestamp_; }
3595 3480
3596 RawArray* compile_time_constants() const { 3481 RawArray* compile_time_constants() const {
3597 return raw_ptr()->compile_time_constants_; 3482 return raw_ptr()->compile_time_constants_;
3598 } 3483 }
3599 void set_compile_time_constants(const Array& value) const; 3484 void set_compile_time_constants(const Array& value) const;
3600 3485
3601 RawTokenStream* tokens() const { return raw_ptr()->tokens_; } 3486 RawTokenStream* tokens() const { return raw_ptr()->tokens_; }
3602 3487
3603 void Tokenize(const String& private_key, 3488 void Tokenize(const String& private_key, bool use_shared_tokens = true) const;
3604 bool use_shared_tokens = true) const;
3605 3489
3606 RawLibrary* FindLibrary() const; 3490 RawLibrary* FindLibrary() const;
3607 RawString* GetLine(intptr_t line_number, 3491 RawString* GetLine(intptr_t line_number,
3608 Heap::Space space = Heap::kNew) const; 3492 Heap::Space space = Heap::kNew) const;
3609 RawString* GetSnippet(intptr_t from_line, 3493 RawString* GetSnippet(intptr_t from_line,
3610 intptr_t from_column, 3494 intptr_t from_column,
3611 intptr_t to_line, 3495 intptr_t to_line,
3612 intptr_t to_column) const; 3496 intptr_t to_column) const;
3613 3497
3614 void SetLocationOffset(intptr_t line_offset, intptr_t col_offset) const; 3498 void SetLocationOffset(intptr_t line_offset, intptr_t col_offset) const;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3662 bool HasNext() const { return next_ix_ < size_; } 3546 bool HasNext() const { return next_ix_ < size_; }
3663 3547
3664 // Returns next non-null raw object. 3548 // Returns next non-null raw object.
3665 RawObject* GetNext(); 3549 RawObject* GetNext();
3666 3550
3667 private: 3551 private:
3668 void MoveToNextObject(); 3552 void MoveToNextObject();
3669 3553
3670 const Array& array_; 3554 const Array& array_;
3671 const int size_; // Number of elements to iterate over. 3555 const int size_; // Number of elements to iterate over.
3672 int next_ix_; // Index of next element. 3556 int next_ix_; // Index of next element.
3673 3557
3674 friend class ClassDictionaryIterator; 3558 friend class ClassDictionaryIterator;
3675 friend class LibraryPrefixIterator; 3559 friend class LibraryPrefixIterator;
3676 DISALLOW_COPY_AND_ASSIGN(DictionaryIterator); 3560 DISALLOW_COPY_AND_ASSIGN(DictionaryIterator);
3677 }; 3561 };
3678 3562
3679 3563
3680 class ClassDictionaryIterator : public DictionaryIterator { 3564 class ClassDictionaryIterator : public DictionaryIterator {
3681 public: 3565 public:
3682 enum IterationKind { 3566 enum IterationKind {
3683 // TODO(hausner): fix call sites that use kIteratePrivate. There is only 3567 // TODO(hausner): fix call sites that use kIteratePrivate. There is only
3684 // one top-level class per library left, not an array to iterate over. 3568 // one top-level class per library left, not an array to iterate over.
3685 kIteratePrivate, 3569 kIteratePrivate,
3686 kNoIteratePrivate 3570 kNoIteratePrivate
3687 }; 3571 };
3688 3572
3689 ClassDictionaryIterator(const Library& library, 3573 ClassDictionaryIterator(const Library& library,
3690 IterationKind kind = kNoIteratePrivate); 3574 IterationKind kind = kNoIteratePrivate);
3691 3575
3692 bool HasNext() const { 3576 bool HasNext() const {
3693 return (next_ix_ < size_) || !toplevel_class_.IsNull(); 3577 return (next_ix_ < size_) || !toplevel_class_.IsNull();
3694 } 3578 }
3695 3579
3696 // Returns a non-null raw class. 3580 // Returns a non-null raw class.
3697 RawClass* GetNextClass(); 3581 RawClass* GetNextClass();
3698 3582
3699 private: 3583 private:
3700 void MoveToNextClass(); 3584 void MoveToNextClass();
3701 3585
3702 Class& toplevel_class_; 3586 Class& toplevel_class_;
3703 3587
3704 DISALLOW_COPY_AND_ASSIGN(ClassDictionaryIterator); 3588 DISALLOW_COPY_AND_ASSIGN(ClassDictionaryIterator);
3705 }; 3589 };
3706 3590
3707 3591
3708 class LibraryPrefixIterator : public DictionaryIterator { 3592 class LibraryPrefixIterator : public DictionaryIterator {
3709 public: 3593 public:
3710 explicit LibraryPrefixIterator(const Library& library); 3594 explicit LibraryPrefixIterator(const Library& library);
3711 RawLibraryPrefix* GetNext(); 3595 RawLibraryPrefix* GetNext();
3596
3712 private: 3597 private:
3713 void Advance(); 3598 void Advance();
3714 DISALLOW_COPY_AND_ASSIGN(LibraryPrefixIterator); 3599 DISALLOW_COPY_AND_ASSIGN(LibraryPrefixIterator);
3715 }; 3600 };
3716 3601
3717 3602
3718 class Library : public Object { 3603 class Library : public Object {
3719 public: 3604 public:
3720 RawString* name() const { return raw_ptr()->name_; } 3605 RawString* name() const { return raw_ptr()->name_; }
3721 void SetName(const String& name) const; 3606 void SetName(const String& name) const;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
3797 RawObject* ResolveName(const String& name) const; 3682 RawObject* ResolveName(const String& name) const;
3798 3683
3799 void AddAnonymousClass(const Class& cls) const; 3684 void AddAnonymousClass(const Class& cls) const;
3800 3685
3801 void AddExport(const Namespace& ns) const; 3686 void AddExport(const Namespace& ns) const;
3802 3687
3803 void AddClassMetadata(const Class& cls, 3688 void AddClassMetadata(const Class& cls,
3804 const Object& tl_owner, 3689 const Object& tl_owner,
3805 TokenPosition token_pos) const; 3690 TokenPosition token_pos) const;
3806 void AddFieldMetadata(const Field& field, TokenPosition token_pos) const; 3691 void AddFieldMetadata(const Field& field, TokenPosition token_pos) const;
3807 void AddFunctionMetadata(const Function& func, 3692 void AddFunctionMetadata(const Function& func, TokenPosition token_pos) const;
3808 TokenPosition token_pos) const;
3809 void AddLibraryMetadata(const Object& tl_owner, 3693 void AddLibraryMetadata(const Object& tl_owner,
3810 TokenPosition token_pos) const; 3694 TokenPosition token_pos) const;
3811 void AddTypeParameterMetadata(const TypeParameter& param, 3695 void AddTypeParameterMetadata(const TypeParameter& param,
3812 TokenPosition token_pos) const; 3696 TokenPosition token_pos) const;
3813 RawObject* GetMetadata(const Object& obj) const; 3697 RawObject* GetMetadata(const Object& obj) const;
3814 3698
3815 RawClass* toplevel_class() const { 3699 RawClass* toplevel_class() const { return raw_ptr()->toplevel_class_; }
3816 return raw_ptr()->toplevel_class_;
3817 }
3818 void set_toplevel_class(const Class& value) const; 3700 void set_toplevel_class(const Class& value) const;
3819 3701
3820 RawGrowableObjectArray* patch_classes() const { 3702 RawGrowableObjectArray* patch_classes() const {
3821 return raw_ptr()->patch_classes_; 3703 return raw_ptr()->patch_classes_;
3822 } 3704 }
3823 3705
3824 // Library imports. 3706 // Library imports.
3825 RawArray* imports() const { return raw_ptr()->imports_; } 3707 RawArray* imports() const { return raw_ptr()->imports_; }
3826 RawArray* exports() const { return raw_ptr()->exports_; } 3708 RawArray* exports() const { return raw_ptr()->exports_; }
3827 void AddImport(const Namespace& ns) const; 3709 void AddImport(const Namespace& ns) const;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3859 3741
3860 intptr_t index() const { return raw_ptr()->index_; } 3742 intptr_t index() const { return raw_ptr()->index_; }
3861 void set_index(intptr_t value) const { 3743 void set_index(intptr_t value) const {
3862 StoreNonPointer(&raw_ptr()->index_, value); 3744 StoreNonPointer(&raw_ptr()->index_, value);
3863 } 3745 }
3864 3746
3865 void Register(Thread* thread) const; 3747 void Register(Thread* thread) const;
3866 static void RegisterLibraries(Thread* thread, 3748 static void RegisterLibraries(Thread* thread,
3867 const GrowableObjectArray& libs); 3749 const GrowableObjectArray& libs);
3868 3750
3869 bool IsDebuggable() const { 3751 bool IsDebuggable() const { return raw_ptr()->debuggable_; }
3870 return raw_ptr()->debuggable_;
3871 }
3872 void set_debuggable(bool value) const { 3752 void set_debuggable(bool value) const {
3873 StoreNonPointer(&raw_ptr()->debuggable_, value); 3753 StoreNonPointer(&raw_ptr()->debuggable_, value);
3874 } 3754 }
3875 3755
3876 bool is_dart_scheme() const { 3756 bool is_dart_scheme() const { return raw_ptr()->is_dart_scheme_; }
3877 return raw_ptr()->is_dart_scheme_;
3878 }
3879 void set_is_dart_scheme(bool value) const { 3757 void set_is_dart_scheme(bool value) const {
3880 StoreNonPointer(&raw_ptr()->is_dart_scheme_, value); 3758 StoreNonPointer(&raw_ptr()->is_dart_scheme_, value);
3881 } 3759 }
3882 3760
3883 bool IsCoreLibrary() const { 3761 bool IsCoreLibrary() const { return raw() == CoreLibrary(); }
3884 return raw() == CoreLibrary();
3885 }
3886 3762
3887 inline intptr_t UrlHash() const; 3763 inline intptr_t UrlHash() const;
3888 3764
3889 static RawLibrary* LookupLibrary(Thread* thread, const String& url); 3765 static RawLibrary* LookupLibrary(Thread* thread, const String& url);
3890 static RawLibrary* GetLibrary(intptr_t index); 3766 static RawLibrary* GetLibrary(intptr_t index);
3891 3767
3892 static void InitCoreLibrary(Isolate* isolate); 3768 static void InitCoreLibrary(Isolate* isolate);
3893 static void InitNativeWrappersLibrary(Isolate* isolate); 3769 static void InitNativeWrappersLibrary(Isolate* isolate);
3894 3770
3895 static RawLibrary* AsyncLibrary(); 3771 static RawLibrary* AsyncLibrary();
(...skipping 27 matching lines...) Expand all
3923 // helper methods and classes. Allow look up of private classes. 3799 // helper methods and classes. Allow look up of private classes.
3924 static RawClass* LookupCoreClass(const String& class_name); 3800 static RawClass* LookupCoreClass(const String& class_name);
3925 3801
3926 3802
3927 // Return Function::null() if function does not exist in libs. 3803 // Return Function::null() if function does not exist in libs.
3928 static RawFunction* GetFunction(const GrowableArray<Library*>& libs, 3804 static RawFunction* GetFunction(const GrowableArray<Library*>& libs,
3929 const char* class_name, 3805 const char* class_name,
3930 const char* function_name); 3806 const char* function_name);
3931 3807
3932 // Character used to indicate a private identifier. 3808 // Character used to indicate a private identifier.
3933 static const char kPrivateIdentifierStart = '_'; 3809 static const char kPrivateIdentifierStart = '_';
3934 3810
3935 // Character used to separate private identifiers from 3811 // Character used to separate private identifiers from
3936 // the library-specific key. 3812 // the library-specific key.
3937 static const char kPrivateKeySeparator = '@'; 3813 static const char kPrivateKeySeparator = '@';
3938 3814
3939 void CheckReload(const Library& replacement, 3815 void CheckReload(const Library& replacement,
3940 IsolateReloadContext* context) const; 3816 IsolateReloadContext* context) const;
3941 3817
3942 private: 3818 private:
3943 static const int kInitialImportsCapacity = 4; 3819 static const int kInitialImportsCapacity = 4;
(...skipping 18 matching lines...) Expand all
3962 void InvalidateResolvedName(const String& name) const; 3838 void InvalidateResolvedName(const String& name) const;
3963 void InvalidateResolvedNamesCache() const; 3839 void InvalidateResolvedNamesCache() const;
3964 3840
3965 RawArray* exported_names() const { return raw_ptr()->exported_names_; } 3841 RawArray* exported_names() const { return raw_ptr()->exported_names_; }
3966 bool LookupExportedNamesCache(const String& name, Object* obj) const; 3842 bool LookupExportedNamesCache(const String& name, Object* obj) const;
3967 void AddToExportedNamesCache(const String& name, const Object& obj) const; 3843 void AddToExportedNamesCache(const String& name, const Object& obj) const;
3968 3844
3969 3845
3970 void InitImportList() const; 3846 void InitImportList() const;
3971 void GrowDictionary(const Array& dict, intptr_t dict_size) const; 3847 void GrowDictionary(const Array& dict, intptr_t dict_size) const;
3972 static RawLibrary* NewLibraryHelper(const String& url, 3848 static RawLibrary* NewLibraryHelper(const String& url, bool import_core_lib);
3973 bool import_core_lib); 3849 RawObject* LookupEntry(const String& name, intptr_t* index) const;
3974 RawObject* LookupEntry(const String& name, intptr_t *index) const;
3975 3850
3976 void AllocatePrivateKey() const; 3851 void AllocatePrivateKey() const;
3977 3852
3978 RawString* MakeMetadataName(const Object& obj) const; 3853 RawString* MakeMetadataName(const Object& obj) const;
3979 RawField* GetMetadataField(const String& metaname) const; 3854 RawField* GetMetadataField(const String& metaname) const;
3980 void AddMetadata(const Object& owner, 3855 void AddMetadata(const Object& owner,
3981 const String& name, 3856 const String& name,
3982 TokenPosition token_pos) const; 3857 TokenPosition token_pos) const;
3983 3858
3984 FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object); 3859 FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4033 // which is stored in a typed data array (info_array). 3908 // which is stored in a typed data array (info_array).
4034 class ObjectPool : public Object { 3909 class ObjectPool : public Object {
4035 public: 3910 public:
4036 enum EntryType { 3911 enum EntryType {
4037 kTaggedObject, 3912 kTaggedObject,
4038 kImmediate, 3913 kImmediate,
4039 kNativeEntry, 3914 kNativeEntry,
4040 }; 3915 };
4041 3916
4042 struct Entry { 3917 struct Entry {
4043 Entry() : raw_value_(), type_() { } 3918 Entry() : raw_value_(), type_() {}
4044 explicit Entry(const Object* obj) : obj_(obj), type_(kTaggedObject) { } 3919 explicit Entry(const Object* obj) : obj_(obj), type_(kTaggedObject) {}
4045 Entry(uword value, EntryType info) : raw_value_(value), type_(info) { } 3920 Entry(uword value, EntryType info) : raw_value_(value), type_(info) {}
4046 union { 3921 union {
4047 const Object* obj_; 3922 const Object* obj_;
4048 uword raw_value_; 3923 uword raw_value_;
4049 }; 3924 };
4050 EntryType type_; 3925 EntryType type_;
4051 }; 3926 };
4052 3927
4053 intptr_t Length() const { 3928 intptr_t Length() const { return raw_ptr()->length_; }
4054 return raw_ptr()->length_;
4055 }
4056 void SetLength(intptr_t value) const { 3929 void SetLength(intptr_t value) const {
4057 StoreNonPointer(&raw_ptr()->length_, value); 3930 StoreNonPointer(&raw_ptr()->length_, value);
4058 } 3931 }
4059 3932
4060 RawTypedData* info_array() const { 3933 RawTypedData* info_array() const { return raw_ptr()->info_array_; }
4061 return raw_ptr()->info_array_;
4062 }
4063 3934
4064 void set_info_array(const TypedData& info_array) const; 3935 void set_info_array(const TypedData& info_array) const;
4065 3936
4066 static intptr_t length_offset() { return OFFSET_OF(RawObjectPool, length_); } 3937 static intptr_t length_offset() { return OFFSET_OF(RawObjectPool, length_); }
4067 static intptr_t data_offset() { 3938 static intptr_t data_offset() {
4068 return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data); 3939 return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data);
4069 } 3940 }
4070 static intptr_t element_offset(intptr_t index) { 3941 static intptr_t element_offset(intptr_t index) {
4071 return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data) 3942 return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data) +
4072 + kBytesPerElement * index; 3943 kBytesPerElement * index;
4073 } 3944 }
4074 3945
4075 EntryType InfoAt(intptr_t index) const; 3946 EntryType InfoAt(intptr_t index) const;
4076 3947
4077 RawObject* ObjectAt(intptr_t index) const { 3948 RawObject* ObjectAt(intptr_t index) const {
4078 ASSERT(InfoAt(index) == kTaggedObject); 3949 ASSERT(InfoAt(index) == kTaggedObject);
4079 return EntryAddr(index)->raw_obj_; 3950 return EntryAddr(index)->raw_obj_;
4080 } 3951 }
4081 void SetObjectAt(intptr_t index, const Object& obj) const { 3952 void SetObjectAt(intptr_t index, const Object& obj) const {
4082 ASSERT(InfoAt(index) == kTaggedObject); 3953 ASSERT(InfoAt(index) == kTaggedObject);
(...skipping 15 matching lines...) Expand all
4098 return 0; 3969 return 0;
4099 } 3970 }
4100 3971
4101 static const intptr_t kBytesPerElement = sizeof(RawObjectPool::Entry); 3972 static const intptr_t kBytesPerElement = sizeof(RawObjectPool::Entry);
4102 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; 3973 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
4103 3974
4104 static intptr_t InstanceSize(intptr_t len) { 3975 static intptr_t InstanceSize(intptr_t len) {
4105 // Ensure that variable length data is not adding to the object length. 3976 // Ensure that variable length data is not adding to the object length.
4106 ASSERT(sizeof(RawObjectPool) == (sizeof(RawObject) + (2 * kWordSize))); 3977 ASSERT(sizeof(RawObjectPool) == (sizeof(RawObject) + (2 * kWordSize)));
4107 ASSERT(0 <= len && len <= kMaxElements); 3978 ASSERT(0 <= len && len <= kMaxElements);
4108 return RoundedAllocationSize( 3979 return RoundedAllocationSize(sizeof(RawObjectPool) +
4109 sizeof(RawObjectPool) + (len * kBytesPerElement)); 3980 (len * kBytesPerElement));
4110 } 3981 }
4111 3982
4112 static RawObjectPool* New(intptr_t len); 3983 static RawObjectPool* New(intptr_t len);
4113 3984
4114 // Returns the pool index from the offset relative to a tagged RawObjectPool*, 3985 // Returns the pool index from the offset relative to a tagged RawObjectPool*,
4115 // adjusting for the tag-bit. 3986 // adjusting for the tag-bit.
4116 static intptr_t IndexFromOffset(intptr_t offset) { 3987 static intptr_t IndexFromOffset(intptr_t offset) {
4117 ASSERT(Utils::IsAligned(offset + kHeapObjectTag, kWordSize)); 3988 ASSERT(Utils::IsAligned(offset + kHeapObjectTag, kWordSize));
4118 return (offset + kHeapObjectTag - data_offset()) / kBytesPerElement; 3989 return (offset + kHeapObjectTag - data_offset()) / kBytesPerElement;
4119 } 3990 }
(...skipping 16 matching lines...) Expand all
4136 friend class RawObjectPool; 4007 friend class RawObjectPool;
4137 }; 4008 };
4138 4009
4139 4010
4140 class Instructions : public Object { 4011 class Instructions : public Object {
4141 public: 4012 public:
4142 // Excludes HeaderSize(). 4013 // Excludes HeaderSize().
4143 intptr_t size() const { return abs(raw_ptr()->size_); } 4014 intptr_t size() const { return abs(raw_ptr()->size_); }
4144 bool HasSingleEntryPoint() const { return raw_ptr()->size_ >= 0; } 4015 bool HasSingleEntryPoint() const { return raw_ptr()->size_ >= 0; }
4145 4016
4146 uword PayloadStart() const { 4017 uword PayloadStart() const { return PayloadStart(raw()); }
4147 return PayloadStart(raw()); 4018 uword CheckedEntryPoint() const { return CheckedEntryPoint(raw()); }
4148 } 4019 uword UncheckedEntryPoint() const { return UncheckedEntryPoint(raw()); }
4149 uword CheckedEntryPoint() const {
4150 return CheckedEntryPoint(raw());
4151 }
4152 uword UncheckedEntryPoint() const {
4153 return UncheckedEntryPoint(raw());
4154 }
4155 static uword PayloadStart(RawInstructions* instr) { 4020 static uword PayloadStart(RawInstructions* instr) {
4156 return reinterpret_cast<uword>(instr->ptr()) + HeaderSize(); 4021 return reinterpret_cast<uword>(instr->ptr()) + HeaderSize();
4157 } 4022 }
4158 4023
4159 #if defined(TARGET_ARCH_IA32) 4024 #if defined(TARGET_ARCH_IA32)
4160 static const intptr_t kCheckedEntryOffset = 0; 4025 static const intptr_t kCheckedEntryOffset = 0;
4161 static const intptr_t kUncheckedEntryOffset = 0; 4026 static const intptr_t kUncheckedEntryOffset = 0;
4162 #elif defined(TARGET_ARCH_X64) 4027 #elif defined(TARGET_ARCH_X64)
4163 static const intptr_t kCheckedEntryOffset = 16; 4028 static const intptr_t kCheckedEntryOffset = 16;
4164 static const intptr_t kUncheckedEntryOffset = 38; 4029 static const intptr_t kUncheckedEntryOffset = 38;
(...skipping 21 matching lines...) Expand all
4186 return entry; 4051 return entry;
4187 } 4052 }
4188 static uword UncheckedEntryPoint(RawInstructions* instr) { 4053 static uword UncheckedEntryPoint(RawInstructions* instr) {
4189 uword entry = PayloadStart(instr); 4054 uword entry = PayloadStart(instr);
4190 if (instr->ptr()->size_ < 0) { 4055 if (instr->ptr()->size_ < 0) {
4191 entry += kUncheckedEntryOffset; 4056 entry += kUncheckedEntryOffset;
4192 } 4057 }
4193 return entry; 4058 return entry;
4194 } 4059 }
4195 4060
4196 static const intptr_t kMaxElements = (kMaxInt32 - 4061 static const intptr_t kMaxElements =
4197 (sizeof(RawInstructions) + 4062 (kMaxInt32 - (sizeof(RawInstructions) + sizeof(RawObject) +
4198 sizeof(RawObject) + 4063 (2 * OS::kMaxPreferredCodeAlignment)));
4199 (2 * OS::kMaxPreferredCodeAlignment)));
4200 4064
4201 static intptr_t InstanceSize() { 4065 static intptr_t InstanceSize() {
4202 ASSERT(sizeof(RawInstructions) == 4066 ASSERT(sizeof(RawInstructions) ==
4203 OFFSET_OF_RETURNED_VALUE(RawInstructions, data)); 4067 OFFSET_OF_RETURNED_VALUE(RawInstructions, data));
4204 return 0; 4068 return 0;
4205 } 4069 }
4206 4070
4207 static intptr_t InstanceSize(intptr_t size) { 4071 static intptr_t InstanceSize(intptr_t size) {
4208 intptr_t instructions_size = Utils::RoundUp(size, 4072 intptr_t instructions_size =
4209 OS::PreferredCodeAlignment()); 4073 Utils::RoundUp(size, OS::PreferredCodeAlignment());
4210 intptr_t result = instructions_size + HeaderSize(); 4074 intptr_t result = instructions_size + HeaderSize();
4211 ASSERT(result % OS::PreferredCodeAlignment() == 0); 4075 ASSERT(result % OS::PreferredCodeAlignment() == 0);
4212 return result; 4076 return result;
4213 } 4077 }
4214 4078
4215 static intptr_t HeaderSize() { 4079 static intptr_t HeaderSize() {
4216 intptr_t alignment = OS::PreferredCodeAlignment(); 4080 intptr_t alignment = OS::PreferredCodeAlignment();
4217 return Utils::RoundUp(sizeof(RawInstructions), alignment); 4081 return Utils::RoundUp(sizeof(RawInstructions), alignment);
4218 } 4082 }
4219 4083
4220 static RawInstructions* FromPayloadStart(uword payload_start) { 4084 static RawInstructions* FromPayloadStart(uword payload_start) {
4221 return reinterpret_cast<RawInstructions*>( 4085 return reinterpret_cast<RawInstructions*>(payload_start - HeaderSize() +
4222 payload_start - HeaderSize() + kHeapObjectTag); 4086 kHeapObjectTag);
4223 } 4087 }
4224 4088
4225 bool Equals(const Instructions& other) const { 4089 bool Equals(const Instructions& other) const {
4226 if (size() != other.size()) { 4090 if (size() != other.size()) {
4227 return false; 4091 return false;
4228 } 4092 }
4229 NoSafepointScope no_safepoint; 4093 NoSafepointScope no_safepoint;
4230 return memcmp(raw_ptr(), other.raw_ptr(), InstanceSize(size())) == 0; 4094 return memcmp(raw_ptr(), other.raw_ptr(), InstanceSize(size())) == 0;
4231 } 4095 }
4232 4096
(...skipping 27 matching lines...) Expand all
4260 RawLocalVarDescriptors::VarInfo* info) const; 4124 RawLocalVarDescriptors::VarInfo* info) const;
4261 4125
4262 void GetInfo(intptr_t var_index, RawLocalVarDescriptors::VarInfo* info) const; 4126 void GetInfo(intptr_t var_index, RawLocalVarDescriptors::VarInfo* info) const;
4263 4127
4264 static const intptr_t kBytesPerElement = 4128 static const intptr_t kBytesPerElement =
4265 sizeof(RawLocalVarDescriptors::VarInfo); 4129 sizeof(RawLocalVarDescriptors::VarInfo);
4266 static const intptr_t kMaxElements = RawLocalVarDescriptors::kMaxIndex; 4130 static const intptr_t kMaxElements = RawLocalVarDescriptors::kMaxIndex;
4267 4131
4268 static intptr_t InstanceSize() { 4132 static intptr_t InstanceSize() {
4269 ASSERT(sizeof(RawLocalVarDescriptors) == 4133 ASSERT(sizeof(RawLocalVarDescriptors) ==
4270 OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, names)); 4134 OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, names));
4271 return 0; 4135 return 0;
4272 } 4136 }
4273 static intptr_t InstanceSize(intptr_t len) { 4137 static intptr_t InstanceSize(intptr_t len) {
4274 ASSERT(0 <= len && len <= kMaxElements); 4138 ASSERT(0 <= len && len <= kMaxElements);
4275 return RoundedAllocationSize(sizeof(RawLocalVarDescriptors) 4139 return RoundedAllocationSize(
4276 + (len * kWordSize) // RawStrings for names. 4140 sizeof(RawLocalVarDescriptors) +
4141 (len * kWordSize) // RawStrings for names.
4277 + (len * sizeof(RawLocalVarDescriptors::VarInfo))); 4142 + (len * sizeof(RawLocalVarDescriptors::VarInfo)));
4278 } 4143 }
4279 4144
4280 static RawLocalVarDescriptors* New(intptr_t num_variables); 4145 static RawLocalVarDescriptors* New(intptr_t num_variables);
4281 4146
4282 static const char* KindToCString(RawLocalVarDescriptors::VarInfoKind kind); 4147 static const char* KindToCString(RawLocalVarDescriptors::VarInfoKind kind);
4283 4148
4284 private: 4149 private:
4285 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object); 4150 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object);
4286 friend class Class; 4151 friend class Class;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4325 class Iterator : ValueObject { 4190 class Iterator : ValueObject {
4326 public: 4191 public:
4327 Iterator(const PcDescriptors& descriptors, intptr_t kind_mask) 4192 Iterator(const PcDescriptors& descriptors, intptr_t kind_mask)
4328 : descriptors_(descriptors), 4193 : descriptors_(descriptors),
4329 kind_mask_(kind_mask), 4194 kind_mask_(kind_mask),
4330 byte_index_(0), 4195 byte_index_(0),
4331 cur_pc_offset_(0), 4196 cur_pc_offset_(0),
4332 cur_kind_(0), 4197 cur_kind_(0),
4333 cur_deopt_id_(0), 4198 cur_deopt_id_(0),
4334 cur_token_pos_(0), 4199 cur_token_pos_(0),
4335 cur_try_index_(0) { 4200 cur_try_index_(0) {}
4336 }
4337 4201
4338 bool MoveNext() { 4202 bool MoveNext() {
4339 // Moves to record that matches kind_mask_. 4203 // Moves to record that matches kind_mask_.
4340 while (byte_index_ < descriptors_.Length()) { 4204 while (byte_index_ < descriptors_.Length()) {
4341 int32_t merged_kind_try = descriptors_.DecodeInteger(&byte_index_); 4205 int32_t merged_kind_try = descriptors_.DecodeInteger(&byte_index_);
4342 cur_kind_ = 4206 cur_kind_ =
4343 RawPcDescriptors::MergedKindTry::DecodeKind(merged_kind_try); 4207 RawPcDescriptors::MergedKindTry::DecodeKind(merged_kind_try);
4344 cur_try_index_ = 4208 cur_try_index_ =
4345 RawPcDescriptors::MergedKindTry::DecodeTryIndex(merged_kind_try); 4209 RawPcDescriptors::MergedKindTry::DecodeTryIndex(merged_kind_try);
4346 4210
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
4440 static void Dump(const CodeSourceMap& code_source_map, 4304 static void Dump(const CodeSourceMap& code_source_map,
4441 const Code& code, 4305 const Code& code,
4442 const Function& function); 4306 const Function& function);
4443 4307
4444 class Iterator : ValueObject { 4308 class Iterator : ValueObject {
4445 public: 4309 public:
4446 explicit Iterator(const CodeSourceMap& code_source_map) 4310 explicit Iterator(const CodeSourceMap& code_source_map)
4447 : code_source_map_(code_source_map), 4311 : code_source_map_(code_source_map),
4448 byte_index_(0), 4312 byte_index_(0),
4449 cur_pc_offset_(0), 4313 cur_pc_offset_(0),
4450 cur_token_pos_(0) { 4314 cur_token_pos_(0) {}
4451 }
4452 4315
4453 bool MoveNext() { 4316 bool MoveNext() {
4454 // Moves to the next record. 4317 // Moves to the next record.
4455 while (byte_index_ < code_source_map_.Length()) { 4318 while (byte_index_ < code_source_map_.Length()) {
4456 cur_pc_offset_ += code_source_map_.DecodeInteger(&byte_index_); 4319 cur_pc_offset_ += code_source_map_.DecodeInteger(&byte_index_);
4457 cur_token_pos_ += code_source_map_.DecodeInteger(&byte_index_); 4320 cur_token_pos_ += code_source_map_.DecodeInteger(&byte_index_);
4458 4321
4459 return true; 4322 return true;
4460 } 4323 }
4461 return false; 4324 return false;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
4521 4384
4522 static const intptr_t kMaxLengthInBytes = kSmiMax; 4385 static const intptr_t kMaxLengthInBytes = kSmiMax;
4523 4386
4524 static intptr_t InstanceSize() { 4387 static intptr_t InstanceSize() {
4525 ASSERT(sizeof(RawStackmap) == OFFSET_OF_RETURNED_VALUE(RawStackmap, data)); 4388 ASSERT(sizeof(RawStackmap) == OFFSET_OF_RETURNED_VALUE(RawStackmap, data));
4526 return 0; 4389 return 0;
4527 } 4390 }
4528 static intptr_t InstanceSize(intptr_t length) { 4391 static intptr_t InstanceSize(intptr_t length) {
4529 ASSERT(length >= 0); 4392 ASSERT(length >= 0);
4530 // The stackmap payload is in an array of bytes. 4393 // The stackmap payload is in an array of bytes.
4531 intptr_t payload_size = 4394 intptr_t payload_size = Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
4532 Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
4533 return RoundedAllocationSize(sizeof(RawStackmap) + payload_size); 4395 return RoundedAllocationSize(sizeof(RawStackmap) + payload_size);
4534 } 4396 }
4535 static RawStackmap* New(intptr_t pc_offset, 4397 static RawStackmap* New(intptr_t pc_offset,
4536 BitmapBuilder* bmap, 4398 BitmapBuilder* bmap,
4537 intptr_t register_bit_count); 4399 intptr_t register_bit_count);
4538 4400
4539 static RawStackmap* New(intptr_t length, 4401 static RawStackmap* New(intptr_t length,
4540 intptr_t register_bit_count, 4402 intptr_t register_bit_count,
4541 intptr_t pc_offset); 4403 intptr_t pc_offset);
4542 4404
4543 private: 4405 private:
4544 void SetLength(intptr_t length) const { 4406 void SetLength(intptr_t length) const {
4545 StoreNonPointer(&raw_ptr()->length_, length); 4407 StoreNonPointer(&raw_ptr()->length_, length);
4546 } 4408 }
4547 4409
4548 bool InRange(intptr_t index) const { return index < Length(); } 4410 bool InRange(intptr_t index) const { return index < Length(); }
4549 4411
4550 bool GetBit(intptr_t bit_index) const; 4412 bool GetBit(intptr_t bit_index) const;
4551 void SetBit(intptr_t bit_index, bool value) const; 4413 void SetBit(intptr_t bit_index, bool value) const;
4552 4414
4553 FINAL_HEAP_OBJECT_IMPLEMENTATION(Stackmap, Object); 4415 FINAL_HEAP_OBJECT_IMPLEMENTATION(Stackmap, Object);
4554 friend class BitmapBuilder; 4416 friend class BitmapBuilder;
4555 friend class Class; 4417 friend class Class;
(...skipping 24 matching lines...) Expand all
4580 bool HasCatchAll(intptr_t try_index) const; 4442 bool HasCatchAll(intptr_t try_index) const;
4581 4443
4582 static intptr_t InstanceSize() { 4444 static intptr_t InstanceSize() {
4583 ASSERT(sizeof(RawExceptionHandlers) == 4445 ASSERT(sizeof(RawExceptionHandlers) ==
4584 OFFSET_OF_RETURNED_VALUE(RawExceptionHandlers, data)); 4446 OFFSET_OF_RETURNED_VALUE(RawExceptionHandlers, data));
4585 return 0; 4447 return 0;
4586 } 4448 }
4587 static intptr_t InstanceSize(intptr_t len) { 4449 static intptr_t InstanceSize(intptr_t len) {
4588 return RoundedAllocationSize( 4450 return RoundedAllocationSize(
4589 sizeof(RawExceptionHandlers) + 4451 sizeof(RawExceptionHandlers) +
4590 (len * sizeof(RawExceptionHandlers::HandlerInfo))); 4452 (len * sizeof(RawExceptionHandlers::HandlerInfo)));
4591 } 4453 }
4592 4454
4593 static RawExceptionHandlers* New(intptr_t num_handlers); 4455 static RawExceptionHandlers* New(intptr_t num_handlers);
4594 static RawExceptionHandlers* New(const Array& handled_types_data); 4456 static RawExceptionHandlers* New(const Array& handled_types_data);
4595 4457
4596 // We would have a VisitPointers function here to traverse the 4458 // We would have a VisitPointers function here to traverse the
4597 // exception handler table to visit objects if any in the table. 4459 // exception handler table to visit objects if any in the table.
4598 4460
4599 private: 4461 private:
4600 // Pick somewhat arbitrary maximum number of exception handlers 4462 // Pick somewhat arbitrary maximum number of exception handlers
(...skipping 30 matching lines...) Expand all
4631 static intptr_t NumMaterializations(const GrowableArray<DeoptInstr*>&); 4493 static intptr_t NumMaterializations(const GrowableArray<DeoptInstr*>&);
4632 4494
4633 // Unpack the entire translation into an array of deoptimization 4495 // Unpack the entire translation into an array of deoptimization
4634 // instructions. This copies any shared suffixes into the array. 4496 // instructions. This copies any shared suffixes into the array.
4635 static void Unpack(const Array& table, 4497 static void Unpack(const Array& table,
4636 const TypedData& packed, 4498 const TypedData& packed,
4637 GrowableArray<DeoptInstr*>* instructions); 4499 GrowableArray<DeoptInstr*>* instructions);
4638 4500
4639 // Size of the frame part of the translation not counting kMaterializeObject 4501 // Size of the frame part of the translation not counting kMaterializeObject
4640 // instructions in the prefix. 4502 // instructions in the prefix.
4641 static const char* ToCString(const Array& table, 4503 static const char* ToCString(const Array& table, const TypedData& packed);
4642 const TypedData& packed);
4643 4504
4644 // Returns true iff decompression yields the same instructions as the 4505 // Returns true iff decompression yields the same instructions as the
4645 // original. 4506 // original.
4646 static bool VerifyDecompression(const GrowableArray<DeoptInstr*>& original, 4507 static bool VerifyDecompression(const GrowableArray<DeoptInstr*>& original,
4647 const Array& deopt_table, 4508 const Array& deopt_table,
4648 const TypedData& packed); 4509 const TypedData& packed);
4649 4510
4650 4511
4651 private: 4512 private:
4652 static void UnpackInto(const Array& table, 4513 static void UnpackInto(const Array& table,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4686 } 4547 }
4687 4548
4688 intptr_t pointer_offsets_length() const { 4549 intptr_t pointer_offsets_length() const {
4689 return PtrOffBits::decode(raw_ptr()->state_bits_); 4550 return PtrOffBits::decode(raw_ptr()->state_bits_);
4690 } 4551 }
4691 4552
4692 bool is_optimized() const { 4553 bool is_optimized() const {
4693 return OptimizedBit::decode(raw_ptr()->state_bits_); 4554 return OptimizedBit::decode(raw_ptr()->state_bits_);
4694 } 4555 }
4695 void set_is_optimized(bool value) const; 4556 void set_is_optimized(bool value) const;
4696 bool is_alive() const { 4557 bool is_alive() const { return AliveBit::decode(raw_ptr()->state_bits_); }
4697 return AliveBit::decode(raw_ptr()->state_bits_);
4698 }
4699 void set_is_alive(bool value) const; 4558 void set_is_alive(bool value) const;
4700 4559
4701 uword PayloadStart() const { 4560 uword PayloadStart() const {
4702 const Instructions& instr = Instructions::Handle(instructions()); 4561 const Instructions& instr = Instructions::Handle(instructions());
4703 return instr.PayloadStart(); 4562 return instr.PayloadStart();
4704 } 4563 }
4705 uword UncheckedEntryPoint() const { 4564 uword UncheckedEntryPoint() const {
4706 const Instructions& instr = Instructions::Handle(instructions()); 4565 const Instructions& instr = Instructions::Handle(instructions());
4707 return instr.UncheckedEntryPoint(); 4566 return instr.UncheckedEntryPoint();
4708 } 4567 }
4709 uword CheckedEntryPoint() const { 4568 uword CheckedEntryPoint() const {
4710 const Instructions& instr = Instructions::Handle(instructions()); 4569 const Instructions& instr = Instructions::Handle(instructions());
4711 return instr.CheckedEntryPoint(); 4570 return instr.CheckedEntryPoint();
4712 } 4571 }
4713 intptr_t Size() const { 4572 intptr_t Size() const {
4714 const Instructions& instr = Instructions::Handle(instructions()); 4573 const Instructions& instr = Instructions::Handle(instructions());
4715 return instr.size(); 4574 return instr.size();
4716 } 4575 }
4717 RawObjectPool* GetObjectPool() const { 4576 RawObjectPool* GetObjectPool() const { return object_pool(); }
4718 return object_pool();
4719 }
4720 bool ContainsInstructionAt(uword addr) const { 4577 bool ContainsInstructionAt(uword addr) const {
4721 const Instructions& instr = Instructions::Handle(instructions()); 4578 const Instructions& instr = Instructions::Handle(instructions());
4722 const uword offset = addr - instr.PayloadStart(); 4579 const uword offset = addr - instr.PayloadStart();
4723 return offset < static_cast<uword>(instr.size()); 4580 return offset < static_cast<uword>(instr.size());
4724 } 4581 }
4725 4582
4726 // Returns true if there is a debugger breakpoint set in this code object. 4583 // Returns true if there is a debugger breakpoint set in this code object.
4727 bool HasBreakpoint() const; 4584 bool HasBreakpoint() const;
4728 4585
4729 RawPcDescriptors* pc_descriptors() const { 4586 RawPcDescriptors* pc_descriptors() const {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4761 RawArray* deopt_info_array() const { 4618 RawArray* deopt_info_array() const {
4762 #if defined(DART_PRECOMPILED_RUNTIME) 4619 #if defined(DART_PRECOMPILED_RUNTIME)
4763 UNREACHABLE(); 4620 UNREACHABLE();
4764 return NULL; 4621 return NULL;
4765 #else 4622 #else
4766 return raw_ptr()->deopt_info_array_; 4623 return raw_ptr()->deopt_info_array_;
4767 #endif 4624 #endif
4768 } 4625 }
4769 void set_deopt_info_array(const Array& array) const; 4626 void set_deopt_info_array(const Array& array) const;
4770 4627
4771 RawArray* stackmaps() const { 4628 RawArray* stackmaps() const { return raw_ptr()->stackmaps_; }
4772 return raw_ptr()->stackmaps_;
4773 }
4774 void set_stackmaps(const Array& maps) const; 4629 void set_stackmaps(const Array& maps) const;
4775 RawStackmap* GetStackmap( 4630 RawStackmap* GetStackmap(uint32_t pc_offset,
4776 uint32_t pc_offset, Array* stackmaps, Stackmap* map) const; 4631 Array* stackmaps,
4632 Stackmap* map) const;
4777 4633
4778 enum { 4634 enum {
4779 kSCallTableOffsetEntry = 0, 4635 kSCallTableOffsetEntry = 0,
4780 kSCallTableFunctionEntry = 1, 4636 kSCallTableFunctionEntry = 1,
4781 kSCallTableCodeEntry = 2, 4637 kSCallTableCodeEntry = 2,
4782 kSCallTableEntryLength = 3, 4638 kSCallTableEntryLength = 3,
4783 }; 4639 };
4784 4640
4785 void set_static_calls_target_table(const Array& value) const; 4641 void set_static_calls_target_table(const Array& value) const;
4786 RawArray* static_calls_target_table() const { 4642 RawArray* static_calls_target_table() const {
(...skipping 30 matching lines...) Expand all
4817 4673
4818 intptr_t PCOffsetAt(intptr_t idx) const; 4674 intptr_t PCOffsetAt(intptr_t idx) const;
4819 RawString* CommentAt(intptr_t idx) const; 4675 RawString* CommentAt(intptr_t idx) const;
4820 4676
4821 private: 4677 private:
4822 explicit Comments(const Array& comments); 4678 explicit Comments(const Array& comments);
4823 4679
4824 // Layout of entries describing comments. 4680 // Layout of entries describing comments.
4825 enum { 4681 enum {
4826 kPCOffsetEntry = 0, // PC offset to a comment as a Smi. 4682 kPCOffsetEntry = 0, // PC offset to a comment as a Smi.
4827 kCommentEntry, // Comment text as a String. 4683 kCommentEntry, // Comment text as a String.
4828 kNumberOfEntries 4684 kNumberOfEntries
4829 }; 4685 };
4830 4686
4831 const Array& comments_; 4687 const Array& comments_;
4832 4688
4833 friend class Code; 4689 friend class Code;
4834 4690
4835 DISALLOW_COPY_AND_ASSIGN(Comments); 4691 DISALLOW_COPY_AND_ASSIGN(Comments);
4836 }; 4692 };
4837 4693
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
4907 StorePointer(&raw_ptr()->exception_handlers_, handlers.raw()); 4763 StorePointer(&raw_ptr()->exception_handlers_, handlers.raw());
4908 } 4764 }
4909 4765
4910 // TODO(turnidge): Consider dropping this function and making 4766 // TODO(turnidge): Consider dropping this function and making
4911 // everybody use owner(). Currently this function is misused - even 4767 // everybody use owner(). Currently this function is misused - even
4912 // while generating the snapshot. 4768 // while generating the snapshot.
4913 RawFunction* function() const { 4769 RawFunction* function() const {
4914 return reinterpret_cast<RawFunction*>(raw_ptr()->owner_); 4770 return reinterpret_cast<RawFunction*>(raw_ptr()->owner_);
4915 } 4771 }
4916 4772
4917 RawObject* owner() const { 4773 RawObject* owner() const { return raw_ptr()->owner_; }
4918 return raw_ptr()->owner_;
4919 }
4920 4774
4921 void set_owner(const Function& function) const { 4775 void set_owner(const Function& function) const {
4922 ASSERT(function.IsOld()); 4776 ASSERT(function.IsOld());
4923 StorePointer(&raw_ptr()->owner_, 4777 StorePointer(&raw_ptr()->owner_,
4924 reinterpret_cast<RawObject*>(function.raw())); 4778 reinterpret_cast<RawObject*>(function.raw()));
4925 } 4779 }
4926 4780
4927 void set_owner(const Class& cls) { 4781 void set_owner(const Class& cls) {
4928 ASSERT(cls.IsOld()); 4782 ASSERT(cls.IsOld());
4929 StorePointer(&raw_ptr()->owner_, reinterpret_cast<RawObject*>(cls.raw())); 4783 StorePointer(&raw_ptr()->owner_, reinterpret_cast<RawObject*>(cls.raw()));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
4983 4837
4984 void DisableStubCode() const; 4838 void DisableStubCode() const;
4985 4839
4986 void Enable() const { 4840 void Enable() const {
4987 if (!IsDisabled()) return; 4841 if (!IsDisabled()) return;
4988 ASSERT(Thread::Current()->IsMutatorThread()); 4842 ASSERT(Thread::Current()->IsMutatorThread());
4989 ASSERT(instructions() != active_instructions()); 4843 ASSERT(instructions() != active_instructions());
4990 SetActiveInstructions(Instructions::Handle(instructions())); 4844 SetActiveInstructions(Instructions::Handle(instructions()));
4991 } 4845 }
4992 4846
4993 bool IsDisabled() const { 4847 bool IsDisabled() const { return instructions() != active_instructions(); }
4994 return instructions() != active_instructions();
4995 }
4996 4848
4997 private: 4849 private:
4998 void set_state_bits(intptr_t bits) const; 4850 void set_state_bits(intptr_t bits) const;
4999 4851
5000 void set_object_pool(RawObjectPool* object_pool) const { 4852 void set_object_pool(RawObjectPool* object_pool) const {
5001 StorePointer(&raw_ptr()->object_pool_, object_pool); 4853 StorePointer(&raw_ptr()->object_pool_, object_pool);
5002 } 4854 }
5003 4855
5004 friend class RawObject; // For RawObject::SizeFromClass(). 4856 friend class RawObject; // For RawObject::SizeFromClass().
5005 friend class RawCode; 4857 friend class RawCode;
5006 enum { 4858 enum {
5007 kOptimizedBit = 0, 4859 kOptimizedBit = 0,
5008 kAliveBit = 1, 4860 kAliveBit = 1,
5009 kPtrOffBit = 2, 4861 kPtrOffBit = 2,
5010 kPtrOffSize = 30, 4862 kPtrOffSize = 30,
5011 }; 4863 };
5012 4864
5013 class OptimizedBit : public BitField<int32_t, bool, kOptimizedBit, 1> {}; 4865 class OptimizedBit : public BitField<int32_t, bool, kOptimizedBit, 1> {};
5014 class AliveBit : public BitField<int32_t, bool, kAliveBit, 1> {}; 4866 class AliveBit : public BitField<int32_t, bool, kAliveBit, 1> {};
5015 class PtrOffBits : 4867 class PtrOffBits
5016 public BitField<int32_t, intptr_t, kPtrOffBit, kPtrOffSize> {}; 4868 : public BitField<int32_t, intptr_t, kPtrOffBit, kPtrOffSize> {};
5017 4869
5018 class SlowFindRawCodeVisitor : public FindObjectVisitor { 4870 class SlowFindRawCodeVisitor : public FindObjectVisitor {
5019 public: 4871 public:
5020 explicit SlowFindRawCodeVisitor(uword pc) : pc_(pc) { } 4872 explicit SlowFindRawCodeVisitor(uword pc) : pc_(pc) {}
5021 virtual ~SlowFindRawCodeVisitor() { } 4873 virtual ~SlowFindRawCodeVisitor() {}
5022 4874
5023 // Check if object matches find condition. 4875 // Check if object matches find condition.
5024 virtual bool FindObject(RawObject* obj) const; 4876 virtual bool FindObject(RawObject* obj) const;
5025 4877
5026 private: 4878 private:
5027 const uword pc_; 4879 const uword pc_;
5028 4880
5029 DISALLOW_COPY_AND_ASSIGN(SlowFindRawCodeVisitor); 4881 DISALLOW_COPY_AND_ASSIGN(SlowFindRawCodeVisitor);
5030 }; 4882 };
5031 4883
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
5194 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; 5046 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5195 5047
5196 static intptr_t InstanceSize() { 5048 static intptr_t InstanceSize() {
5197 ASSERT(sizeof(RawContextScope) == 5049 ASSERT(sizeof(RawContextScope) ==
5198 OFFSET_OF_RETURNED_VALUE(RawContextScope, data)); 5050 OFFSET_OF_RETURNED_VALUE(RawContextScope, data));
5199 return 0; 5051 return 0;
5200 } 5052 }
5201 5053
5202 static intptr_t InstanceSize(intptr_t len) { 5054 static intptr_t InstanceSize(intptr_t len) {
5203 ASSERT(0 <= len && len <= kMaxElements); 5055 ASSERT(0 <= len && len <= kMaxElements);
5204 return RoundedAllocationSize( 5056 return RoundedAllocationSize(sizeof(RawContextScope) +
5205 sizeof(RawContextScope) + (len * kBytesPerElement)); 5057 (len * kBytesPerElement));
5206 } 5058 }
5207 5059
5208 static RawContextScope* New(intptr_t num_variables, bool is_implicit); 5060 static RawContextScope* New(intptr_t num_variables, bool is_implicit);
5209 5061
5210 private: 5062 private:
5211 void set_num_variables(intptr_t num_variables) const { 5063 void set_num_variables(intptr_t num_variables) const {
5212 StoreNonPointer(&raw_ptr()->num_variables_, num_variables); 5064 StoreNonPointer(&raw_ptr()->num_variables_, num_variables);
5213 } 5065 }
5214 5066
5215 void set_is_implicit(bool is_implicit) const { 5067 void set_is_implicit(bool is_implicit) const {
(...skipping 16 matching lines...) Expand all
5232 static const intptr_t kInitialCapacity = 16; 5084 static const intptr_t kInitialCapacity = 16;
5233 static const intptr_t kSpreadFactor = 7; 5085 static const intptr_t kSpreadFactor = 7;
5234 static const double kLoadFactor; 5086 static const double kLoadFactor;
5235 5087
5236 RawArray* buckets() const; 5088 RawArray* buckets() const;
5237 void set_buckets(const Array& buckets) const; 5089 void set_buckets(const Array& buckets) const;
5238 5090
5239 intptr_t mask() const; 5091 intptr_t mask() const;
5240 void set_mask(intptr_t mask) const; 5092 void set_mask(intptr_t mask) const;
5241 5093
5242 RawString* target_name() const { 5094 RawString* target_name() const { return raw_ptr()->target_name_; }
5243 return raw_ptr()->target_name_;
5244 }
5245 5095
5246 RawArray* arguments_descriptor() const { 5096 RawArray* arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
5247 return raw_ptr()->args_descriptor_;
5248 }
5249 5097
5250 intptr_t filled_entry_count() const; 5098 intptr_t filled_entry_count() const;
5251 void set_filled_entry_count(intptr_t num) const; 5099 void set_filled_entry_count(intptr_t num) const;
5252 5100
5253 static intptr_t buckets_offset() { 5101 static intptr_t buckets_offset() {
5254 return OFFSET_OF(RawMegamorphicCache, buckets_); 5102 return OFFSET_OF(RawMegamorphicCache, buckets_);
5255 } 5103 }
5256 static intptr_t mask_offset() { 5104 static intptr_t mask_offset() {
5257 return OFFSET_OF(RawMegamorphicCache, mask_); 5105 return OFFSET_OF(RawMegamorphicCache, mask_);
5258 } 5106 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
5300 }; 5148 };
5301 5149
5302 5150
5303 class SubtypeTestCache : public Object { 5151 class SubtypeTestCache : public Object {
5304 public: 5152 public:
5305 enum Entries { 5153 enum Entries {
5306 kInstanceClassIdOrFunction = 0, 5154 kInstanceClassIdOrFunction = 0,
5307 kInstanceTypeArguments = 1, 5155 kInstanceTypeArguments = 1,
5308 kInstantiatorTypeArguments = 2, 5156 kInstantiatorTypeArguments = 2,
5309 kTestResult = 3, 5157 kTestResult = 3,
5310 kTestEntryLength = 4, 5158 kTestEntryLength = 4,
5311 }; 5159 };
5312 5160
5313 intptr_t NumberOfChecks() const; 5161 intptr_t NumberOfChecks() const;
5314 void AddCheck(const Object& instance_class_id_or_function, 5162 void AddCheck(const Object& instance_class_id_or_function,
5315 const TypeArguments& instance_type_arguments, 5163 const TypeArguments& instance_type_arguments,
5316 const TypeArguments& instantiator_type_arguments, 5164 const TypeArguments& instantiator_type_arguments,
5317 const Bool& test_result) const; 5165 const Bool& test_result) const;
5318 void GetCheck(intptr_t ix, 5166 void GetCheck(intptr_t ix,
5319 Object* instance_class_id_or_function, 5167 Object* instance_class_id_or_function,
5320 TypeArguments* instance_type_arguments, 5168 TypeArguments* instance_type_arguments,
5321 TypeArguments* instantiator_type_arguments, 5169 TypeArguments* instantiator_type_arguments,
5322 Bool* test_result) const; 5170 Bool* test_result) const;
5323 5171
5324 static RawSubtypeTestCache* New(); 5172 static RawSubtypeTestCache* New();
5325 5173
5326 static intptr_t InstanceSize() { 5174 static intptr_t InstanceSize() {
5327 return RoundedAllocationSize(sizeof(RawSubtypeTestCache)); 5175 return RoundedAllocationSize(sizeof(RawSubtypeTestCache));
5328 } 5176 }
5329 5177
5330 static intptr_t cache_offset() { 5178 static intptr_t cache_offset() {
5331 return OFFSET_OF(RawSubtypeTestCache, cache_); 5179 return OFFSET_OF(RawSubtypeTestCache, cache_);
5332 } 5180 }
5333 5181
5334 private: 5182 private:
5335 RawArray* cache() const { 5183 RawArray* cache() const { return raw_ptr()->cache_; }
5336 return raw_ptr()->cache_;
5337 }
5338 5184
5339 void set_cache(const Array& value) const; 5185 void set_cache(const Array& value) const;
5340 5186
5341 intptr_t TestEntryLength() const; 5187 intptr_t TestEntryLength() const;
5342 5188
5343 FINAL_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache, Object); 5189 FINAL_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache, Object);
5344 friend class Class; 5190 friend class Class;
5345 }; 5191 };
5346 5192
5347 5193
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
5390 return RoundedAllocationSize(sizeof(RawLanguageError)); 5236 return RoundedAllocationSize(sizeof(RawLanguageError));
5391 } 5237 }
5392 5238
5393 // A null script means no source and a negative token_pos means no position. 5239 // A null script means no source and a negative token_pos means no position.
5394 static RawLanguageError* NewFormatted(const Error& prev_error, 5240 static RawLanguageError* NewFormatted(const Error& prev_error,
5395 const Script& script, 5241 const Script& script,
5396 TokenPosition token_pos, 5242 TokenPosition token_pos,
5397 bool report_after_token, 5243 bool report_after_token,
5398 Report::Kind kind, 5244 Report::Kind kind,
5399 Heap::Space space, 5245 Heap::Space space,
5400 const char* format, ...) 5246 const char* format,
5401 PRINTF_ATTRIBUTE(7, 8); 5247 ...) PRINTF_ATTRIBUTE(7, 8);
5402 5248
5403 static RawLanguageError* NewFormattedV(const Error& prev_error, 5249 static RawLanguageError* NewFormattedV(const Error& prev_error,
5404 const Script& script, 5250 const Script& script,
5405 TokenPosition token_pos, 5251 TokenPosition token_pos,
5406 bool report_after_token, 5252 bool report_after_token,
5407 Report::Kind kind, 5253 Report::Kind kind,
5408 Heap::Space space, 5254 Heap::Space space,
5409 const char* format, va_list args); 5255 const char* format,
5256 va_list args);
5410 5257
5411 static RawLanguageError* New(const String& formatted_message, 5258 static RawLanguageError* New(const String& formatted_message,
5412 Report::Kind kind = Report::kError, 5259 Report::Kind kind = Report::kError,
5413 Heap::Space space = Heap::kNew); 5260 Heap::Space space = Heap::kNew);
5414 5261
5415 virtual const char* ToErrorCString() const; 5262 virtual const char* ToErrorCString() const;
5416 5263
5417 TokenPosition token_pos() const { return raw_ptr()->token_pos_; } 5264 TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
5418 5265
5419 private: 5266 private:
5420 RawError* previous_error() const { 5267 RawError* previous_error() const { return raw_ptr()->previous_error_; }
5421 return raw_ptr()->previous_error_;
5422 }
5423 void set_previous_error(const Error& value) const; 5268 void set_previous_error(const Error& value) const;
5424 5269
5425 RawScript* script() const { return raw_ptr()->script_; } 5270 RawScript* script() const { return raw_ptr()->script_; }
5426 void set_script(const Script& value) const; 5271 void set_script(const Script& value) const;
5427 5272
5428 void set_token_pos(TokenPosition value) const; 5273 void set_token_pos(TokenPosition value) const;
5429 5274
5430 bool report_after_token() const { return raw_ptr()->report_after_token_; } 5275 bool report_after_token() const { return raw_ptr()->report_after_token_; }
5431 void set_report_after_token(bool value); 5276 void set_report_after_token(bool value);
5432 5277
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
5540 5385
5541 // Returns true if all fields are OK for canonicalization. 5386 // Returns true if all fields are OK for canonicalization.
5542 virtual bool CheckAndCanonicalizeFields(Thread* thread, 5387 virtual bool CheckAndCanonicalizeFields(Thread* thread,
5543 const char** error_str) const; 5388 const char** error_str) const;
5544 5389
5545 #if defined(DEBUG) 5390 #if defined(DEBUG)
5546 // Check if instance is canonical. 5391 // Check if instance is canonical.
5547 virtual bool CheckIsCanonical(Thread* thread) const; 5392 virtual bool CheckIsCanonical(Thread* thread) const;
5548 #endif // DEBUG 5393 #endif // DEBUG
5549 5394
5550 RawObject* GetField(const Field& field) const { 5395 RawObject* GetField(const Field& field) const { return *FieldAddr(field); }
5551 return *FieldAddr(field);
5552 }
5553 5396
5554 void SetField(const Field& field, const Object& value) const { 5397 void SetField(const Field& field, const Object& value) const {
5555 field.RecordStore(value); 5398 field.RecordStore(value);
5556 StorePointer(FieldAddr(field), value.raw()); 5399 StorePointer(FieldAddr(field), value.raw());
5557 } 5400 }
5558 5401
5559 RawAbstractType* GetType() const; 5402 RawAbstractType* GetType() const;
5560 5403
5561 virtual RawTypeArguments* GetTypeArguments() const; 5404 virtual RawTypeArguments* GetTypeArguments() const;
5562 virtual void SetTypeArguments(const TypeArguments& value) const; 5405 virtual void SetTypeArguments(const TypeArguments& value) const;
5563 5406
5564 // Check if the type of this instance is a subtype of the given type. 5407 // Check if the type of this instance is a subtype of the given type.
5565 bool IsInstanceOf(const AbstractType& type, 5408 bool IsInstanceOf(const AbstractType& type,
5566 const TypeArguments& type_instantiator, 5409 const TypeArguments& type_instantiator,
5567 Error* bound_error) const; 5410 Error* bound_error) const;
5568 5411
5569 bool IsValidNativeIndex(int index) const { 5412 bool IsValidNativeIndex(int index) const {
5570 return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_)); 5413 return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_));
5571 } 5414 }
5572 5415
5573 intptr_t* NativeFieldsDataAddr() const; 5416 intptr_t* NativeFieldsDataAddr() const;
5574 inline intptr_t GetNativeField(int index) const; 5417 inline intptr_t GetNativeField(int index) const;
5575 inline void GetNativeFields(uint16_t num_fields, 5418 inline void GetNativeFields(uint16_t num_fields,
5576 intptr_t* field_values) const; 5419 intptr_t* field_values) const;
5577 void SetNativeFields(uint16_t num_fields, 5420 void SetNativeFields(uint16_t num_fields, const intptr_t* field_values) const;
5578 const intptr_t* field_values) const;
5579 5421
5580 uint16_t NumNativeFields() const { 5422 uint16_t NumNativeFields() const {
5581 return clazz()->ptr()->num_native_fields_; 5423 return clazz()->ptr()->num_native_fields_;
5582 } 5424 }
5583 5425
5584 void SetNativeField(int index, intptr_t value) const; 5426 void SetNativeField(int index, intptr_t value) const;
5585 5427
5586 // If the instance is a callable object, i.e. a closure or the instance of a 5428 // If the instance is a callable object, i.e. a closure or the instance of a
5587 // class implementing a 'call' method, return true and set the function 5429 // class implementing a 'call' method, return true and set the function
5588 // (if not NULL) to call. 5430 // (if not NULL) to call.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
5625 return FieldAddrAtOffset(field.Offset()); 5467 return FieldAddrAtOffset(field.Offset());
5626 } 5468 }
5627 RawObject** NativeFieldsAddr() const { 5469 RawObject** NativeFieldsAddr() const {
5628 return FieldAddrAtOffset(sizeof(RawObject)); 5470 return FieldAddrAtOffset(sizeof(RawObject));
5629 } 5471 }
5630 void SetFieldAtOffset(intptr_t offset, const Object& value) const { 5472 void SetFieldAtOffset(intptr_t offset, const Object& value) const {
5631 StorePointer(FieldAddrAtOffset(offset), value.raw()); 5473 StorePointer(FieldAddrAtOffset(offset), value.raw());
5632 } 5474 }
5633 bool IsValidFieldOffset(intptr_t offset) const; 5475 bool IsValidFieldOffset(intptr_t offset) const;
5634 5476
5635 static intptr_t NextFieldOffset() { 5477 static intptr_t NextFieldOffset() { return sizeof(RawInstance); }
5636 return sizeof(RawInstance);
5637 }
5638 5478
5639 // The follwoing raw methods are used for morphing. 5479 // The follwoing raw methods are used for morphing.
5640 // They are needed due to the extraction of the class in IsValidFieldOffset. 5480 // They are needed due to the extraction of the class in IsValidFieldOffset.
5641 RawObject** RawFieldAddrAtOffset(intptr_t offset) const { 5481 RawObject** RawFieldAddrAtOffset(intptr_t offset) const {
5642 return reinterpret_cast<RawObject**>(raw_value() - kHeapObjectTag + offset); 5482 return reinterpret_cast<RawObject**>(raw_value() - kHeapObjectTag + offset);
5643 } 5483 }
5644 RawObject* RawGetFieldAtOffset(intptr_t offset) const { 5484 RawObject* RawGetFieldAtOffset(intptr_t offset) const {
5645 return *RawFieldAddrAtOffset(offset); 5485 return *RawFieldAddrAtOffset(offset);
5646 } 5486 }
5647 void RawSetFieldAtOffset(intptr_t offset, const Object& value) const { 5487 void RawSetFieldAtOffset(intptr_t offset, const Object& value) const {
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
5775 // Return a clone of this unfinalized type or the type itself if it is 5615 // Return a clone of this unfinalized type or the type itself if it is
5776 // already finalized. Apply recursively to type arguments, i.e. finalized 5616 // already finalized. Apply recursively to type arguments, i.e. finalized
5777 // type arguments of an unfinalized type are not cloned, but shared. 5617 // type arguments of an unfinalized type are not cloned, but shared.
5778 virtual RawAbstractType* CloneUnfinalized() const; 5618 virtual RawAbstractType* CloneUnfinalized() const;
5779 5619
5780 // Return a clone of this uninstantiated type where all references to type 5620 // Return a clone of this uninstantiated type where all references to type
5781 // parameters are replaced with references to type parameters of the same name 5621 // parameters are replaced with references to type parameters of the same name
5782 // but belonging to the new owner class. 5622 // but belonging to the new owner class.
5783 // Apply recursively to type arguments, i.e. instantiated type arguments of 5623 // Apply recursively to type arguments, i.e. instantiated type arguments of
5784 // an uninstantiated type are not cloned, but shared. 5624 // an uninstantiated type are not cloned, but shared.
5785 virtual RawAbstractType* CloneUninstantiated( 5625 virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
5786 const Class& new_owner, TrailPtr trail = NULL) const; 5626 TrailPtr trail = NULL) const;
5787 5627
5788 virtual RawInstance* CheckAndCanonicalize(Thread* thread, 5628 virtual RawInstance* CheckAndCanonicalize(Thread* thread,
5789 const char** error_str) const { 5629 const char** error_str) const {
5790 return Canonicalize(); 5630 return Canonicalize();
5791 } 5631 }
5792 5632
5793 // Return the canonical version of this type. 5633 // Return the canonical version of this type.
5794 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; 5634 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
5795 5635
5796 #if defined(DEBUG) 5636 #if defined(DEBUG)
(...skipping 17 matching lines...) Expand all
5814 // the trail and return false. 5654 // the trail and return false.
5815 bool TestAndAddToTrail(TrailPtr* trail) const; 5655 bool TestAndAddToTrail(TrailPtr* trail) const;
5816 5656
5817 // Return true if the pair <receiver, buddy> is contained in the trail. 5657 // Return true if the pair <receiver, buddy> is contained in the trail.
5818 // Otherwise, if the trail is null, allocate a trail, add the pair <receiver, 5658 // Otherwise, if the trail is null, allocate a trail, add the pair <receiver,
5819 // buddy> to the trail and return false. 5659 // buddy> to the trail and return false.
5820 // The receiver may be added several times, each time with a different buddy. 5660 // The receiver may be added several times, each time with a different buddy.
5821 bool TestAndAddBuddyToTrail(TrailPtr* trail, const AbstractType& buddy) const; 5661 bool TestAndAddBuddyToTrail(TrailPtr* trail, const AbstractType& buddy) const;
5822 5662
5823 // The name of this type, including the names of its type arguments, if any. 5663 // The name of this type, including the names of its type arguments, if any.
5824 virtual RawString* Name() const { 5664 virtual RawString* Name() const { return BuildName(kInternalName); }
5825 return BuildName(kInternalName);
5826 }
5827 5665
5828 // The name of this type, including the names of its type arguments, if any. 5666 // The name of this type, including the names of its type arguments, if any.
5829 // Names of internal classes are mapped to their public interfaces. 5667 // Names of internal classes are mapped to their public interfaces.
5830 virtual RawString* UserVisibleName() const { 5668 virtual RawString* UserVisibleName() const {
5831 return BuildName(kUserVisibleName); 5669 return BuildName(kUserVisibleName);
5832 } 5670 }
5833 5671
5834 // Returns a formatted list of occuring types with their URI. 5672 // Returns a formatted list of occuring types with their URI.
5835 virtual RawString* EnumerateURIs() const; 5673 virtual RawString* EnumerateURIs() const;
5836 5674
5837 virtual intptr_t Hash() const; 5675 virtual intptr_t Hash() const;
5838 5676
5839 // The name of this type's class, i.e. without the type argument names of this 5677 // The name of this type's class, i.e. without the type argument names of this
5840 // type. 5678 // type.
5841 RawString* ClassName() const; 5679 RawString* ClassName() const;
5842 5680
5843 // Check if this type represents the 'dynamic' type or if it is malformed, 5681 // Check if this type represents the 'dynamic' type or if it is malformed,
5844 // since a malformed type is mapped to 'dynamic'. 5682 // since a malformed type is mapped to 'dynamic'.
5845 // Call IsMalformed() first, if distinction is required. 5683 // Call IsMalformed() first, if distinction is required.
5846 bool IsDynamicType() const; 5684 bool IsDynamicType() const;
5847 5685
5848 // Check if this type represents the 'void' type. 5686 // Check if this type represents the 'void' type.
5849 bool IsVoidType() const; 5687 bool IsVoidType() const;
5850 5688
5851 // Check if this type represents the 'Null' type. 5689 // Check if this type represents the 'Null' type.
5852 bool IsNullType() const; 5690 bool IsNullType() const;
5853 5691
5854 bool IsObjectType() const { 5692 bool IsObjectType() const {
5855 return !IsFunctionType() && 5693 return !IsFunctionType() && HasResolvedTypeClass() &&
5856 HasResolvedTypeClass() && 5694 Class::Handle(type_class()).IsObjectClass();
5857 Class::Handle(type_class()).IsObjectClass();
5858 } 5695 }
5859 5696
5860 // Check if this type represents the 'bool' type. 5697 // Check if this type represents the 'bool' type.
5861 bool IsBoolType() const; 5698 bool IsBoolType() const;
5862 5699
5863 // Check if this type represents the 'int' type. 5700 // Check if this type represents the 'int' type.
5864 bool IsIntType() const; 5701 bool IsIntType() const;
5865 5702
5866 // Check if this type represents the 'double' type. 5703 // Check if this type represents the 'double' type.
5867 bool IsDoubleType() const; 5704 bool IsDoubleType() const;
(...skipping 28 matching lines...) Expand all
5896 TrailPtr bound_trail, 5733 TrailPtr bound_trail,
5897 Heap::Space space) const { 5734 Heap::Space space) const {
5898 return TypeTest(kIsSubtypeOf, other, bound_error, bound_trail, space); 5735 return TypeTest(kIsSubtypeOf, other, bound_error, bound_trail, space);
5899 } 5736 }
5900 5737
5901 // Check the 'more specific' relationship. 5738 // Check the 'more specific' relationship.
5902 bool IsMoreSpecificThan(const AbstractType& other, 5739 bool IsMoreSpecificThan(const AbstractType& other,
5903 Error* bound_error, 5740 Error* bound_error,
5904 TrailPtr bound_trail, 5741 TrailPtr bound_trail,
5905 Heap::Space space) const { 5742 Heap::Space space) const {
5906 return TypeTest(kIsMoreSpecificThan, other, 5743 return TypeTest(kIsMoreSpecificThan, other, bound_error, bound_trail,
5907 bound_error, bound_trail, space); 5744 space);
5908 } 5745 }
5909 5746
5910 private: 5747 private:
5911 // Check the subtype or 'more specific' relationship. 5748 // Check the subtype or 'more specific' relationship.
5912 bool TypeTest(TypeTestKind test_kind, 5749 bool TypeTest(TypeTestKind test_kind,
5913 const AbstractType& other, 5750 const AbstractType& other,
5914 Error* bound_error, 5751 Error* bound_error,
5915 TrailPtr bound_trail, 5752 TrailPtr bound_trail,
5916 Heap::Space space) const; 5753 Heap::Space space) const;
5917 5754
(...skipping 15 matching lines...) Expand all
5933 // 5770 //
5934 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, as 5771 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, as
5935 // opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does not 5772 // opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does not
5936 // relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'. 5773 // relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'.
5937 class Type : public AbstractType { 5774 class Type : public AbstractType {
5938 public: 5775 public:
5939 static intptr_t type_class_id_offset() { 5776 static intptr_t type_class_id_offset() {
5940 return OFFSET_OF(RawType, type_class_id_); 5777 return OFFSET_OF(RawType, type_class_id_);
5941 } 5778 }
5942 virtual bool IsFinalized() const { 5779 virtual bool IsFinalized() const {
5943 return 5780 return (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) ||
5944 (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) || 5781 (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated);
5945 (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated);
5946 } 5782 }
5947 virtual void SetIsFinalized() const; 5783 virtual void SetIsFinalized() const;
5948 void ResetIsFinalized() const; // Ignore current state and set again. 5784 void ResetIsFinalized() const; // Ignore current state and set again.
5949 virtual bool IsBeingFinalized() const { 5785 virtual bool IsBeingFinalized() const {
5950 return raw_ptr()->type_state_ == RawType::kBeingFinalized; 5786 return raw_ptr()->type_state_ == RawType::kBeingFinalized;
5951 } 5787 }
5952 virtual void SetIsBeingFinalized() const; 5788 virtual void SetIsBeingFinalized() const;
5953 virtual bool IsMalformed() const; 5789 virtual bool IsMalformed() const;
5954 virtual bool IsMalbounded() const; 5790 virtual bool IsMalbounded() const;
5955 virtual bool IsMalformedOrMalbounded() const; 5791 virtual bool IsMalformedOrMalbounded() const;
(...skipping 21 matching lines...) Expand all
5977 virtual bool IsFunctionType() const { 5813 virtual bool IsFunctionType() const {
5978 return signature() != Function::null(); 5814 return signature() != Function::null();
5979 } 5815 }
5980 virtual RawAbstractType* InstantiateFrom( 5816 virtual RawAbstractType* InstantiateFrom(
5981 const TypeArguments& instantiator_type_arguments, 5817 const TypeArguments& instantiator_type_arguments,
5982 Error* bound_error, 5818 Error* bound_error,
5983 TrailPtr instantiation_trail, 5819 TrailPtr instantiation_trail,
5984 TrailPtr bound_trail, 5820 TrailPtr bound_trail,
5985 Heap::Space space) const; 5821 Heap::Space space) const;
5986 virtual RawAbstractType* CloneUnfinalized() const; 5822 virtual RawAbstractType* CloneUnfinalized() const;
5987 virtual RawAbstractType* CloneUninstantiated( 5823 virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
5988 const Class& new_owner, 5824 TrailPtr trail = NULL) const;
5989 TrailPtr trail = NULL) const;
5990 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; 5825 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
5991 #if defined(DEBUG) 5826 #if defined(DEBUG)
5992 // Check if type is canonical. 5827 // Check if type is canonical.
5993 virtual bool CheckIsCanonical(Thread* thread) const; 5828 virtual bool CheckIsCanonical(Thread* thread) const;
5994 #endif // DEBUG 5829 #endif // DEBUG
5995 virtual RawString* EnumerateURIs() const; 5830 virtual RawString* EnumerateURIs() const;
5996 5831
5997 virtual intptr_t Hash() const; 5832 virtual intptr_t Hash() const;
5998 5833
5999 static intptr_t InstanceSize() { 5834 static intptr_t InstanceSize() {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
6100 virtual RawClass* type_class() const { 5935 virtual RawClass* type_class() const {
6101 return AbstractType::Handle(type()).type_class(); 5936 return AbstractType::Handle(type()).type_class();
6102 } 5937 }
6103 virtual RawTypeArguments* arguments() const { 5938 virtual RawTypeArguments* arguments() const {
6104 return AbstractType::Handle(type()).arguments(); 5939 return AbstractType::Handle(type()).arguments();
6105 } 5940 }
6106 virtual TokenPosition token_pos() const { 5941 virtual TokenPosition token_pos() const {
6107 return AbstractType::Handle(type()).token_pos(); 5942 return AbstractType::Handle(type()).token_pos();
6108 } 5943 }
6109 virtual bool IsInstantiated(TrailPtr trail = NULL) const; 5944 virtual bool IsInstantiated(TrailPtr trail = NULL) const;
6110 virtual bool IsEquivalent(const Instance& other, 5945 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
6111 TrailPtr trail = NULL) const;
6112 virtual bool IsRecursive() const { return true; } 5946 virtual bool IsRecursive() const { return true; }
6113 virtual RawTypeRef* InstantiateFrom( 5947 virtual RawTypeRef* InstantiateFrom(
6114 const TypeArguments& instantiator_type_arguments, 5948 const TypeArguments& instantiator_type_arguments,
6115 Error* bound_error, 5949 Error* bound_error,
6116 TrailPtr instantiation_trail, 5950 TrailPtr instantiation_trail,
6117 TrailPtr bound_trail, 5951 TrailPtr bound_trail,
6118 Heap::Space space) const; 5952 Heap::Space space) const;
6119 virtual RawTypeRef* CloneUninstantiated( 5953 virtual RawTypeRef* CloneUninstantiated(const Class& new_owner,
6120 const Class& new_owner, 5954 TrailPtr trail = NULL) const;
6121 TrailPtr trail = NULL) const;
6122 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; 5955 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
6123 #if defined(DEBUG) 5956 #if defined(DEBUG)
6124 // Check if typeref is canonical. 5957 // Check if typeref is canonical.
6125 virtual bool CheckIsCanonical(Thread* thread) const; 5958 virtual bool CheckIsCanonical(Thread* thread) const;
6126 #endif // DEBUG 5959 #endif // DEBUG
6127 virtual RawString* EnumerateURIs() const; 5960 virtual RawString* EnumerateURIs() const;
6128 5961
6129 virtual intptr_t Hash() const; 5962 virtual intptr_t Hash() const;
6130 5963
6131 static intptr_t InstanceSize() { 5964 static intptr_t InstanceSize() {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
6185 // Returns true if bounded_type is below upper_bound, otherwise return false 6018 // Returns true if bounded_type is below upper_bound, otherwise return false
6186 // and set bound_error if both bounded_type and upper_bound are instantiated. 6019 // and set bound_error if both bounded_type and upper_bound are instantiated.
6187 // If one or both are not instantiated, returning false only means that the 6020 // If one or both are not instantiated, returning false only means that the
6188 // bound cannot be checked yet and this is not an error. 6021 // bound cannot be checked yet and this is not an error.
6189 bool CheckBound(const AbstractType& bounded_type, 6022 bool CheckBound(const AbstractType& bounded_type,
6190 const AbstractType& upper_bound, 6023 const AbstractType& upper_bound,
6191 Error* bound_error, 6024 Error* bound_error,
6192 TrailPtr bound_trail, 6025 TrailPtr bound_trail,
6193 Heap::Space space) const; 6026 Heap::Space space) const;
6194 virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; } 6027 virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
6195 virtual bool IsInstantiated(TrailPtr trail = NULL) const { 6028 virtual bool IsInstantiated(TrailPtr trail = NULL) const { return false; }
6196 return false;
6197 }
6198 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; 6029 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
6199 virtual bool IsRecursive() const { return false; } 6030 virtual bool IsRecursive() const { return false; }
6200 virtual RawAbstractType* InstantiateFrom( 6031 virtual RawAbstractType* InstantiateFrom(
6201 const TypeArguments& instantiator_type_arguments, 6032 const TypeArguments& instantiator_type_arguments,
6202 Error* bound_error, 6033 Error* bound_error,
6203 TrailPtr instantiation_trail, 6034 TrailPtr instantiation_trail,
6204 TrailPtr bound_trail, 6035 TrailPtr bound_trail,
6205 Heap::Space space) const; 6036 Heap::Space space) const;
6206 virtual RawAbstractType* CloneUnfinalized() const; 6037 virtual RawAbstractType* CloneUnfinalized() const;
6207 virtual RawAbstractType* CloneUninstantiated( 6038 virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
6208 const Class& new_owner, TrailPtr trail = NULL) const; 6039 TrailPtr trail = NULL) const;
6209 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const { 6040 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const {
6210 return raw(); 6041 return raw();
6211 } 6042 }
6212 #if defined(DEBUG) 6043 #if defined(DEBUG)
6213 // Check if type parameter is canonical. 6044 // Check if type parameter is canonical.
6214 virtual bool CheckIsCanonical(Thread* thread) const { 6045 virtual bool CheckIsCanonical(Thread* thread) const { return true; }
6215 return true;
6216 }
6217 #endif // DEBUG 6046 #endif // DEBUG
6218 virtual RawString* EnumerateURIs() const; 6047 virtual RawString* EnumerateURIs() const;
6219 6048
6220 virtual intptr_t Hash() const; 6049 virtual intptr_t Hash() const;
6221 6050
6222 static intptr_t InstanceSize() { 6051 static intptr_t InstanceSize() {
6223 return RoundedAllocationSize(sizeof(RawTypeParameter)); 6052 return RoundedAllocationSize(sizeof(RawTypeParameter));
6224 } 6053 }
6225 6054
6226 // Only one of parameterized_class and parameterized_function is non-null. 6055 // Only one of parameterized_class and parameterized_function is non-null.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
6297 } 6126 }
6298 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; 6127 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
6299 virtual bool IsRecursive() const; 6128 virtual bool IsRecursive() const;
6300 virtual RawAbstractType* InstantiateFrom( 6129 virtual RawAbstractType* InstantiateFrom(
6301 const TypeArguments& instantiator_type_arguments, 6130 const TypeArguments& instantiator_type_arguments,
6302 Error* bound_error, 6131 Error* bound_error,
6303 TrailPtr instantiation_trail, 6132 TrailPtr instantiation_trail,
6304 TrailPtr bound_trail, 6133 TrailPtr bound_trail,
6305 Heap::Space space) const; 6134 Heap::Space space) const;
6306 virtual RawAbstractType* CloneUnfinalized() const; 6135 virtual RawAbstractType* CloneUnfinalized() const;
6307 virtual RawAbstractType* CloneUninstantiated( 6136 virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
6308 const Class& new_owner, TrailPtr trail = NULL) const; 6137 TrailPtr trail = NULL) const;
6309 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const { 6138 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const {
6310 return raw(); 6139 return raw();
6311 } 6140 }
6312 #if defined(DEBUG) 6141 #if defined(DEBUG)
6313 // Check if bounded type is canonical. 6142 // Check if bounded type is canonical.
6314 virtual bool CheckIsCanonical(Thread* thread) const { 6143 virtual bool CheckIsCanonical(Thread* thread) const { return true; }
6315 return true;
6316 }
6317 #endif // DEBUG 6144 #endif // DEBUG
6318 virtual RawString* EnumerateURIs() const; 6145 virtual RawString* EnumerateURIs() const;
6319 6146
6320 virtual intptr_t Hash() const; 6147 virtual intptr_t Hash() const;
6321 6148
6322 static intptr_t InstanceSize() { 6149 static intptr_t InstanceSize() {
6323 return RoundedAllocationSize(sizeof(RawBoundedType)); 6150 return RoundedAllocationSize(sizeof(RawBoundedType));
6324 } 6151 }
6325 6152
6326 static RawBoundedType* New(const AbstractType& type, 6153 static RawBoundedType* New(const AbstractType& type,
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
6438 } 6265 }
6439 virtual bool Equals(const Instance& other) const; 6266 virtual bool Equals(const Instance& other) const;
6440 6267
6441 virtual RawObject* HashCode() const { return raw(); } 6268 virtual RawObject* HashCode() const { return raw(); }
6442 6269
6443 virtual bool IsZero() const; 6270 virtual bool IsZero() const;
6444 virtual bool IsNegative() const; 6271 virtual bool IsNegative() const;
6445 6272
6446 virtual double AsDoubleValue() const; 6273 virtual double AsDoubleValue() const;
6447 virtual int64_t AsInt64Value() const; 6274 virtual int64_t AsInt64Value() const;
6448 virtual int64_t AsTruncatedInt64Value() const { 6275 virtual int64_t AsTruncatedInt64Value() const { return AsInt64Value(); }
6449 return AsInt64Value();
6450 }
6451 virtual uint32_t AsTruncatedUint32Value() const; 6276 virtual uint32_t AsTruncatedUint32Value() const;
6452 6277
6453 virtual bool FitsIntoSmi() const; 6278 virtual bool FitsIntoSmi() const;
6454 6279
6455 // Returns 0, -1 or 1. 6280 // Returns 0, -1 or 1.
6456 virtual int CompareWith(const Integer& other) const; 6281 virtual int CompareWith(const Integer& other) const;
6457 6282
6458 // Return the most compact presentation of an integer. 6283 // Return the most compact presentation of an integer.
6459 RawInteger* AsValidInteger() const; 6284 RawInteger* AsValidInteger() const;
6460 6285
(...skipping 10 matching lines...) Expand all
6471 friend class Class; 6296 friend class Class;
6472 }; 6297 };
6473 6298
6474 6299
6475 class Smi : public Integer { 6300 class Smi : public Integer {
6476 public: 6301 public:
6477 static const intptr_t kBits = kSmiBits; 6302 static const intptr_t kBits = kSmiBits;
6478 static const intptr_t kMaxValue = kSmiMax; 6303 static const intptr_t kMaxValue = kSmiMax;
6479 static const intptr_t kMinValue = kSmiMin; 6304 static const intptr_t kMinValue = kSmiMin;
6480 6305
6481 intptr_t Value() const { 6306 intptr_t Value() const { return ValueFromRaw(raw_value()); }
6482 return ValueFromRaw(raw_value());
6483 }
6484 6307
6485 virtual bool Equals(const Instance& other) const; 6308 virtual bool Equals(const Instance& other) const;
6486 virtual bool IsZero() const { return Value() == 0; } 6309 virtual bool IsZero() const { return Value() == 0; }
6487 virtual bool IsNegative() const { return Value() < 0; } 6310 virtual bool IsNegative() const { return Value() < 0; }
6488 6311
6489 virtual double AsDoubleValue() const; 6312 virtual double AsDoubleValue() const;
6490 virtual int64_t AsInt64Value() const; 6313 virtual int64_t AsInt64Value() const;
6491 virtual uint32_t AsTruncatedUint32Value() const; 6314 virtual uint32_t AsTruncatedUint32Value() const;
6492 6315
6493 virtual bool FitsIntoSmi() const { return true; } 6316 virtual bool FitsIntoSmi() const { return true; }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
6560 6383
6561 6384
6562 class Mint : public Integer { 6385 class Mint : public Integer {
6563 public: 6386 public:
6564 static const intptr_t kBits = 63; // 64-th bit is sign. 6387 static const intptr_t kBits = 63; // 64-th bit is sign.
6565 static const int64_t kMaxValue = 6388 static const int64_t kMaxValue =
6566 static_cast<int64_t>(DART_2PART_UINT64_C(0x7FFFFFFF, FFFFFFFF)); 6389 static_cast<int64_t>(DART_2PART_UINT64_C(0x7FFFFFFF, FFFFFFFF));
6567 static const int64_t kMinValue = 6390 static const int64_t kMinValue =
6568 static_cast<int64_t>(DART_2PART_UINT64_C(0x80000000, 00000000)); 6391 static_cast<int64_t>(DART_2PART_UINT64_C(0x80000000, 00000000));
6569 6392
6570 int64_t value() const { 6393 int64_t value() const { return raw_ptr()->value_; }
6571 return raw_ptr()->value_;
6572 }
6573 static intptr_t value_offset() { return OFFSET_OF(RawMint, value_); } 6394 static intptr_t value_offset() { return OFFSET_OF(RawMint, value_); }
6574 6395
6575 virtual bool IsZero() const { 6396 virtual bool IsZero() const { return value() == 0; }
6576 return value() == 0; 6397 virtual bool IsNegative() const { return value() < 0; }
6577 }
6578 virtual bool IsNegative() const {
6579 return value() < 0;
6580 }
6581 6398
6582 virtual bool Equals(const Instance& other) const; 6399 virtual bool Equals(const Instance& other) const;
6583 6400
6584 virtual double AsDoubleValue() const; 6401 virtual double AsDoubleValue() const;
6585 virtual int64_t AsInt64Value() const; 6402 virtual int64_t AsInt64Value() const;
6586 virtual uint32_t AsTruncatedUint32Value() const; 6403 virtual uint32_t AsTruncatedUint32Value() const;
6587 6404
6588 virtual bool FitsIntoSmi() const; 6405 virtual bool FitsIntoSmi() const;
6589 6406
6590 virtual int CompareWith(const Integer& other) const; 6407 virtual int CompareWith(const Integer& other) const;
(...skipping 14 matching lines...) Expand all
6605 void set_value(int64_t value) const; 6422 void set_value(int64_t value) const;
6606 6423
6607 MINT_OBJECT_IMPLEMENTATION(Mint, Integer, Integer); 6424 MINT_OBJECT_IMPLEMENTATION(Mint, Integer, Integer);
6608 friend class Class; 6425 friend class Class;
6609 friend class Number; 6426 friend class Number;
6610 }; 6427 };
6611 6428
6612 6429
6613 class Bigint : public Integer { 6430 class Bigint : public Integer {
6614 public: 6431 public:
6615 virtual bool IsZero() const { return Used() == 0;} 6432 virtual bool IsZero() const { return Used() == 0; }
6616 virtual bool IsNegative() const { return Neg(); } 6433 virtual bool IsNegative() const { return Neg(); }
6617 virtual bool Equals(const Instance& other) const; 6434 virtual bool Equals(const Instance& other) const;
6618 6435
6619 virtual double AsDoubleValue() const; 6436 virtual double AsDoubleValue() const;
6620 virtual int64_t AsInt64Value() const; 6437 virtual int64_t AsInt64Value() const;
6621 virtual int64_t AsTruncatedInt64Value() const; 6438 virtual int64_t AsTruncatedInt64Value() const;
6622 virtual uint32_t AsTruncatedUint32Value() const; 6439 virtual uint32_t AsTruncatedUint32Value() const;
6623 6440
6624 virtual int CompareWith(const Integer& other) const; 6441 virtual int CompareWith(const Integer& other) const;
6625 6442
(...skipping 27 matching lines...) Expand all
6653 const char* ToDecCString(Zone* zone) const; 6470 const char* ToDecCString(Zone* zone) const;
6654 const char* ToHexCString(Zone* zone) const; 6471 const char* ToHexCString(Zone* zone) const;
6655 6472
6656 static const intptr_t kBitsPerDigit = 32; // Same as _Bigint._DIGIT_BITS 6473 static const intptr_t kBitsPerDigit = 32; // Same as _Bigint._DIGIT_BITS
6657 static const intptr_t kBytesPerDigit = 4; 6474 static const intptr_t kBytesPerDigit = 4;
6658 static const int64_t kDigitBase = 1LL << kBitsPerDigit; 6475 static const int64_t kDigitBase = 1LL << kBitsPerDigit;
6659 static const int64_t kDigitMask = kDigitBase - 1; 6476 static const int64_t kDigitMask = kDigitBase - 1;
6660 6477
6661 static RawBigint* New(Heap::Space space = Heap::kNew); // For snapshots. 6478 static RawBigint* New(Heap::Space space = Heap::kNew); // For snapshots.
6662 6479
6663 static RawBigint* New(bool neg, intptr_t used, const TypedData& digits, 6480 static RawBigint* New(bool neg,
6481 intptr_t used,
6482 const TypedData& digits,
6664 Heap::Space space = Heap::kNew); 6483 Heap::Space space = Heap::kNew);
6665 6484
6666 static RawBigint* NewFromInt64(int64_t value, 6485 static RawBigint* NewFromInt64(int64_t value, Heap::Space space = Heap::kNew);
6486
6487 static RawBigint* NewFromUint64(uint64_t value,
6667 Heap::Space space = Heap::kNew); 6488 Heap::Space space = Heap::kNew);
6668 6489
6669 static RawBigint* NewFromUint64(uint64_t value, 6490 static RawBigint* NewFromShiftedInt64(int64_t value,
6670 Heap::Space space = Heap::kNew); 6491 intptr_t shift,
6671 6492 Heap::Space space = Heap::kNew);
6672 static RawBigint* NewFromShiftedInt64(int64_t value, intptr_t shift,
6673 Heap::Space space = Heap::kNew);
6674 6493
6675 static RawBigint* NewFromCString(const char* str, 6494 static RawBigint* NewFromCString(const char* str,
6676 Heap::Space space = Heap::kNew); 6495 Heap::Space space = Heap::kNew);
6677 6496
6678 // Returns a canonical Bigint object allocated in the old gen space. 6497 // Returns a canonical Bigint object allocated in the old gen space.
6679 static RawBigint* NewCanonical(const String& str); 6498 static RawBigint* NewCanonical(const String& str);
6680 6499
6681 private: 6500 private:
6682 void SetNeg(bool value) const; 6501 void SetNeg(bool value) const;
6683 void SetUsed(intptr_t value) const; 6502 void SetUsed(intptr_t value) const;
6684 void set_digits(const TypedData& value) const; 6503 void set_digits(const TypedData& value) const;
6685 6504
6686 // Convenience helpers. 6505 // Convenience helpers.
6687 static RawTypedData* NewDigits(intptr_t length, 6506 static RawTypedData* NewDigits(intptr_t length,
6688 Heap::Space space = Heap::kNew); 6507 Heap::Space space = Heap::kNew);
6689 static uint32_t DigitAt(const TypedData& digits, intptr_t index); 6508 static uint32_t DigitAt(const TypedData& digits, intptr_t index);
6690 static void SetDigitAt(const TypedData& digits, 6509 static void SetDigitAt(const TypedData& digits,
6691 intptr_t index, 6510 intptr_t index,
6692 uint32_t value); 6511 uint32_t value);
6693 6512
6694 static RawTypedData* NewDigitsFromHexCString(const char* str, intptr_t* used, 6513 static RawTypedData* NewDigitsFromHexCString(const char* str,
6514 intptr_t* used,
6695 Heap::Space space = Heap::kNew); 6515 Heap::Space space = Heap::kNew);
6696 6516
6697 static RawTypedData* NewDigitsFromDecCString(const char* str, intptr_t* used, 6517 static RawTypedData* NewDigitsFromDecCString(const char* str,
6518 intptr_t* used,
6698 Heap::Space space = Heap::kNew); 6519 Heap::Space space = Heap::kNew);
6699 6520
6700 static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew); 6521 static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew);
6701 6522
6702 FINAL_HEAP_OBJECT_IMPLEMENTATION(Bigint, Integer); 6523 FINAL_HEAP_OBJECT_IMPLEMENTATION(Bigint, Integer);
6703 friend class Class; 6524 friend class Class;
6704 }; 6525 };
6705 6526
6706 6527
6707 // Class Double represents class Double in corelib_impl, which implements 6528 // Class Double represents class Double in corelib_impl, which implements
6708 // abstract class double in corelib. 6529 // abstract class double in corelib.
6709 class Double : public Number { 6530 class Double : public Number {
6710 public: 6531 public:
6711 double value() const { 6532 double value() const { return raw_ptr()->value_; }
6712 return raw_ptr()->value_;
6713 }
6714 6533
6715 bool BitwiseEqualsToDouble(double value) const; 6534 bool BitwiseEqualsToDouble(double value) const;
6716 virtual bool OperatorEquals(const Instance& other) const; 6535 virtual bool OperatorEquals(const Instance& other) const;
6717 virtual bool CanonicalizeEquals(const Instance& other) const; 6536 virtual bool CanonicalizeEquals(const Instance& other) const;
6718 virtual uword ComputeCanonicalTableHash() const { 6537 virtual uword ComputeCanonicalTableHash() const {
6719 UNREACHABLE(); 6538 UNREACHABLE();
6720 return 0; 6539 return 0;
6721 } 6540 }
6722 6541
6723 static RawDouble* New(double d, Heap::Space space = Heap::kNew); 6542 static RawDouble* New(double d, Heap::Space space = Heap::kNew);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
6761 // All strings share the same maximum element count to keep things 6580 // All strings share the same maximum element count to keep things
6762 // simple. We choose a value that will prevent integer overflow for 6581 // simple. We choose a value that will prevent integer overflow for
6763 // 2 byte strings, since it is the worst case. 6582 // 2 byte strings, since it is the worst case.
6764 static const intptr_t kSizeofRawString = 6583 static const intptr_t kSizeofRawString =
6765 sizeof(RawInstance) + (2 * kWordSize); 6584 sizeof(RawInstance) + (2 * kWordSize);
6766 static const intptr_t kMaxElements = kSmiMax / kTwoByteChar; 6585 static const intptr_t kMaxElements = kSmiMax / kTwoByteChar;
6767 6586
6768 class CodePointIterator : public ValueObject { 6587 class CodePointIterator : public ValueObject {
6769 public: 6588 public:
6770 explicit CodePointIterator(const String& str) 6589 explicit CodePointIterator(const String& str)
6771 : str_(str), 6590 : str_(str), ch_(0), index_(-1), end_(str.Length()) {
6772 ch_(0),
6773 index_(-1),
6774 end_(str.Length()) {
6775 ASSERT(!str_.IsNull()); 6591 ASSERT(!str_.IsNull());
6776 } 6592 }
6777 6593
6778 CodePointIterator(const String& str, intptr_t start, intptr_t length) 6594 CodePointIterator(const String& str, intptr_t start, intptr_t length)
6779 : str_(str), 6595 : str_(str), ch_(0), index_(start - 1), end_(start + length) {
6780 ch_(0),
6781 index_(start - 1),
6782 end_(start + length) {
6783 ASSERT(start >= 0); 6596 ASSERT(start >= 0);
6784 ASSERT(end_ <= str.Length()); 6597 ASSERT(end_ <= str.Length());
6785 } 6598 }
6786 6599
6787 int32_t Current() const { 6600 int32_t Current() const {
6788 ASSERT(index_ >= 0); 6601 ASSERT(index_ >= 0);
6789 ASSERT(index_ < end_); 6602 ASSERT(index_ < end_);
6790 return ch_; 6603 return ch_;
6791 } 6604 }
6792 6605
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
6838 uint16_t CharAt(intptr_t index) const; 6651 uint16_t CharAt(intptr_t index) const;
6839 6652
6840 Scanner::CharAtFunc CharAtFunc() const; 6653 Scanner::CharAtFunc CharAtFunc() const;
6841 6654
6842 intptr_t CharSize() const; 6655 intptr_t CharSize() const;
6843 6656
6844 inline bool Equals(const String& str) const; 6657 inline bool Equals(const String& str) const;
6845 6658
6846 bool Equals(const String& str, 6659 bool Equals(const String& str,
6847 intptr_t begin_index, // begin index on 'str'. 6660 intptr_t begin_index, // begin index on 'str'.
6848 intptr_t len) const; // len on 'str'. 6661 intptr_t len) const; // len on 'str'.
6849 6662
6850 // Compares to a '\0' terminated array of UTF-8 encoded characters. 6663 // Compares to a '\0' terminated array of UTF-8 encoded characters.
6851 bool Equals(const char* cstr) const; 6664 bool Equals(const char* cstr) const;
6852 6665
6853 // Compares to an array of Latin-1 encoded characters. 6666 // Compares to an array of Latin-1 encoded characters.
6854 bool EqualsLatin1(const uint8_t* characters, intptr_t len) const { 6667 bool EqualsLatin1(const uint8_t* characters, intptr_t len) const {
6855 return Equals(characters, len); 6668 return Equals(characters, len);
6856 } 6669 }
6857 6670
6858 // Compares to an array of UTF-16 encoded characters. 6671 // Compares to an array of UTF-16 encoded characters.
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
7020 Heap::Space space = Heap::kNew); 6833 Heap::Space space = Heap::kNew);
7021 6834
7022 static RawString* ToUpperCase(const String& str, 6835 static RawString* ToUpperCase(const String& str,
7023 Heap::Space space = Heap::kNew); 6836 Heap::Space space = Heap::kNew);
7024 static RawString* ToLowerCase(const String& str, 6837 static RawString* ToLowerCase(const String& str,
7025 Heap::Space space = Heap::kNew); 6838 Heap::Space space = Heap::kNew);
7026 6839
7027 static RawString* ScrubName(const String& name); 6840 static RawString* ScrubName(const String& name);
7028 static RawString* ScrubNameRetainPrivate(const String& name); 6841 static RawString* ScrubNameRetainPrivate(const String& name);
7029 6842
7030 static bool EqualsIgnoringPrivateKey(const String& str1, 6843 static bool EqualsIgnoringPrivateKey(const String& str1, const String& str2);
7031 const String& str2);
7032 6844
7033 static RawString* NewFormatted(const char* format, ...) 6845 static RawString* NewFormatted(const char* format, ...)
7034 PRINTF_ATTRIBUTE(1, 2); 6846 PRINTF_ATTRIBUTE(1, 2);
7035 static RawString* NewFormatted(Heap::Space space, const char* format, ...) 6847 static RawString* NewFormatted(Heap::Space space, const char* format, ...)
7036 PRINTF_ATTRIBUTE(2, 3); 6848 PRINTF_ATTRIBUTE(2, 3);
7037 static RawString* NewFormattedV(const char* format, va_list args, 6849 static RawString* NewFormattedV(const char* format,
6850 va_list args,
7038 Heap::Space space = Heap::kNew); 6851 Heap::Space space = Heap::kNew);
7039 6852
7040 static bool ParseDouble(const String& str, 6853 static bool ParseDouble(const String& str,
7041 intptr_t start, 6854 intptr_t start,
7042 intptr_t end, 6855 intptr_t end,
7043 double* result); 6856 double* result);
7044 6857
7045 protected: 6858 protected:
7046 // These two operate on an array of Latin-1 encoded characters. 6859 // These two operate on an array of Latin-1 encoded characters.
7047 // They are protected to avoid mistaking Latin-1 for UTF-8, but used 6860 // They are protected to avoid mistaking Latin-1 for UTF-8, but used
7048 // by friendly templated code (e.g., Symbols). 6861 // by friendly templated code (e.g., Symbols).
7049 bool Equals(const uint8_t* characters, intptr_t len) const; 6862 bool Equals(const uint8_t* characters, intptr_t len) const;
7050 static intptr_t Hash(const uint8_t* characters, intptr_t len); 6863 static intptr_t Hash(const uint8_t* characters, intptr_t len);
7051 6864
7052 void SetLength(intptr_t value) const { 6865 void SetLength(intptr_t value) const {
7053 // This is only safe because we create a new Smi, which does not cause 6866 // This is only safe because we create a new Smi, which does not cause
7054 // heap allocation. 6867 // heap allocation.
7055 StoreSmi(&raw_ptr()->length_, Smi::New(value)); 6868 StoreSmi(&raw_ptr()->length_, Smi::New(value));
7056 } 6869 }
7057 6870
7058 void SetHash(intptr_t value) const { 6871 void SetHash(intptr_t value) const {
7059 // This is only safe because we create a new Smi, which does not cause 6872 // This is only safe because we create a new Smi, which does not cause
7060 // heap allocation. 6873 // heap allocation.
7061 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); 6874 StoreSmi(&raw_ptr()->hash_, Smi::New(value));
7062 } 6875 }
7063 6876
7064 template<typename HandleType, typename ElementType, typename CallbackType> 6877 template <typename HandleType, typename ElementType, typename CallbackType>
7065 static void ReadFromImpl(SnapshotReader* reader, 6878 static void ReadFromImpl(SnapshotReader* reader,
7066 String* str_obj, 6879 String* str_obj,
7067 intptr_t len, 6880 intptr_t len,
7068 intptr_t tags, 6881 intptr_t tags,
7069 CallbackType new_symbol, 6882 CallbackType new_symbol,
7070 Snapshot::Kind kind); 6883 Snapshot::Kind kind);
7071 6884
7072 FINAL_HEAP_OBJECT_IMPLEMENTATION(String, Instance); 6885 FINAL_HEAP_OBJECT_IMPLEMENTATION(String, Instance);
7073 6886
7074 friend class Class; 6887 friend class Class;
7075 friend class Symbols; 6888 friend class Symbols;
7076 friend class StringSlice; // SetHash 6889 friend class StringSlice; // SetHash
7077 template<typename CharType> friend class CharArray; // SetHash 6890 template <typename CharType>
6891 friend class CharArray; // SetHash
7078 friend class ConcatString; // SetHash 6892 friend class ConcatString; // SetHash
7079 friend class OneByteString; 6893 friend class OneByteString;
7080 friend class TwoByteString; 6894 friend class TwoByteString;
7081 friend class ExternalOneByteString; 6895 friend class ExternalOneByteString;
7082 friend class ExternalTwoByteString; 6896 friend class ExternalTwoByteString;
7083 // So that SkippedCodeFunctions can print a debug string from a NoHandleScope. 6897 // So that SkippedCodeFunctions can print a debug string from a NoHandleScope.
7084 friend class SkippedCodeFunctions; 6898 friend class SkippedCodeFunctions;
7085 friend class RawOneByteString; 6899 friend class RawOneByteString;
7086 friend class RODataSerializationCluster; // SetHash 6900 friend class RODataSerializationCluster; // SetHash
7087 }; 6901 };
(...skipping 22 matching lines...) Expand all
7110 6924
7111 static intptr_t InstanceSize() { 6925 static intptr_t InstanceSize() {
7112 ASSERT(sizeof(RawOneByteString) == 6926 ASSERT(sizeof(RawOneByteString) ==
7113 OFFSET_OF_RETURNED_VALUE(RawOneByteString, data)); 6927 OFFSET_OF_RETURNED_VALUE(RawOneByteString, data));
7114 return 0; 6928 return 0;
7115 } 6929 }
7116 6930
7117 static intptr_t InstanceSize(intptr_t len) { 6931 static intptr_t InstanceSize(intptr_t len) {
7118 ASSERT(sizeof(RawOneByteString) == String::kSizeofRawString); 6932 ASSERT(sizeof(RawOneByteString) == String::kSizeofRawString);
7119 ASSERT(0 <= len && len <= kMaxElements); 6933 ASSERT(0 <= len && len <= kMaxElements);
7120 return String::RoundedAllocationSize( 6934 return String::RoundedAllocationSize(sizeof(RawOneByteString) +
7121 sizeof(RawOneByteString) + (len * kBytesPerElement)); 6935 (len * kBytesPerElement));
7122 } 6936 }
7123 6937
7124 static RawOneByteString* New(intptr_t len, 6938 static RawOneByteString* New(intptr_t len, Heap::Space space);
7125 Heap::Space space);
7126 static RawOneByteString* New(const char* c_string, 6939 static RawOneByteString* New(const char* c_string,
7127 Heap::Space space = Heap::kNew) { 6940 Heap::Space space = Heap::kNew) {
7128 return New(reinterpret_cast<const uint8_t*>(c_string), 6941 return New(reinterpret_cast<const uint8_t*>(c_string), strlen(c_string),
7129 strlen(c_string),
7130 space); 6942 space);
7131 } 6943 }
7132 static RawOneByteString* New(const uint8_t* characters, 6944 static RawOneByteString* New(const uint8_t* characters,
7133 intptr_t len, 6945 intptr_t len,
7134 Heap::Space space); 6946 Heap::Space space);
7135 static RawOneByteString* New(const uint16_t* characters, 6947 static RawOneByteString* New(const uint16_t* characters,
7136 intptr_t len, 6948 intptr_t len,
7137 Heap::Space space); 6949 Heap::Space space);
7138 static RawOneByteString* New(const int32_t* characters, 6950 static RawOneByteString* New(const int32_t* characters,
7139 intptr_t len, 6951 intptr_t len,
7140 Heap::Space space); 6952 Heap::Space space);
7141 static RawOneByteString* New(const String& str, 6953 static RawOneByteString* New(const String& str, Heap::Space space);
7142 Heap::Space space);
7143 // 'other' must be OneByteString. 6954 // 'other' must be OneByteString.
7144 static RawOneByteString* New(const String& other_one_byte_string, 6955 static RawOneByteString* New(const String& other_one_byte_string,
7145 intptr_t other_start_index, 6956 intptr_t other_start_index,
7146 intptr_t other_len, 6957 intptr_t other_len,
7147 Heap::Space space); 6958 Heap::Space space);
7148 6959
7149 static RawOneByteString* New(const TypedData& other_typed_data, 6960 static RawOneByteString* New(const TypedData& other_typed_data,
7150 intptr_t other_start_index, 6961 intptr_t other_start_index,
7151 intptr_t other_len, 6962 intptr_t other_len,
7152 Heap::Space space = Heap::kNew); 6963 Heap::Space space = Heap::kNew);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
7246 7057
7247 static intptr_t InstanceSize() { 7058 static intptr_t InstanceSize() {
7248 ASSERT(sizeof(RawTwoByteString) == 7059 ASSERT(sizeof(RawTwoByteString) ==
7249 OFFSET_OF_RETURNED_VALUE(RawTwoByteString, data)); 7060 OFFSET_OF_RETURNED_VALUE(RawTwoByteString, data));
7250 return 0; 7061 return 0;
7251 } 7062 }
7252 7063
7253 static intptr_t InstanceSize(intptr_t len) { 7064 static intptr_t InstanceSize(intptr_t len) {
7254 ASSERT(sizeof(RawTwoByteString) == String::kSizeofRawString); 7065 ASSERT(sizeof(RawTwoByteString) == String::kSizeofRawString);
7255 ASSERT(0 <= len && len <= kMaxElements); 7066 ASSERT(0 <= len && len <= kMaxElements);
7256 return String::RoundedAllocationSize( 7067 return String::RoundedAllocationSize(sizeof(RawTwoByteString) +
7257 sizeof(RawTwoByteString) + (len * kBytesPerElement)); 7068 (len * kBytesPerElement));
7258 } 7069 }
7259 7070
7260 static RawTwoByteString* New(intptr_t len, 7071 static RawTwoByteString* New(intptr_t len, Heap::Space space);
7261 Heap::Space space);
7262 static RawTwoByteString* New(const uint16_t* characters, 7072 static RawTwoByteString* New(const uint16_t* characters,
7263 intptr_t len, 7073 intptr_t len,
7264 Heap::Space space); 7074 Heap::Space space);
7265 static RawTwoByteString* New(intptr_t utf16_len, 7075 static RawTwoByteString* New(intptr_t utf16_len,
7266 const int32_t* characters, 7076 const int32_t* characters,
7267 intptr_t len, 7077 intptr_t len,
7268 Heap::Space space); 7078 Heap::Space space);
7269 static RawTwoByteString* New(const String& str, 7079 static RawTwoByteString* New(const String& str, Heap::Space space);
7270 Heap::Space space);
7271 7080
7272 static RawTwoByteString* New(const TypedData& other_typed_data, 7081 static RawTwoByteString* New(const TypedData& other_typed_data,
7273 intptr_t other_start_index, 7082 intptr_t other_start_index,
7274 intptr_t other_len, 7083 intptr_t other_len,
7275 Heap::Space space = Heap::kNew); 7084 Heap::Space space = Heap::kNew);
7276 7085
7277 static RawTwoByteString* New(const ExternalTypedData& other_typed_data, 7086 static RawTwoByteString* New(const ExternalTypedData& other_typed_data,
7278 intptr_t other_start_index, 7087 intptr_t other_start_index,
7279 intptr_t other_len, 7088 intptr_t other_len,
7280 Heap::Space space = Heap::kNew); 7089 Heap::Space space = Heap::kNew);
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
7496 friend class Class; 7305 friend class Class;
7497 friend class String; 7306 friend class String;
7498 friend class SnapshotReader; 7307 friend class SnapshotReader;
7499 friend class Symbols; 7308 friend class Symbols;
7500 }; 7309 };
7501 7310
7502 7311
7503 // Class Bool implements Dart core class bool. 7312 // Class Bool implements Dart core class bool.
7504 class Bool : public Instance { 7313 class Bool : public Instance {
7505 public: 7314 public:
7506 bool value() const { 7315 bool value() const { return raw_ptr()->value_; }
7507 return raw_ptr()->value_;
7508 }
7509 7316
7510 static intptr_t InstanceSize() { 7317 static intptr_t InstanceSize() {
7511 return RoundedAllocationSize(sizeof(RawBool)); 7318 return RoundedAllocationSize(sizeof(RawBool));
7512 } 7319 }
7513 7320
7514 static const Bool& True() { 7321 static const Bool& True() { return Object::bool_true(); }
7515 return Object::bool_true();
7516 }
7517 7322
7518 static const Bool& False() { 7323 static const Bool& False() { return Object::bool_false(); }
7519 return Object::bool_false();
7520 }
7521 7324
7522 static const Bool& Get(bool value) { 7325 static const Bool& Get(bool value) {
7523 return value ? Bool::True() : Bool::False(); 7326 return value ? Bool::True() : Bool::False();
7524 } 7327 }
7525 7328
7526 private: 7329 private:
7527 void set_value(bool value) const { 7330 void set_value(bool value) const {
7528 StoreNonPointer(&raw_ptr()->value_, value); 7331 StoreNonPointer(&raw_ptr()->value_, value);
7529 } 7332 }
7530 7333
(...skipping 18 matching lines...) Expand all
7549 return Smi::Value(raw_ptr()->length_); 7352 return Smi::Value(raw_ptr()->length_);
7550 } 7353 }
7551 static intptr_t length_offset() { return OFFSET_OF(RawArray, length_); } 7354 static intptr_t length_offset() { return OFFSET_OF(RawArray, length_); }
7552 static intptr_t data_offset() { 7355 static intptr_t data_offset() {
7553 return OFFSET_OF_RETURNED_VALUE(RawArray, data); 7356 return OFFSET_OF_RETURNED_VALUE(RawArray, data);
7554 } 7357 }
7555 static intptr_t element_offset(intptr_t index) { 7358 static intptr_t element_offset(intptr_t index) {
7556 return OFFSET_OF_RETURNED_VALUE(RawArray, data) + kWordSize * index; 7359 return OFFSET_OF_RETURNED_VALUE(RawArray, data) + kWordSize * index;
7557 } 7360 }
7558 7361
7559 RawObject* At(intptr_t index) const { 7362 RawObject* At(intptr_t index) const { return *ObjectAddr(index); }
7560 return *ObjectAddr(index);
7561 }
7562 void SetAt(intptr_t index, const Object& value) const { 7363 void SetAt(intptr_t index, const Object& value) const {
7563 // TODO(iposva): Add storing NoSafepointScope. 7364 // TODO(iposva): Add storing NoSafepointScope.
7564 StorePointer(ObjectAddr(index), value.raw()); 7365 StorePointer(ObjectAddr(index), value.raw());
7565 } 7366 }
7566 7367
7567 bool IsImmutable() const { 7368 bool IsImmutable() const { return raw()->GetClassId() == kImmutableArrayCid; }
7568 return raw()->GetClassId() == kImmutableArrayCid;
7569 }
7570 7369
7571 virtual RawTypeArguments* GetTypeArguments() const { 7370 virtual RawTypeArguments* GetTypeArguments() const {
7572 return raw_ptr()->type_arguments_; 7371 return raw_ptr()->type_arguments_;
7573 } 7372 }
7574 virtual void SetTypeArguments(const TypeArguments& value) const { 7373 virtual void SetTypeArguments(const TypeArguments& value) const {
7575 // An Array is raw or takes one type argument. However, its type argument 7374 // An Array is raw or takes one type argument. However, its type argument
7576 // vector may be longer than 1 due to a type optimization reusing the type 7375 // vector may be longer than 1 due to a type optimization reusing the type
7577 // argument vector of the instantiator. 7376 // argument vector of the instantiator.
7578 ASSERT(value.IsNull() || 7377 ASSERT(value.IsNull() ||
7579 ((value.Length() >= 1) && 7378 ((value.Length() >= 1) &&
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
7667 static RawImmutableArray* New(intptr_t len, Heap::Space space = Heap::kNew); 7466 static RawImmutableArray* New(intptr_t len, Heap::Space space = Heap::kNew);
7668 7467
7669 static RawImmutableArray* ReadFrom(SnapshotReader* reader, 7468 static RawImmutableArray* ReadFrom(SnapshotReader* reader,
7670 intptr_t object_id, 7469 intptr_t object_id,
7671 intptr_t tags, 7470 intptr_t tags,
7672 Snapshot::Kind kind, 7471 Snapshot::Kind kind,
7673 bool as_reference); 7472 bool as_reference);
7674 7473
7675 static const ClassId kClassId = kImmutableArrayCid; 7474 static const ClassId kClassId = kImmutableArrayCid;
7676 7475
7677 static intptr_t InstanceSize() { 7476 static intptr_t InstanceSize() { return Array::InstanceSize(); }
7678 return Array::InstanceSize();
7679 }
7680 7477
7681 static intptr_t InstanceSize(intptr_t len) { 7478 static intptr_t InstanceSize(intptr_t len) {
7682 return Array::InstanceSize(len); 7479 return Array::InstanceSize(len);
7683 } 7480 }
7684 7481
7685 private: 7482 private:
7686 static intptr_t NextFieldOffset() { 7483 static intptr_t NextFieldOffset() {
7687 // Indicates this class cannot be extended by dart code. 7484 // Indicates this class cannot be extended by dart code.
7688 return -kWordSize; 7485 return -kWordSize;
7689 } 7486 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
7737 void Grow(intptr_t new_capacity, Heap::Space space = Heap::kNew) const; 7534 void Grow(intptr_t new_capacity, Heap::Space space = Heap::kNew) const;
7738 RawObject* RemoveLast() const; 7535 RawObject* RemoveLast() const;
7739 7536
7740 virtual RawTypeArguments* GetTypeArguments() const { 7537 virtual RawTypeArguments* GetTypeArguments() const {
7741 return raw_ptr()->type_arguments_; 7538 return raw_ptr()->type_arguments_;
7742 } 7539 }
7743 virtual void SetTypeArguments(const TypeArguments& value) const { 7540 virtual void SetTypeArguments(const TypeArguments& value) const {
7744 // A GrowableObjectArray is raw or takes one type argument. However, its 7541 // A GrowableObjectArray is raw or takes one type argument. However, its
7745 // type argument vector may be longer than 1 due to a type optimization 7542 // type argument vector may be longer than 1 due to a type optimization
7746 // reusing the type argument vector of the instantiator. 7543 // reusing the type argument vector of the instantiator.
7747 ASSERT(value.IsNull() || 7544 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated() &&
7748 ((value.Length() >= 1) && 7545 value.IsCanonical()));
7749 value.IsInstantiated() &&
7750 value.IsCanonical()));
7751 const Array& contents = Array::Handle(data()); 7546 const Array& contents = Array::Handle(data());
7752 contents.SetTypeArguments(value); 7547 contents.SetTypeArguments(value);
7753 StorePointer(&raw_ptr()->type_arguments_, value.raw()); 7548 StorePointer(&raw_ptr()->type_arguments_, value.raw());
7754 } 7549 }
7755 7550
7756 // We don't expect a growable object array to be canonicalized. 7551 // We don't expect a growable object array to be canonicalized.
7757 virtual bool CanonicalizeEquals(const Instance& other) const { 7552 virtual bool CanonicalizeEquals(const Instance& other) const {
7758 UNREACHABLE(); 7553 UNREACHABLE();
7759 return false; 7554 return false;
7760 } 7555 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
7803 static const int kDefaultInitialCapacity = 4; 7598 static const int kDefaultInitialCapacity = 4;
7804 7599
7805 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); 7600 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance);
7806 friend class Array; 7601 friend class Array;
7807 friend class Class; 7602 friend class Class;
7808 }; 7603 };
7809 7604
7810 7605
7811 class Float32x4 : public Instance { 7606 class Float32x4 : public Instance {
7812 public: 7607 public:
7813 static RawFloat32x4* New(float value0, float value1, float value2, 7608 static RawFloat32x4* New(float value0,
7814 float value3, Heap::Space space = Heap::kNew); 7609 float value1,
7610 float value2,
7611 float value3,
7612 Heap::Space space = Heap::kNew);
7815 static RawFloat32x4* New(simd128_value_t value, 7613 static RawFloat32x4* New(simd128_value_t value,
7816 Heap::Space space = Heap::kNew); 7614 Heap::Space space = Heap::kNew);
7817 7615
7818 float x() const; 7616 float x() const;
7819 float y() const; 7617 float y() const;
7820 float z() const; 7618 float z() const;
7821 float w() const; 7619 float w() const;
7822 7620
7823 void set_x(float x) const; 7621 void set_x(float x) const;
7824 void set_y(float y) const; 7622 void set_y(float y) const;
7825 void set_z(float z) const; 7623 void set_z(float z) const;
7826 void set_w(float w) const; 7624 void set_w(float w) const;
7827 7625
7828 simd128_value_t value() const; 7626 simd128_value_t value() const;
7829 void set_value(simd128_value_t value) const; 7627 void set_value(simd128_value_t value) const;
7830 7628
7831 static intptr_t InstanceSize() { 7629 static intptr_t InstanceSize() {
7832 return RoundedAllocationSize(sizeof(RawFloat32x4)); 7630 return RoundedAllocationSize(sizeof(RawFloat32x4));
7833 } 7631 }
7834 7632
7835 static intptr_t value_offset() { 7633 static intptr_t value_offset() { return OFFSET_OF(RawFloat32x4, value_); }
7836 return OFFSET_OF(RawFloat32x4, value_);
7837 }
7838 7634
7839 private: 7635 private:
7840 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance); 7636 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance);
7841 friend class Class; 7637 friend class Class;
7842 }; 7638 };
7843 7639
7844 7640
7845 class Int32x4 : public Instance { 7641 class Int32x4 : public Instance {
7846 public: 7642 public:
7847 static RawInt32x4* New(int32_t value0, int32_t value1, int32_t value2, 7643 static RawInt32x4* New(int32_t value0,
7848 int32_t value3, Heap::Space space = Heap::kNew); 7644 int32_t value1,
7849 static RawInt32x4* New(simd128_value_t value, 7645 int32_t value2,
7850 Heap::Space space = Heap::kNew); 7646 int32_t value3,
7647 Heap::Space space = Heap::kNew);
7648 static RawInt32x4* New(simd128_value_t value, Heap::Space space = Heap::kNew);
7851 7649
7852 int32_t x() const; 7650 int32_t x() const;
7853 int32_t y() const; 7651 int32_t y() const;
7854 int32_t z() const; 7652 int32_t z() const;
7855 int32_t w() const; 7653 int32_t w() const;
7856 7654
7857 void set_x(int32_t x) const; 7655 void set_x(int32_t x) const;
7858 void set_y(int32_t y) const; 7656 void set_y(int32_t y) const;
7859 void set_z(int32_t z) const; 7657 void set_z(int32_t z) const;
7860 void set_w(int32_t w) const; 7658 void set_w(int32_t w) const;
7861 7659
7862 simd128_value_t value() const; 7660 simd128_value_t value() const;
7863 void set_value(simd128_value_t value) const; 7661 void set_value(simd128_value_t value) const;
7864 7662
7865 static intptr_t InstanceSize() { 7663 static intptr_t InstanceSize() {
7866 return RoundedAllocationSize(sizeof(RawInt32x4)); 7664 return RoundedAllocationSize(sizeof(RawInt32x4));
7867 } 7665 }
7868 7666
7869 static intptr_t value_offset() { 7667 static intptr_t value_offset() { return OFFSET_OF(RawInt32x4, value_); }
7870 return OFFSET_OF(RawInt32x4, value_);
7871 }
7872 7668
7873 private: 7669 private:
7874 FINAL_HEAP_OBJECT_IMPLEMENTATION(Int32x4, Instance); 7670 FINAL_HEAP_OBJECT_IMPLEMENTATION(Int32x4, Instance);
7875 friend class Class; 7671 friend class Class;
7876 }; 7672 };
7877 7673
7878 7674
7879 class Float64x2 : public Instance { 7675 class Float64x2 : public Instance {
7880 public: 7676 public:
7881 static RawFloat64x2* New(double value0, double value1, 7677 static RawFloat64x2* New(double value0,
7678 double value1,
7882 Heap::Space space = Heap::kNew); 7679 Heap::Space space = Heap::kNew);
7883 static RawFloat64x2* New(simd128_value_t value, 7680 static RawFloat64x2* New(simd128_value_t value,
7884 Heap::Space space = Heap::kNew); 7681 Heap::Space space = Heap::kNew);
7885 7682
7886 double x() const; 7683 double x() const;
7887 double y() const; 7684 double y() const;
7888 7685
7889 void set_x(double x) const; 7686 void set_x(double x) const;
7890 void set_y(double y) const; 7687 void set_y(double y) const;
7891 7688
7892 simd128_value_t value() const; 7689 simd128_value_t value() const;
7893 void set_value(simd128_value_t value) const; 7690 void set_value(simd128_value_t value) const;
7894 7691
7895 static intptr_t InstanceSize() { 7692 static intptr_t InstanceSize() {
7896 return RoundedAllocationSize(sizeof(RawFloat64x2)); 7693 return RoundedAllocationSize(sizeof(RawFloat64x2));
7897 } 7694 }
7898 7695
7899 static intptr_t value_offset() { 7696 static intptr_t value_offset() { return OFFSET_OF(RawFloat64x2, value_); }
7900 return OFFSET_OF(RawFloat64x2, value_);
7901 }
7902 7697
7903 private: 7698 private:
7904 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float64x2, Instance); 7699 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float64x2, Instance);
7905 friend class Class; 7700 friend class Class;
7906 }; 7701 };
7907 7702
7908 7703
7909 class TypedData : public Instance { 7704 class TypedData : public Instance {
7910 public: 7705 public:
7911 // We use 30 bits for the hash code so hashes in a snapshot taken on a 7706 // We use 30 bits for the hash code so hashes in a snapshot taken on a
(...skipping 17 matching lines...) Expand all
7929 } 7724 }
7930 7725
7931 intptr_t LengthInBytes() const { 7726 intptr_t LengthInBytes() const {
7932 intptr_t cid = raw()->GetClassId(); 7727 intptr_t cid = raw()->GetClassId();
7933 return (ElementSizeInBytes(cid) * Length()); 7728 return (ElementSizeInBytes(cid) * Length());
7934 } 7729 }
7935 7730
7936 void* DataAddr(intptr_t byte_offset) const { 7731 void* DataAddr(intptr_t byte_offset) const {
7937 ASSERT((byte_offset == 0) || 7732 ASSERT((byte_offset == 0) ||
7938 ((byte_offset > 0) && (byte_offset < LengthInBytes()))); 7733 ((byte_offset > 0) && (byte_offset < LengthInBytes())));
7939 return reinterpret_cast<void*>( 7734 return reinterpret_cast<void*>(UnsafeMutableNonPointer(raw_ptr()->data()) +
7940 UnsafeMutableNonPointer(raw_ptr()->data()) + byte_offset); 7735 byte_offset);
7941 } 7736 }
7942 7737
7943 virtual bool CanonicalizeEquals(const Instance& other) const; 7738 virtual bool CanonicalizeEquals(const Instance& other) const;
7944 virtual uword ComputeCanonicalTableHash() const; 7739 virtual uword ComputeCanonicalTableHash() const;
7945 7740
7946 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64) 7741 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
7947 #define TYPED_GETTER_SETTER(name, type) \ 7742 #define TYPED_GETTER_SETTER(name, type) \
7948 type Get##name(intptr_t byte_offset) const { \ 7743 type Get##name(intptr_t byte_offset) const { \
7949 NoSafepointScope no_safepoint; \ 7744 NoSafepointScope no_safepoint; \
7950 return *reinterpret_cast<type*>(DataAddr(byte_offset)); \ 7745 return *reinterpret_cast<type*>(DataAddr(byte_offset)); \
(...skipping 25 matching lines...) Expand all
7976 TYPED_GETTER_SETTER(Int64, int64_t) 7771 TYPED_GETTER_SETTER(Int64, int64_t)
7977 TYPED_GETTER_SETTER(Uint64, uint64_t) 7772 TYPED_GETTER_SETTER(Uint64, uint64_t)
7978 TYPED_GETTER_SETTER(Float32, float) 7773 TYPED_GETTER_SETTER(Float32, float)
7979 TYPED_GETTER_SETTER(Float64, double) 7774 TYPED_GETTER_SETTER(Float64, double)
7980 TYPED_GETTER_SETTER(Float32x4, simd128_value_t) 7775 TYPED_GETTER_SETTER(Float32x4, simd128_value_t)
7981 TYPED_GETTER_SETTER(Int32x4, simd128_value_t) 7776 TYPED_GETTER_SETTER(Int32x4, simd128_value_t)
7982 TYPED_GETTER_SETTER(Float64x2, simd128_value_t) 7777 TYPED_GETTER_SETTER(Float64x2, simd128_value_t)
7983 7778
7984 #undef TYPED_GETTER_SETTER 7779 #undef TYPED_GETTER_SETTER
7985 7780
7986 static intptr_t length_offset() { 7781 static intptr_t length_offset() { return OFFSET_OF(RawTypedData, length_); }
7987 return OFFSET_OF(RawTypedData, length_);
7988 }
7989 7782
7990 static intptr_t data_offset() { 7783 static intptr_t data_offset() {
7991 return OFFSET_OF_RETURNED_VALUE(RawTypedData, data); 7784 return OFFSET_OF_RETURNED_VALUE(RawTypedData, data);
7992 } 7785 }
7993 7786
7994 static intptr_t InstanceSize() { 7787 static intptr_t InstanceSize() {
7995 ASSERT(sizeof(RawTypedData) == 7788 ASSERT(sizeof(RawTypedData) ==
7996 OFFSET_OF_RETURNED_VALUE(RawTypedData, data)); 7789 OFFSET_OF_RETURNED_VALUE(RawTypedData, data));
7997 return 0; 7790 return 0;
7998 } 7791 }
7999 7792
8000 static intptr_t InstanceSize(intptr_t lengthInBytes) { 7793 static intptr_t InstanceSize(intptr_t lengthInBytes) {
8001 ASSERT(0 <= lengthInBytes && lengthInBytes <= kSmiMax); 7794 ASSERT(0 <= lengthInBytes && lengthInBytes <= kSmiMax);
8002 return RoundedAllocationSize(sizeof(RawTypedData) + lengthInBytes); 7795 return RoundedAllocationSize(sizeof(RawTypedData) + lengthInBytes);
8003 } 7796 }
8004 7797
8005 static intptr_t ElementSizeInBytes(intptr_t class_id) { 7798 static intptr_t ElementSizeInBytes(intptr_t class_id) {
8006 ASSERT(RawObject::IsTypedDataClassId(class_id)); 7799 ASSERT(RawObject::IsTypedDataClassId(class_id));
8007 return element_size(ElementType(class_id)); 7800 return element_size(ElementType(class_id));
8008 } 7801 }
8009 7802
8010 static TypedDataElementType ElementType(intptr_t class_id) { 7803 static TypedDataElementType ElementType(intptr_t class_id) {
8011 ASSERT(RawObject::IsTypedDataClassId(class_id)); 7804 ASSERT(RawObject::IsTypedDataClassId(class_id));
8012 return static_cast<TypedDataElementType>( 7805 return static_cast<TypedDataElementType>(class_id - kTypedDataInt8ArrayCid);
8013 class_id - kTypedDataInt8ArrayCid);
8014 } 7806 }
8015 7807
8016 static intptr_t MaxElements(intptr_t class_id) { 7808 static intptr_t MaxElements(intptr_t class_id) {
8017 ASSERT(RawObject::IsTypedDataClassId(class_id)); 7809 ASSERT(RawObject::IsTypedDataClassId(class_id));
8018 return (kSmiMax / ElementSizeInBytes(class_id)); 7810 return (kSmiMax / ElementSizeInBytes(class_id));
8019 } 7811 }
8020 7812
8021 static RawTypedData* New(intptr_t class_id, 7813 static RawTypedData* New(intptr_t class_id,
8022 intptr_t len, 7814 intptr_t len,
8023 Heap::Space space = Heap::kNew); 7815 Heap::Space space = Heap::kNew);
8024 7816
8025 template <typename DstType, typename SrcType> 7817 template <typename DstType, typename SrcType>
8026 static void Copy(const DstType& dst, intptr_t dst_offset_in_bytes, 7818 static void Copy(const DstType& dst,
8027 const SrcType& src, intptr_t src_offset_in_bytes, 7819 intptr_t dst_offset_in_bytes,
7820 const SrcType& src,
7821 intptr_t src_offset_in_bytes,
8028 intptr_t length_in_bytes) { 7822 intptr_t length_in_bytes) {
8029 ASSERT(Utils::RangeCheck(src_offset_in_bytes, 7823 ASSERT(Utils::RangeCheck(src_offset_in_bytes, length_in_bytes,
8030 length_in_bytes,
8031 src.LengthInBytes())); 7824 src.LengthInBytes()));
8032 ASSERT(Utils::RangeCheck(dst_offset_in_bytes, 7825 ASSERT(Utils::RangeCheck(dst_offset_in_bytes, length_in_bytes,
8033 length_in_bytes,
8034 dst.LengthInBytes())); 7826 dst.LengthInBytes()));
8035 { 7827 {
8036 NoSafepointScope no_safepoint; 7828 NoSafepointScope no_safepoint;
8037 if (length_in_bytes > 0) { 7829 if (length_in_bytes > 0) {
8038 memmove(dst.DataAddr(dst_offset_in_bytes), 7830 memmove(dst.DataAddr(dst_offset_in_bytes),
8039 src.DataAddr(src_offset_in_bytes), 7831 src.DataAddr(src_offset_in_bytes), length_in_bytes);
8040 length_in_bytes);
8041 } 7832 }
8042 } 7833 }
8043 } 7834 }
8044 7835
8045 7836
8046 template <typename DstType, typename SrcType> 7837 template <typename DstType, typename SrcType>
8047 static void ClampedCopy(const DstType& dst, intptr_t dst_offset_in_bytes, 7838 static void ClampedCopy(const DstType& dst,
8048 const SrcType& src, intptr_t src_offset_in_bytes, 7839 intptr_t dst_offset_in_bytes,
7840 const SrcType& src,
7841 intptr_t src_offset_in_bytes,
8049 intptr_t length_in_bytes) { 7842 intptr_t length_in_bytes) {
8050 ASSERT(Utils::RangeCheck(src_offset_in_bytes, 7843 ASSERT(Utils::RangeCheck(src_offset_in_bytes, length_in_bytes,
8051 length_in_bytes,
8052 src.LengthInBytes())); 7844 src.LengthInBytes()));
8053 ASSERT(Utils::RangeCheck(dst_offset_in_bytes, 7845 ASSERT(Utils::RangeCheck(dst_offset_in_bytes, length_in_bytes,
8054 length_in_bytes,
8055 dst.LengthInBytes())); 7846 dst.LengthInBytes()));
8056 { 7847 {
8057 NoSafepointScope no_safepoint; 7848 NoSafepointScope no_safepoint;
8058 if (length_in_bytes > 0) { 7849 if (length_in_bytes > 0) {
8059 uint8_t* dst_data = 7850 uint8_t* dst_data =
8060 reinterpret_cast<uint8_t*>(dst.DataAddr(dst_offset_in_bytes)); 7851 reinterpret_cast<uint8_t*>(dst.DataAddr(dst_offset_in_bytes));
8061 int8_t* src_data = 7852 int8_t* src_data =
8062 reinterpret_cast<int8_t*>(src.DataAddr(src_offset_in_bytes)); 7853 reinterpret_cast<int8_t*>(src.DataAddr(src_offset_in_bytes));
8063 for (intptr_t ix = 0; ix < length_in_bytes; ix++) { 7854 for (intptr_t ix = 0; ix < length_in_bytes; ix++) {
8064 int8_t v = *src_data; 7855 int8_t v = *src_data;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
8170 return RoundedAllocationSize(sizeof(RawExternalTypedData)); 7961 return RoundedAllocationSize(sizeof(RawExternalTypedData));
8171 } 7962 }
8172 7963
8173 static intptr_t ElementSizeInBytes(intptr_t class_id) { 7964 static intptr_t ElementSizeInBytes(intptr_t class_id) {
8174 ASSERT(RawObject::IsExternalTypedDataClassId(class_id)); 7965 ASSERT(RawObject::IsExternalTypedDataClassId(class_id));
8175 return TypedData::element_size(ElementType(class_id)); 7966 return TypedData::element_size(ElementType(class_id));
8176 } 7967 }
8177 7968
8178 static TypedDataElementType ElementType(intptr_t class_id) { 7969 static TypedDataElementType ElementType(intptr_t class_id) {
8179 ASSERT(RawObject::IsExternalTypedDataClassId(class_id)); 7970 ASSERT(RawObject::IsExternalTypedDataClassId(class_id));
8180 return static_cast<TypedDataElementType>( 7971 return static_cast<TypedDataElementType>(class_id -
8181 class_id - kExternalTypedDataInt8ArrayCid); 7972 kExternalTypedDataInt8ArrayCid);
8182 } 7973 }
8183 7974
8184 static intptr_t MaxElements(intptr_t class_id) { 7975 static intptr_t MaxElements(intptr_t class_id) {
8185 ASSERT(RawObject::IsExternalTypedDataClassId(class_id)); 7976 ASSERT(RawObject::IsExternalTypedDataClassId(class_id));
8186 return (kSmiMax / ElementSizeInBytes(class_id)); 7977 return (kSmiMax / ElementSizeInBytes(class_id));
8187 } 7978 }
8188 7979
8189 static RawExternalTypedData* New(intptr_t class_id, 7980 static RawExternalTypedData* New(intptr_t class_id,
8190 uint8_t* data, 7981 uint8_t* data,
8191 intptr_t len, 7982 intptr_t len,
8192 Heap::Space space = Heap::kNew); 7983 Heap::Space space = Heap::kNew);
8193 7984
8194 static bool IsExternalTypedData(const Instance& obj) { 7985 static bool IsExternalTypedData(const Instance& obj) {
8195 ASSERT(!obj.IsNull()); 7986 ASSERT(!obj.IsNull());
8196 intptr_t cid = obj.raw()->GetClassId(); 7987 intptr_t cid = obj.raw()->GetClassId();
8197 return RawObject::IsExternalTypedDataClassId(cid); 7988 return RawObject::IsExternalTypedDataClassId(cid);
8198 } 7989 }
8199 7990
8200 protected: 7991 protected:
8201 void SetLength(intptr_t value) const { 7992 void SetLength(intptr_t value) const {
8202 StoreSmi(&raw_ptr()->length_, Smi::New(value)); 7993 StoreSmi(&raw_ptr()->length_, Smi::New(value));
8203 } 7994 }
8204 7995
8205 void SetData(uint8_t* data) const { 7996 void SetData(uint8_t* data) const {
8206 ASSERT(!Isolate::Current()->heap()->Contains( 7997 ASSERT(
8207 reinterpret_cast<uword>(data))); 7998 !Isolate::Current()->heap()->Contains(reinterpret_cast<uword>(data)));
8208 StoreNonPointer(&raw_ptr()->data_, data); 7999 StoreNonPointer(&raw_ptr()->data_, data);
8209 } 8000 }
8210 8001
8211 private: 8002 private:
8212 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData, Instance); 8003 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData, Instance);
8213 friend class Class; 8004 friend class Class;
8214 }; 8005 };
8215 8006
8216 8007
8217 class TypedDataView : public AllStatic { 8008 class TypedDataView : public AllStatic {
8218 public: 8009 public:
8219 static intptr_t ElementSizeInBytes(const Instance& view_obj) { 8010 static intptr_t ElementSizeInBytes(const Instance& view_obj) {
8220 ASSERT(!view_obj.IsNull()); 8011 ASSERT(!view_obj.IsNull());
8221 intptr_t cid = view_obj.raw()->GetClassId(); 8012 intptr_t cid = view_obj.raw()->GetClassId();
8222 return ElementSizeInBytes(cid); 8013 return ElementSizeInBytes(cid);
8223 } 8014 }
8224 8015
8225 static RawInstance* Data(const Instance& view_obj) { 8016 static RawInstance* Data(const Instance& view_obj) {
8226 ASSERT(!view_obj.IsNull()); 8017 ASSERT(!view_obj.IsNull());
8227 return *reinterpret_cast<RawInstance* const*>( 8018 return *reinterpret_cast<RawInstance* const*>(view_obj.raw_ptr() +
8228 view_obj.raw_ptr() + kDataOffset); 8019 kDataOffset);
8229 } 8020 }
8230 8021
8231 static RawSmi* OffsetInBytes(const Instance& view_obj) { 8022 static RawSmi* OffsetInBytes(const Instance& view_obj) {
8232 ASSERT(!view_obj.IsNull()); 8023 ASSERT(!view_obj.IsNull());
8233 return *reinterpret_cast<RawSmi* const*>( 8024 return *reinterpret_cast<RawSmi* const*>(view_obj.raw_ptr() +
8234 view_obj.raw_ptr() + kOffsetInBytesOffset); 8025 kOffsetInBytesOffset);
8235 } 8026 }
8236 8027
8237 static RawSmi* Length(const Instance& view_obj) { 8028 static RawSmi* Length(const Instance& view_obj) {
8238 ASSERT(!view_obj.IsNull()); 8029 ASSERT(!view_obj.IsNull());
8239 return *reinterpret_cast<RawSmi* const*>( 8030 return *reinterpret_cast<RawSmi* const*>(view_obj.raw_ptr() +
8240 view_obj.raw_ptr() + kLengthOffset); 8031 kLengthOffset);
8241 } 8032 }
8242 8033
8243 static bool IsExternalTypedDataView(const Instance& view_obj) { 8034 static bool IsExternalTypedDataView(const Instance& view_obj) {
8244 const Instance& data = Instance::Handle(Data(view_obj)); 8035 const Instance& data = Instance::Handle(Data(view_obj));
8245 intptr_t cid = data.raw()->GetClassId(); 8036 intptr_t cid = data.raw()->GetClassId();
8246 ASSERT(RawObject::IsTypedDataClassId(cid) || 8037 ASSERT(RawObject::IsTypedDataClassId(cid) ||
8247 RawObject::IsExternalTypedDataClassId(cid)); 8038 RawObject::IsExternalTypedDataClassId(cid));
8248 return RawObject::IsExternalTypedDataClassId(cid); 8039 return RawObject::IsExternalTypedDataClassId(cid);
8249 } 8040 }
8250 8041
8251 static intptr_t NumberOfFields() { 8042 static intptr_t NumberOfFields() { return kLengthOffset; }
8252 return kLengthOffset;
8253 }
8254 8043
8255 static intptr_t data_offset() { 8044 static intptr_t data_offset() { return kWordSize * kDataOffset; }
8256 return kWordSize * kDataOffset;
8257 }
8258 8045
8259 static intptr_t offset_in_bytes_offset() { 8046 static intptr_t offset_in_bytes_offset() {
8260 return kWordSize * kOffsetInBytesOffset; 8047 return kWordSize * kOffsetInBytesOffset;
8261 } 8048 }
8262 8049
8263 static intptr_t length_offset() { 8050 static intptr_t length_offset() { return kWordSize * kLengthOffset; }
8264 return kWordSize * kLengthOffset;
8265 }
8266 8051
8267 static intptr_t ElementSizeInBytes(intptr_t class_id) { 8052 static intptr_t ElementSizeInBytes(intptr_t class_id) {
8268 ASSERT(RawObject::IsTypedDataViewClassId(class_id)); 8053 ASSERT(RawObject::IsTypedDataViewClassId(class_id));
8269 return (class_id == kByteDataViewCid) ? 8054 return (class_id == kByteDataViewCid)
8270 1 : TypedData::element_size(class_id - kTypedDataInt8ArrayViewCid); 8055 ? 1
8056 : TypedData::element_size(class_id - kTypedDataInt8ArrayViewCid);
8271 } 8057 }
8272 8058
8273 private: 8059 private:
8274 enum { 8060 enum {
8275 kDataOffset = 1, 8061 kDataOffset = 1,
8276 kOffsetInBytesOffset = 2, 8062 kOffsetInBytesOffset = 2,
8277 kLengthOffset = 3, 8063 kLengthOffset = 3,
8278 }; 8064 };
8279 }; 8065 };
8280 8066
8281 8067
8282 class ByteBuffer : public AllStatic { 8068 class ByteBuffer : public AllStatic {
8283 public: 8069 public:
8284 static RawInstance* Data(const Instance& view_obj) { 8070 static RawInstance* Data(const Instance& view_obj) {
8285 ASSERT(!view_obj.IsNull()); 8071 ASSERT(!view_obj.IsNull());
8286 return *reinterpret_cast<RawInstance* const*>( 8072 return *reinterpret_cast<RawInstance* const*>(view_obj.raw_ptr() +
8287 view_obj.raw_ptr() + kDataOffset); 8073 kDataOffset);
8288 } 8074 }
8289 8075
8290 static intptr_t NumberOfFields() { 8076 static intptr_t NumberOfFields() { return kDataOffset; }
8291 return kDataOffset;
8292 }
8293 8077
8294 static intptr_t data_offset() { 8078 static intptr_t data_offset() { return kWordSize * kDataOffset; }
8295 return kWordSize * kDataOffset;
8296 }
8297 8079
8298 private: 8080 private:
8299 enum { 8081 enum {
8300 kDataOffset = 1, 8082 kDataOffset = 1,
8301 }; 8083 };
8302 }; 8084 };
8303 8085
8304 8086
8305 // Corresponds to 8087 // Corresponds to
8306 // - "new Map()", 8088 // - "new Map()",
(...skipping 22 matching lines...) Expand all
8329 ((value.Length() >= 2) && 8111 ((value.Length() >= 2) &&
8330 value.IsInstantiated() /*&& value.IsCanonical()*/)); 8112 value.IsInstantiated() /*&& value.IsCanonical()*/));
8331 // TODO(asiva): Values read from a message snapshot are not properly marked 8113 // TODO(asiva): Values read from a message snapshot are not properly marked
8332 // as canonical. See for example tests/isolate/message3_test.dart. 8114 // as canonical. See for example tests/isolate/message3_test.dart.
8333 StorePointer(&raw_ptr()->type_arguments_, value.raw()); 8115 StorePointer(&raw_ptr()->type_arguments_, value.raw());
8334 } 8116 }
8335 static intptr_t type_arguments_offset() { 8117 static intptr_t type_arguments_offset() {
8336 return OFFSET_OF(RawLinkedHashMap, type_arguments_); 8118 return OFFSET_OF(RawLinkedHashMap, type_arguments_);
8337 } 8119 }
8338 8120
8339 RawTypedData* index() const { 8121 RawTypedData* index() const { return raw_ptr()->index_; }
8340 return raw_ptr()->index_;
8341 }
8342 void SetIndex(const TypedData& value) const { 8122 void SetIndex(const TypedData& value) const {
8343 StorePointer(&raw_ptr()->index_, value.raw()); 8123 StorePointer(&raw_ptr()->index_, value.raw());
8344 } 8124 }
8345 static intptr_t index_offset() { 8125 static intptr_t index_offset() { return OFFSET_OF(RawLinkedHashMap, index_); }
8346 return OFFSET_OF(RawLinkedHashMap, index_);
8347 }
8348 8126
8349 RawArray* data() const { 8127 RawArray* data() const { return raw_ptr()->data_; }
8350 return raw_ptr()->data_;
8351 }
8352 void SetData(const Array& value) const { 8128 void SetData(const Array& value) const {
8353 StorePointer(&raw_ptr()->data_, value.raw()); 8129 StorePointer(&raw_ptr()->data_, value.raw());
8354 } 8130 }
8355 static intptr_t data_offset() { 8131 static intptr_t data_offset() { return OFFSET_OF(RawLinkedHashMap, data_); }
8356 return OFFSET_OF(RawLinkedHashMap, data_);
8357 }
8358 8132
8359 RawSmi* hash_mask() const { 8133 RawSmi* hash_mask() const { return raw_ptr()->hash_mask_; }
8360 return raw_ptr()->hash_mask_;
8361 }
8362 void SetHashMask(intptr_t value) const { 8134 void SetHashMask(intptr_t value) const {
8363 StoreSmi(&raw_ptr()->hash_mask_, Smi::New(value)); 8135 StoreSmi(&raw_ptr()->hash_mask_, Smi::New(value));
8364 } 8136 }
8365 static intptr_t hash_mask_offset() { 8137 static intptr_t hash_mask_offset() {
8366 return OFFSET_OF(RawLinkedHashMap, hash_mask_); 8138 return OFFSET_OF(RawLinkedHashMap, hash_mask_);
8367 } 8139 }
8368 8140
8369 RawSmi* used_data() const { 8141 RawSmi* used_data() const { return raw_ptr()->used_data_; }
8370 return raw_ptr()->used_data_;
8371 }
8372 void SetUsedData(intptr_t value) const { 8142 void SetUsedData(intptr_t value) const {
8373 StoreSmi(&raw_ptr()->used_data_, Smi::New(value)); 8143 StoreSmi(&raw_ptr()->used_data_, Smi::New(value));
8374 } 8144 }
8375 static intptr_t used_data_offset() { 8145 static intptr_t used_data_offset() {
8376 return OFFSET_OF(RawLinkedHashMap, used_data_); 8146 return OFFSET_OF(RawLinkedHashMap, used_data_);
8377 } 8147 }
8378 8148
8379 RawSmi* deleted_keys() const { 8149 RawSmi* deleted_keys() const { return raw_ptr()->deleted_keys_; }
8380 return raw_ptr()->deleted_keys_;
8381 }
8382 void SetDeletedKeys(intptr_t value) const { 8150 void SetDeletedKeys(intptr_t value) const {
8383 StoreSmi(&raw_ptr()->deleted_keys_, Smi::New(value)); 8151 StoreSmi(&raw_ptr()->deleted_keys_, Smi::New(value));
8384 } 8152 }
8385 static intptr_t deleted_keys_offset() { 8153 static intptr_t deleted_keys_offset() {
8386 return OFFSET_OF(RawLinkedHashMap, deleted_keys_); 8154 return OFFSET_OF(RawLinkedHashMap, deleted_keys_);
8387 } 8155 }
8388 8156
8389 intptr_t Length() const { 8157 intptr_t Length() const {
8390 intptr_t used = Smi::Value(raw_ptr()->used_data_); 8158 intptr_t used = Smi::Value(raw_ptr()->used_data_);
8391 intptr_t deleted = Smi::Value(raw_ptr()->deleted_keys_); 8159 intptr_t deleted = Smi::Value(raw_ptr()->deleted_keys_);
8392 return (used >> 1) - deleted; 8160 return (used >> 1) - deleted;
8393 } 8161 }
8394 8162
8395 // This iterator differs somewhat from its Dart counterpart (_CompactIterator 8163 // This iterator differs somewhat from its Dart counterpart (_CompactIterator
8396 // in runtime/lib/compact_hash.dart): 8164 // in runtime/lib/compact_hash.dart):
8397 // - There are no checks for concurrent modifications. 8165 // - There are no checks for concurrent modifications.
8398 // - Accessing a key or value before the first call to MoveNext and after 8166 // - Accessing a key or value before the first call to MoveNext and after
8399 // MoveNext returns false will result in crashes. 8167 // MoveNext returns false will result in crashes.
8400 class Iterator : ValueObject { 8168 class Iterator : ValueObject {
8401 public: 8169 public:
8402 explicit Iterator(const LinkedHashMap& map) 8170 explicit Iterator(const LinkedHashMap& map)
8403 : data_(Array::Handle(map.data())), 8171 : data_(Array::Handle(map.data())),
8404 scratch_(Object::Handle()), 8172 scratch_(Object::Handle()),
8405 offset_(-2), 8173 offset_(-2),
8406 length_(Smi::Value(map.used_data())) {} 8174 length_(Smi::Value(map.used_data())) {}
8407 8175
8408 bool MoveNext() { 8176 bool MoveNext() {
8409 while (true) { 8177 while (true) {
8410 offset_ += 2; 8178 offset_ += 2;
8411 if (offset_ >= length_) { 8179 if (offset_ >= length_) {
8412 return false; 8180 return false;
8413 } 8181 }
8414 scratch_ = data_.At(offset_); 8182 scratch_ = data_.At(offset_);
8415 if (scratch_.raw() != data_.raw()) { 8183 if (scratch_.raw() != data_.raw()) {
8416 // Slot is not deleted (self-reference indicates deletion). 8184 // Slot is not deleted (self-reference indicates deletion).
8417 return true; 8185 return true;
8418 } 8186 }
8419 } 8187 }
8420 } 8188 }
8421 8189
8422 RawObject* CurrentKey() const { 8190 RawObject* CurrentKey() const { return data_.At(offset_); }
8423 return data_.At(offset_);
8424 }
8425 8191
8426 RawObject* CurrentValue() const { 8192 RawObject* CurrentValue() const { return data_.At(offset_ + 1); }
8427 return data_.At(offset_ + 1);
8428 }
8429 8193
8430 private: 8194 private:
8431 const Array& data_; 8195 const Array& data_;
8432 Object& scratch_; 8196 Object& scratch_;
8433 intptr_t offset_; 8197 intptr_t offset_;
8434 const intptr_t length_; 8198 const intptr_t length_;
8435 }; 8199 };
8436 8200
8437 private: 8201 private:
8438 FINAL_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap, Instance); 8202 FINAL_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap, Instance);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
8535 8299
8536 Dart_Port origin_id() const { return raw_ptr()->origin_id_; } 8300 Dart_Port origin_id() const { return raw_ptr()->origin_id_; }
8537 void set_origin_id(Dart_Port id) const { 8301 void set_origin_id(Dart_Port id) const {
8538 ASSERT(origin_id() == 0); 8302 ASSERT(origin_id() == 0);
8539 StoreNonPointer(&(raw_ptr()->origin_id_), id); 8303 StoreNonPointer(&(raw_ptr()->origin_id_), id);
8540 } 8304 }
8541 8305
8542 static intptr_t InstanceSize() { 8306 static intptr_t InstanceSize() {
8543 return RoundedAllocationSize(sizeof(RawSendPort)); 8307 return RoundedAllocationSize(sizeof(RawSendPort));
8544 } 8308 }
8545 static RawSendPort* New(Dart_Port id, 8309 static RawSendPort* New(Dart_Port id, Heap::Space space = Heap::kNew);
8546 Heap::Space space = Heap::kNew);
8547 static RawSendPort* New(Dart_Port id, 8310 static RawSendPort* New(Dart_Port id,
8548 Dart_Port origin_id, 8311 Dart_Port origin_id,
8549 Heap::Space space = Heap::kNew); 8312 Heap::Space space = Heap::kNew);
8550 8313
8551 private: 8314 private:
8552 FINAL_HEAP_OBJECT_IMPLEMENTATION(SendPort, Instance); 8315 FINAL_HEAP_OBJECT_IMPLEMENTATION(SendPort, Instance);
8553 friend class Class; 8316 friend class Class;
8554 }; 8317 };
8555 8318
8556 8319
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
8644 : raw_ptr()->two_byte_bytecode_; 8407 : raw_ptr()->two_byte_bytecode_;
8645 } 8408 }
8646 8409
8647 static intptr_t function_offset(intptr_t cid) { 8410 static intptr_t function_offset(intptr_t cid) {
8648 switch (cid) { 8411 switch (cid) {
8649 case kOneByteStringCid: 8412 case kOneByteStringCid:
8650 return OFFSET_OF(RawRegExp, one_byte_function_); 8413 return OFFSET_OF(RawRegExp, one_byte_function_);
8651 case kTwoByteStringCid: 8414 case kTwoByteStringCid:
8652 return OFFSET_OF(RawRegExp, two_byte_function_); 8415 return OFFSET_OF(RawRegExp, two_byte_function_);
8653 case kExternalOneByteStringCid: 8416 case kExternalOneByteStringCid:
8654 return OFFSET_OF(RawRegExp, external_one_byte_function_); 8417 return OFFSET_OF(RawRegExp, external_one_byte_function_);
8655 case kExternalTwoByteStringCid: 8418 case kExternalTwoByteStringCid:
8656 return OFFSET_OF(RawRegExp, external_two_byte_function_); 8419 return OFFSET_OF(RawRegExp, external_two_byte_function_);
8657 } 8420 }
8658 8421
8659 UNREACHABLE(); 8422 UNREACHABLE();
8660 return -1; 8423 return -1;
8661 } 8424 }
8662 8425
8663 RawFunction** FunctionAddr(intptr_t cid) const { 8426 RawFunction** FunctionAddr(intptr_t cid) const {
8664 return reinterpret_cast<RawFunction**>( 8427 return reinterpret_cast<RawFunction**>(
8665 FieldAddrAtOffset(function_offset(cid))); 8428 FieldAddrAtOffset(function_offset(cid)));
8666 } 8429 }
8667 8430
8668 RawFunction* function(intptr_t cid) const { 8431 RawFunction* function(intptr_t cid) const { return *FunctionAddr(cid); }
8669 return *FunctionAddr(cid);
8670 }
8671 8432
8672 void set_pattern(const String& pattern) const; 8433 void set_pattern(const String& pattern) const;
8673 void set_function(intptr_t cid, const Function& value) const; 8434 void set_function(intptr_t cid, const Function& value) const;
8674 void set_bytecode(bool is_one_byte, const TypedData& bytecode) const; 8435 void set_bytecode(bool is_one_byte, const TypedData& bytecode) const;
8675 8436
8676 void set_num_bracket_expressions(intptr_t value) const; 8437 void set_num_bracket_expressions(intptr_t value) const;
8677 void set_is_global() const { set_flags(flags() | kGlobal); } 8438 void set_is_global() const { set_flags(flags() | kGlobal); }
8678 void set_is_ignore_case() const { set_flags(flags() | kIgnoreCase); } 8439 void set_is_ignore_case() const { set_flags(flags() | kIgnoreCase); }
8679 void set_is_multi_line() const { set_flags(flags() | kMultiLine); } 8440 void set_is_multi_line() const { set_flags(flags() | kMultiLine); }
8680 void set_is_simple() const { set_type(kSimple); } 8441 void set_is_simple() const { set_type(kSimple); }
(...skipping 17 matching lines...) Expand all
8698 private: 8459 private:
8699 void set_type(RegExType type) const { 8460 void set_type(RegExType type) const {
8700 StoreNonPointer(&raw_ptr()->type_flags_, 8461 StoreNonPointer(&raw_ptr()->type_flags_,
8701 TypeBits::update(type, raw_ptr()->type_flags_)); 8462 TypeBits::update(type, raw_ptr()->type_flags_));
8702 } 8463 }
8703 void set_flags(intptr_t value) const { 8464 void set_flags(intptr_t value) const {
8704 StoreNonPointer(&raw_ptr()->type_flags_, 8465 StoreNonPointer(&raw_ptr()->type_flags_,
8705 FlagsBits::update(value, raw_ptr()->type_flags_)); 8466 FlagsBits::update(value, raw_ptr()->type_flags_));
8706 } 8467 }
8707 8468
8708 RegExType type() const { 8469 RegExType type() const { return TypeBits::decode(raw_ptr()->type_flags_); }
8709 return TypeBits::decode(raw_ptr()->type_flags_); 8470 intptr_t flags() const { return FlagsBits::decode(raw_ptr()->type_flags_); }
8710 }
8711 intptr_t flags() const {
8712 return FlagsBits::decode(raw_ptr()->type_flags_);
8713 }
8714 8471
8715 FINAL_HEAP_OBJECT_IMPLEMENTATION(RegExp, Instance); 8472 FINAL_HEAP_OBJECT_IMPLEMENTATION(RegExp, Instance);
8716 friend class Class; 8473 friend class Class;
8717 }; 8474 };
8718 8475
8719 8476
8720 class WeakProperty : public Instance { 8477 class WeakProperty : public Instance {
8721 public: 8478 public:
8722 RawObject* key() const { 8479 RawObject* key() const { return raw_ptr()->key_; }
8723 return raw_ptr()->key_;
8724 }
8725 8480
8726 void set_key(const Object& key) const { 8481 void set_key(const Object& key) const {
8727 StorePointer(&raw_ptr()->key_, key.raw()); 8482 StorePointer(&raw_ptr()->key_, key.raw());
8728 } 8483 }
8729 8484
8730 RawObject* value() const { 8485 RawObject* value() const { return raw_ptr()->value_; }
8731 return raw_ptr()->value_;
8732 }
8733 8486
8734 void set_value(const Object& value) const { 8487 void set_value(const Object& value) const {
8735 StorePointer(&raw_ptr()->value_, value.raw()); 8488 StorePointer(&raw_ptr()->value_, value.raw());
8736 } 8489 }
8737 8490
8738 static RawWeakProperty* New(Heap::Space space = Heap::kNew); 8491 static RawWeakProperty* New(Heap::Space space = Heap::kNew);
8739 8492
8740 static intptr_t InstanceSize() { 8493 static intptr_t InstanceSize() {
8741 return RoundedAllocationSize(sizeof(RawWeakProperty)); 8494 return RoundedAllocationSize(sizeof(RawWeakProperty));
8742 } 8495 }
8743 8496
8744 static void Clear(RawWeakProperty* raw_weak) { 8497 static void Clear(RawWeakProperty* raw_weak) {
8745 ASSERT(raw_weak->ptr()->next_ == 0); 8498 ASSERT(raw_weak->ptr()->next_ == 0);
8746 raw_weak->StorePointer(&(raw_weak->ptr()->key_), Object::null()); 8499 raw_weak->StorePointer(&(raw_weak->ptr()->key_), Object::null());
8747 raw_weak->StorePointer(&(raw_weak->ptr()->value_), Object::null()); 8500 raw_weak->StorePointer(&(raw_weak->ptr()->value_), Object::null());
8748 } 8501 }
8749 8502
8750 private: 8503 private:
8751 FINAL_HEAP_OBJECT_IMPLEMENTATION(WeakProperty, Instance); 8504 FINAL_HEAP_OBJECT_IMPLEMENTATION(WeakProperty, Instance);
8752 friend class Class; 8505 friend class Class;
8753 }; 8506 };
8754 8507
8755 8508
8756 class MirrorReference : public Instance { 8509 class MirrorReference : public Instance {
8757 public: 8510 public:
8758 RawObject* referent() const { 8511 RawObject* referent() const { return raw_ptr()->referent_; }
8759 return raw_ptr()->referent_;
8760 }
8761 8512
8762 void set_referent(const Object& referent) const { 8513 void set_referent(const Object& referent) const {
8763 StorePointer(&raw_ptr()->referent_, referent.raw()); 8514 StorePointer(&raw_ptr()->referent_, referent.raw());
8764 } 8515 }
8765 8516
8766 RawAbstractType* GetAbstractTypeReferent() const; 8517 RawAbstractType* GetAbstractTypeReferent() const;
8767 8518
8768 RawClass* GetClassReferent() const; 8519 RawClass* GetClassReferent() const;
8769 8520
8770 RawField* GetFieldReferent() const; 8521 RawField* GetFieldReferent() const;
(...skipping 20 matching lines...) Expand all
8791 class UserTag : public Instance { 8542 class UserTag : public Instance {
8792 public: 8543 public:
8793 uword tag() const { return raw_ptr()->tag(); } 8544 uword tag() const { return raw_ptr()->tag(); }
8794 void set_tag(uword t) const { 8545 void set_tag(uword t) const {
8795 ASSERT(t >= UserTags::kUserTagIdOffset); 8546 ASSERT(t >= UserTags::kUserTagIdOffset);
8796 ASSERT(t < UserTags::kUserTagIdOffset + UserTags::kMaxUserTags); 8547 ASSERT(t < UserTags::kUserTagIdOffset + UserTags::kMaxUserTags);
8797 StoreNonPointer(&raw_ptr()->tag_, t); 8548 StoreNonPointer(&raw_ptr()->tag_, t);
8798 } 8549 }
8799 static intptr_t tag_offset() { return OFFSET_OF(RawUserTag, tag_); } 8550 static intptr_t tag_offset() { return OFFSET_OF(RawUserTag, tag_); }
8800 8551
8801 RawString* label() const { 8552 RawString* label() const { return raw_ptr()->label_; }
8802 return raw_ptr()->label_;
8803 }
8804 8553
8805 void MakeActive() const; 8554 void MakeActive() const;
8806 8555
8807 static intptr_t InstanceSize() { 8556 static intptr_t InstanceSize() {
8808 return RoundedAllocationSize(sizeof(RawUserTag)); 8557 return RoundedAllocationSize(sizeof(RawUserTag));
8809 } 8558 }
8810 8559
8811 static RawUserTag* New(const String& label, 8560 static RawUserTag* New(const String& label, Heap::Space space = Heap::kOld);
8812 Heap::Space space = Heap::kOld);
8813 static RawUserTag* DefaultTag(); 8561 static RawUserTag* DefaultTag();
8814 8562
8815 static bool TagTableIsFull(Thread* thread); 8563 static bool TagTableIsFull(Thread* thread);
8816 static RawUserTag* FindTagById(uword tag_id); 8564 static RawUserTag* FindTagById(uword tag_id);
8817 8565
8818 private: 8566 private:
8819 static RawUserTag* FindTagInIsolate(Thread* thread, const String& label); 8567 static RawUserTag* FindTagInIsolate(Thread* thread, const String& label);
8820 static void AddTagToIsolate(Thread* thread, const UserTag& tag); 8568 static void AddTagToIsolate(Thread* thread, const UserTag& tag);
8821 8569
8822 void set_label(const String& tag_label) const { 8570 void set_label(const String& tag_label) const {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
9039 8787
9040 inline void TypeArguments::SetHash(intptr_t value) const { 8788 inline void TypeArguments::SetHash(intptr_t value) const {
9041 // This is only safe because we create a new Smi, which does not cause 8789 // This is only safe because we create a new Smi, which does not cause
9042 // heap allocation. 8790 // heap allocation.
9043 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); 8791 StoreSmi(&raw_ptr()->hash_, Smi::New(value));
9044 } 8792 }
9045 8793
9046 } // namespace dart 8794 } // namespace dart
9047 8795
9048 #endif // RUNTIME_VM_OBJECT_H_ 8796 #endif // RUNTIME_VM_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/native_symbol_macos.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698