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

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

Issue 14307013: - Remember the fact that an object has been added to the (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_RAW_OBJECT_H_ 5 #ifndef VM_RAW_OBJECT_H_
6 #define VM_RAW_OBJECT_H_ 6 #define VM_RAW_OBJECT_H_
7 7
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/globals.h" 9 #include "vm/globals.h"
10 #include "vm/token.h" 10 #include "vm/token.h"
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 // be dereferenced (e.g. RawSmi). 216 // be dereferenced (e.g. RawSmi).
217 class RawObject { 217 class RawObject {
218 public: 218 public:
219 // The tags field which is a part of the object header uses the following 219 // The tags field which is a part of the object header uses the following
220 // bit fields for storing tags. 220 // bit fields for storing tags.
221 enum TagBits { 221 enum TagBits {
222 kFreeBit = 0, 222 kFreeBit = 0,
223 kMarkBit = 1, 223 kMarkBit = 1,
224 kCanonicalBit = 2, 224 kCanonicalBit = 2,
225 kFromSnapshotBit = 3, 225 kFromSnapshotBit = 3,
226 kWatchedBit = 4, 226 kWatchedBit = 4,
siva 2013/04/27 00:49:37 The WatchedBit is only used during GC right so we
227 kReservedTagBit = 5, // kReservedBit{10K,100K,1M,10M} 227 kRememberedBit = 5,
228 kReservedTagSize = 3, 228 kReservedTagBit = 6, // kReservedBit{10K,100K,1M,10M}
229 kReservedTagSize = 2,
229 kSizeTagBit = 8, 230 kSizeTagBit = 8,
230 kSizeTagSize = 8, 231 kSizeTagSize = 8,
231 kClassIdTagBit = kSizeTagBit + kSizeTagSize, 232 kClassIdTagBit = kSizeTagBit + kSizeTagSize,
232 kClassIdTagSize = 16 233 kClassIdTagSize = 16
233 }; 234 };
234 235
235 // Encodes the object size in the tag in units of object alignment. 236 // Encodes the object size in the tag in units of object alignment.
236 class SizeTag { 237 class SizeTag {
237 public: 238 public:
238 static const intptr_t kMaxSizeTag = 239 static const intptr_t kMaxSizeTag =
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 ASSERT(!IsMarked()); 293 ASSERT(!IsMarked());
293 uword tags = ptr()->tags_; 294 uword tags = ptr()->tags_;
294 ptr()->tags_ = MarkBit::update(true, tags); 295 ptr()->tags_ = MarkBit::update(true, tags);
295 } 296 }
296 void ClearMarkBit() { 297 void ClearMarkBit() {
297 ASSERT(IsMarked()); 298 ASSERT(IsMarked());
298 uword tags = ptr()->tags_; 299 uword tags = ptr()->tags_;
299 ptr()->tags_ = MarkBit::update(false, tags); 300 ptr()->tags_ = MarkBit::update(false, tags);
300 } 301 }
301 302
302 // Support for GC watched bit. 303 // Support for remembered bit.
303 bool IsWatched() const { 304 bool IsRemembered() const {
304 return WatchedBit::decode(ptr()->tags_); 305 return RememberedBit::decode(ptr()->tags_);
305 } 306 }
306 void SetWatchedBit() { 307 void SetRememberedBit() {
307 ASSERT(!IsWatched()); 308 ASSERT(!IsRemembered());
308 uword tags = ptr()->tags_; 309 uword tags = ptr()->tags_;
309 ptr()->tags_ = WatchedBit::update(true, tags); 310 ptr()->tags_ = RememberedBit::update(true, tags);
310 } 311 }
311 void ClearWatchedBit() { 312 void ClearRememberedBit() {
312 ASSERT(IsWatched());
313 uword tags = ptr()->tags_; 313 uword tags = ptr()->tags_;
314 ptr()->tags_ = WatchedBit::update(false, tags); 314 ptr()->tags_ = RememberedBit::update(false, tags);
315 } 315 }
316 316
317 // Support for object tags. 317 // Support for object tags.
318 bool IsCanonical() const { 318 bool IsCanonical() const {
319 return CanonicalObjectTag::decode(ptr()->tags_); 319 return CanonicalObjectTag::decode(ptr()->tags_);
320 } 320 }
321 void SetCanonical() { 321 void SetCanonical() {
322 uword tags = ptr()->tags_; 322 uword tags = ptr()->tags_;
323 ptr()->tags_ = CanonicalObjectTag::update(true, tags); 323 ptr()->tags_ = CanonicalObjectTag::update(true, tags);
324 } 324 }
325 bool IsCreatedFromSnapshot() const { 325 bool IsCreatedFromSnapshot() const {
326 return CreatedFromSnapshotTag::decode(ptr()->tags_); 326 return CreatedFromSnapshotTag::decode(ptr()->tags_);
327 } 327 }
328 void SetCreatedFromSnapshot() { 328 void SetCreatedFromSnapshot() {
329 uword tags = ptr()->tags_; 329 uword tags = ptr()->tags_;
330 ptr()->tags_ = CreatedFromSnapshotTag::update(true, tags); 330 ptr()->tags_ = CreatedFromSnapshotTag::update(true, tags);
331 } 331 }
332 332
333 // Support for GC watched bit.
334 bool IsWatched() const {
335 return WatchedBit::decode(ptr()->tags_);
336 }
337 void SetWatchedBit() {
338 ASSERT(!IsWatched());
339 uword tags = ptr()->tags_;
340 ptr()->tags_ = WatchedBit::update(true, tags);
341 }
342 void ClearWatchedBit() {
343 ASSERT(IsWatched());
344 uword tags = ptr()->tags_;
345 ptr()->tags_ = WatchedBit::update(false, tags);
346 }
347
333 bool IsDartInstance() { 348 bool IsDartInstance() {
334 return (!IsHeapObject() || (GetClassId() >= kInstanceCid)); 349 return (!IsHeapObject() || (GetClassId() >= kInstanceCid));
335 } 350 }
336 351
337 intptr_t Size() const { 352 intptr_t Size() const {
338 uword tags = ptr()->tags_; 353 uword tags = ptr()->tags_;
339 intptr_t result = SizeTag::decode(tags); 354 intptr_t result = SizeTag::decode(tags);
340 if (result != 0) { 355 if (result != 0) {
341 ASSERT(result == SizeFromClass()); 356 ASSERT(result == SizeFromClass());
342 return result; 357 return result;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 static bool IsBuiltinListClassId(intptr_t index); 394 static bool IsBuiltinListClassId(intptr_t index);
380 static bool IsTypedDataClassId(intptr_t index); 395 static bool IsTypedDataClassId(intptr_t index);
381 static bool IsTypedDataViewClassId(intptr_t index); 396 static bool IsTypedDataViewClassId(intptr_t index);
382 static bool IsExternalTypedDataClassId(intptr_t index); 397 static bool IsExternalTypedDataClassId(intptr_t index);
383 398
384 static intptr_t NumberOfTypedDataClasses(); 399 static intptr_t NumberOfTypedDataClasses();
385 400
386 private: 401 private:
387 uword tags_; // Various object tags (bits). 402 uword tags_; // Various object tags (bits).
388 403
389 class FreeBit : public BitField<bool, kFreeBit, 1> {}; 404 class MarkBit : public BitField<bool, kMarkBit, 1> {};
390 405
391 class MarkBit : public BitField<bool, kMarkBit, 1> {}; 406 class RememberedBit : public BitField<bool, kRememberedBit, 1> {};
392 407
393 class WatchedBit : public BitField<bool, kWatchedBit, 1> {}; 408 class WatchedBit : public BitField<bool, kWatchedBit, 1> {};
394 409
395 class CanonicalObjectTag : public BitField<bool, kCanonicalBit, 1> {}; 410 class CanonicalObjectTag : public BitField<bool, kCanonicalBit, 1> {};
396 411
397 class CreatedFromSnapshotTag : public BitField<bool, kFromSnapshotBit, 1> {}; 412 class CreatedFromSnapshotTag : public BitField<bool, kFromSnapshotBit, 1> {};
398 413
399 class ReservedBits : public BitField<intptr_t, 414 class ReservedBits : public BitField<intptr_t,
400 kReservedTagBit, 415 kReservedTagBit,
401 kReservedTagSize> {}; // NOLINT 416 kReservedTagSize> {}; // NOLINT
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1664 // Make sure this is updated when new TypedData types are added. 1679 // Make sure this is updated when new TypedData types are added.
1665 ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 12); 1680 ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 12);
1666 ASSERT(kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 13); 1681 ASSERT(kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 13);
1667 ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 12); 1682 ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 12);
1668 return (kNullCid - kTypedDataInt8ArrayCid); 1683 return (kNullCid - kTypedDataInt8ArrayCid);
1669 } 1684 }
1670 1685
1671 } // namespace dart 1686 } // namespace dart
1672 1687
1673 #endif // VM_RAW_OBJECT_H_ 1688 #endif // VM_RAW_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/raw_object.cc » ('j') | runtime/vm/stub_code_ia32.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698