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

Side by Side Diff: vm/raw_object.h

Issue 10827209: Unify class ids and snapshot object ids list so that we don't have disparate and sometimes confusin… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 4 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
« no previous file with comments | « vm/object_test.cc ('k') | vm/raw_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 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 V(ExternalInt8Array) \ 79 V(ExternalInt8Array) \
80 V(ExternalUint8Array) \ 80 V(ExternalUint8Array) \
81 V(ExternalInt16Array) \ 81 V(ExternalInt16Array) \
82 V(ExternalUint16Array) \ 82 V(ExternalUint16Array) \
83 V(ExternalInt32Array) \ 83 V(ExternalInt32Array) \
84 V(ExternalUint32Array) \ 84 V(ExternalUint32Array) \
85 V(ExternalInt64Array) \ 85 V(ExternalInt64Array) \
86 V(ExternalUint64Array) \ 86 V(ExternalUint64Array) \
87 V(ExternalFloat32Array) \ 87 V(ExternalFloat32Array) \
88 V(ExternalFloat64Array) \ 88 V(ExternalFloat64Array) \
89 V(Closure) \
90 V(Stacktrace) \ 89 V(Stacktrace) \
91 V(JSRegExp) \ 90 V(JSRegExp) \
91 V(Closure) \
92 92
93 #define CLASS_LIST(V) \ 93 #define CLASS_LIST(V) \
94 V(Object) \ 94 V(Object) \
95 CLASS_LIST_NO_OBJECT(V) 95 CLASS_LIST_NO_OBJECT(V)
96 96
97 97
98 // Forward declarations. 98 // Forward declarations.
99 class Isolate; 99 class Isolate;
100 #define DEFINE_FORWARD_DECLARATION(clazz) \ 100 #define DEFINE_FORWARD_DECLARATION(clazz) \
101 class Raw##clazz; 101 class Raw##clazz;
102 CLASS_LIST(DEFINE_FORWARD_DECLARATION) 102 CLASS_LIST(DEFINE_FORWARD_DECLARATION)
103 #undef DEFINE_FORWARD_DECLARATION 103 #undef DEFINE_FORWARD_DECLARATION
104 104
105 105
106 enum ObjectKind { 106 enum ClassId {
107 kIllegalObjectKind = 0, 107 // Illegal class id.
108 kIllegalCid = 0,
109
110 // List of Ids for predefined classes.
108 #define DEFINE_OBJECT_KIND(clazz) \ 111 #define DEFINE_OBJECT_KIND(clazz) \
109 k##clazz, 112 k##clazz##Cid,
110 CLASS_LIST(DEFINE_OBJECT_KIND) 113 CLASS_LIST(DEFINE_OBJECT_KIND)
111 #undef DEFINE_OBJECT_KIND 114 #undef DEFINE_OBJECT_KIND
112 // The following entry does not describe a real object, but instead it 115
113 // identifies free list elements in the heap. 116 // The following entries do not describe a predefined class, but instead
117 // are class indexes for pre-allocated instance (Null, Dynamic and Void).
118 kNullCid,
119 kDynamicCid,
120 kVoidCid,
121
122 // The following entry does not describe a real class, but instead it is an
123 // id which is used to identify free list elements in the heap.
114 kFreeListElement, 124 kFreeListElement,
115 // The following entries do not describe a real object, but instead are used 125
116 // to allocate class indexes for pre-allocated instance classes such as the 126 kNumPredefinedCids,
117 // Null, Void, Dynamic and other similar classes.
118 kNullClassId,
119 kDynamicClassId,
120 kVoidClassId,
121 kNumPredefinedKinds = 100
122 }; 127 };
123 128
124 enum ObjectAlignment { 129 enum ObjectAlignment {
125 // Alignment offsets are used to determine object age. 130 // Alignment offsets are used to determine object age.
126 kNewObjectAlignmentOffset = kWordSize, 131 kNewObjectAlignmentOffset = kWordSize,
127 kOldObjectAlignmentOffset = 0, 132 kOldObjectAlignmentOffset = 0,
128 // Object sizes are aligned to kObjectAlignment. 133 // Object sizes are aligned to kObjectAlignment.
129 kObjectAlignment = 2 * kWordSize, 134 kObjectAlignment = 2 * kWordSize,
130 kObjectAlignmentLog2 = kWordSizeLog2 + 1, 135 kObjectAlignmentLog2 = kWordSizeLog2 + 1,
131 kObjectAlignmentMask = kObjectAlignment - 1, 136 kObjectAlignmentMask = kObjectAlignment - 1,
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 } 304 }
300 305
301 static bool IsCreatedFromSnapshot(intptr_t value) { 306 static bool IsCreatedFromSnapshot(intptr_t value) {
302 return CreatedFromSnapshotTag::decode(value); 307 return CreatedFromSnapshotTag::decode(value);
303 } 308 }
304 309
305 static bool IsCanonical(intptr_t value) { 310 static bool IsCanonical(intptr_t value) {
306 return CanonicalObjectTag::decode(value); 311 return CanonicalObjectTag::decode(value);
307 } 312 }
308 313
309 // ObjectKind predicates. 314 // Class Id predicates.
310 static bool IsErrorClassId(intptr_t index); 315 static bool IsErrorClassId(intptr_t index);
311 static bool IsNumberClassId(intptr_t index); 316 static bool IsNumberClassId(intptr_t index);
312 static bool IsIntegerClassId(intptr_t index); 317 static bool IsIntegerClassId(intptr_t index);
313 static bool IsStringClassId(intptr_t index); 318 static bool IsStringClassId(intptr_t index);
314 static bool IsOneByteStringClassId(intptr_t index); 319 static bool IsOneByteStringClassId(intptr_t index);
315 static bool IsTwoByteStringClassId(intptr_t index); 320 static bool IsTwoByteStringClassId(intptr_t index);
316 static bool IsExternalStringClassId(intptr_t index); 321 static bool IsExternalStringClassId(intptr_t index);
317 static bool IsBuiltinListClassId(intptr_t index); 322 static bool IsBuiltinListClassId(intptr_t index);
318 static bool IsByteArrayClassId(intptr_t index); 323 static bool IsByteArrayClassId(intptr_t index);
319 324
(...skipping 19 matching lines...) Expand all
339 reinterpret_cast<uword>(this) - kHeapObjectTag); 344 reinterpret_cast<uword>(this) - kHeapObjectTag);
340 } 345 }
341 346
342 intptr_t SizeFromClass() const; 347 intptr_t SizeFromClass() const;
343 348
344 intptr_t GetClassId() const { 349 intptr_t GetClassId() const {
345 uword tags = ptr()->tags_; 350 uword tags = ptr()->tags_;
346 return ClassIdTag::decode(tags); 351 return ClassIdTag::decode(tags);
347 } 352 }
348 353
349 ObjectKind GetObjectKind() const;
350
351 friend class Api; 354 friend class Api;
352 friend class Array; 355 friend class Array;
353 friend class FreeListElement; 356 friend class FreeListElement;
354 friend class Heap; 357 friend class Heap;
355 friend class HeapProfiler; 358 friend class HeapProfiler;
356 friend class HeapProfilerRootVisitor; 359 friend class HeapProfilerRootVisitor;
357 friend class MarkingVisitor; 360 friend class MarkingVisitor;
358 friend class Object; 361 friend class Object;
359 friend class RawInstructions; 362 friend class RawInstructions;
360 friend class RawInstance; 363 friend class RawInstance;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 RawArray* functions_cache_; // See class FunctionsCache. 395 RawArray* functions_cache_; // See class FunctionsCache.
393 RawArray* constants_; // Canonicalized values of this class. 396 RawArray* constants_; // Canonicalized values of this class.
394 RawArray* canonical_types_; // Canonicalized types of this class. 397 RawArray* canonical_types_; // Canonicalized types of this class.
395 RawCode* allocation_stub_; // Stub code for allocation of instances. 398 RawCode* allocation_stub_; // Stub code for allocation of instances.
396 RawObject** to() { 399 RawObject** to() {
397 return reinterpret_cast<RawObject**>(&ptr()->allocation_stub_); 400 return reinterpret_cast<RawObject**>(&ptr()->allocation_stub_);
398 } 401 }
399 402
400 cpp_vtable handle_vtable_; 403 cpp_vtable handle_vtable_;
401 intptr_t instance_size_; // Size if fixed length or 0 if variable length. 404 intptr_t instance_size_; // Size if fixed length or 0 if variable length.
402 ObjectKind instance_kind_;
403 intptr_t id_; // Class Id, also index in the class table. 405 intptr_t id_; // Class Id, also index in the class table.
404 intptr_t type_arguments_instance_field_offset_; // May be kNoTypeArguments. 406 intptr_t type_arguments_instance_field_offset_; // May be kNoTypeArguments.
405 intptr_t next_field_offset_; // Offset of the next instance field. 407 intptr_t next_field_offset_; // Offset of the next instance field.
406 intptr_t num_native_fields_; // Number of native fields in class. 408 intptr_t num_native_fields_; // Number of native fields in class.
407 intptr_t token_pos_; 409 intptr_t token_pos_;
408 int8_t class_state_; // Of type ClassState. 410 int8_t class_state_; // Of type ClassState.
409 bool is_const_; 411 bool is_const_;
410 bool is_interface_; 412 bool is_interface_;
411 413
412 friend class Object; 414 friend class Object;
(...skipping 1072 matching lines...) Expand 10 before | Expand all | Expand 10 after
1485 return reinterpret_cast<RawObject**>(&ptr()->pattern_); 1487 return reinterpret_cast<RawObject**>(&ptr()->pattern_);
1486 } 1488 }
1487 1489
1488 intptr_t type_; // Uninitialized, simple or complex. 1490 intptr_t type_; // Uninitialized, simple or complex.
1489 intptr_t flags_; // Represents global/local, case insensitive, multiline. 1491 intptr_t flags_; // Represents global/local, case insensitive, multiline.
1490 1492
1491 // Variable length data follows here. 1493 // Variable length data follows here.
1492 uint8_t data_[0]; 1494 uint8_t data_[0];
1493 }; 1495 };
1494 1496
1495 // ObjectKind predicates. 1497 // Class Id predicates.
1496 1498
1497 inline bool RawObject::IsErrorClassId(intptr_t index) { 1499 inline bool RawObject::IsErrorClassId(intptr_t index) {
1498 // Make sure this function is updated when new Error types are added. 1500 // Make sure this function is updated when new Error types are added.
1499 ASSERT(kApiError == kError + 1 && 1501 ASSERT(kApiErrorCid == kErrorCid + 1 &&
1500 kLanguageError == kError + 2 && 1502 kLanguageErrorCid == kErrorCid + 2 &&
1501 kUnhandledException == kError + 3 && 1503 kUnhandledExceptionCid == kErrorCid + 3 &&
1502 kUnwindError == kError + 4 && 1504 kUnwindErrorCid == kErrorCid + 4 &&
1503 kInstance == kError + 5); 1505 kInstanceCid == kErrorCid + 5);
1504 return (index >= kError && index < kInstance); 1506 return (index >= kErrorCid && index < kInstanceCid);
1505 } 1507 }
1506 1508
1507 inline bool RawObject::IsNumberClassId(intptr_t index) { 1509 inline bool RawObject::IsNumberClassId(intptr_t index) {
1508 // Make sure this function is updated when new Number types are added. 1510 // Make sure this function is updated when new Number types are added.
1509 ASSERT(kInteger == kNumber + 1 && 1511 ASSERT(kIntegerCid == kNumberCid + 1 &&
1510 kSmi == kNumber + 2 && 1512 kSmiCid == kNumberCid + 2 &&
1511 kMint == kNumber + 3 && 1513 kMintCid == kNumberCid + 3 &&
1512 kBigint == kNumber + 4 && 1514 kBigintCid == kNumberCid + 4 &&
1513 kDouble == kNumber + 5 && 1515 kDoubleCid == kNumberCid + 5 &&
1514 kString == kNumber + 6); 1516 kStringCid == kNumberCid + 6);
1515 return (index >= kNumber && index < kString); 1517 return (index >= kNumberCid && index < kStringCid);
1516 } 1518 }
1517 1519
1518 inline bool RawObject::IsIntegerClassId(intptr_t index) { 1520 inline bool RawObject::IsIntegerClassId(intptr_t index) {
1519 // Make sure this function is updated when new Integer types are added. 1521 // Make sure this function is updated when new Integer types are added.
1520 ASSERT(kSmi == kInteger + 1 && 1522 ASSERT(kSmiCid == kIntegerCid + 1 &&
1521 kMint == kInteger + 2 && 1523 kMintCid == kIntegerCid + 2 &&
1522 kBigint == kInteger + 3 && 1524 kBigintCid == kIntegerCid + 3 &&
1523 kDouble == kInteger + 4); 1525 kDoubleCid == kIntegerCid + 4);
1524 return (index >= kInteger && index < kDouble); 1526 return (index >= kIntegerCid && index < kDoubleCid);
1525 } 1527 }
1526 1528
1527 inline bool RawObject::IsStringClassId(intptr_t index) { 1529 inline bool RawObject::IsStringClassId(intptr_t index) {
1528 // Make sure this function is updated when new String types are added. 1530 // Make sure this function is updated when new StringCid types are added.
1529 ASSERT(kOneByteString == kString + 1 && 1531 ASSERT(kOneByteStringCid == kStringCid + 1 &&
1530 kTwoByteString == kString + 2 && 1532 kTwoByteStringCid == kStringCid + 2 &&
1531 kFourByteString == kString + 3 && 1533 kFourByteStringCid == kStringCid + 3 &&
1532 kExternalOneByteString == kString + 4 && 1534 kExternalOneByteStringCid == kStringCid + 4 &&
1533 kExternalTwoByteString == kString + 5 && 1535 kExternalTwoByteStringCid == kStringCid + 5 &&
1534 kExternalFourByteString == kString + 6 && 1536 kExternalFourByteStringCid == kStringCid + 6 &&
1535 kBool == kString + 7); 1537 kBoolCid == kStringCid + 7);
1536 return (index >= kString && index < kBool); 1538 return (index >= kStringCid && index < kBoolCid);
1537 } 1539 }
1538 1540
1539 inline bool RawObject::IsOneByteStringClassId(intptr_t index) { 1541 inline bool RawObject::IsOneByteStringClassId(intptr_t index) {
1540 // Make sure this function is updated when new String types are added. 1542 // Make sure this function is updated when new StringCid types are added.
1541 ASSERT(kOneByteString == kString + 1 && 1543 ASSERT(kOneByteStringCid == kStringCid + 1 &&
1542 kTwoByteString == kString + 2 && 1544 kTwoByteStringCid == kStringCid + 2 &&
1543 kFourByteString == kString + 3 && 1545 kFourByteStringCid == kStringCid + 3 &&
1544 kExternalOneByteString == kString + 4 && 1546 kExternalOneByteStringCid == kStringCid + 4 &&
1545 kExternalTwoByteString == kString + 5 && 1547 kExternalTwoByteStringCid == kStringCid + 5 &&
1546 kExternalFourByteString == kString + 6 && 1548 kExternalFourByteStringCid == kStringCid + 6 &&
1547 kBool == kString + 7); 1549 kBoolCid == kStringCid + 7);
1548 return (index == kOneByteString || 1550 return (index == kOneByteStringCid || index == kExternalOneByteStringCid);
1549 index == kExternalOneByteString);
1550 } 1551 }
1551 1552
1552 inline bool RawObject::IsTwoByteStringClassId(intptr_t index) { 1553 inline bool RawObject::IsTwoByteStringClassId(intptr_t index) {
1553 // Make sure this function is updated when new String types are added. 1554 // Make sure this function is updated when new StringCid types are added.
1554 ASSERT(kOneByteString == kString + 1 && 1555 ASSERT(kOneByteStringCid == kStringCid + 1 &&
1555 kTwoByteString == kString + 2 && 1556 kTwoByteStringCid == kStringCid + 2 &&
1556 kFourByteString == kString + 3 && 1557 kFourByteStringCid == kStringCid + 3 &&
1557 kExternalOneByteString == kString + 4 && 1558 kExternalOneByteStringCid == kStringCid + 4 &&
1558 kExternalTwoByteString == kString + 5 && 1559 kExternalTwoByteStringCid == kStringCid + 5 &&
1559 kExternalFourByteString == kString + 6 && 1560 kExternalFourByteStringCid == kStringCid + 6 &&
1560 kBool == kString + 7); 1561 kBoolCid == kStringCid + 7);
1561 return (index == kOneByteString || 1562 return (index == kOneByteStringCid ||
1562 index == kTwoByteString || 1563 index == kTwoByteStringCid ||
1563 index == kExternalOneByteString || 1564 index == kExternalOneByteStringCid ||
1564 index == kExternalTwoByteString); 1565 index == kExternalTwoByteStringCid);
1565 } 1566 }
1566 1567
1567 inline bool RawObject::IsExternalStringClassId(intptr_t index) { 1568 inline bool RawObject::IsExternalStringClassId(intptr_t index) {
1568 // Make sure this function is updated when new String types are added. 1569 // Make sure this function is updated when new StringCid types are added.
1569 ASSERT(kOneByteString == kString + 1 && 1570 ASSERT(kOneByteStringCid == kStringCid + 1 &&
1570 kTwoByteString == kString + 2 && 1571 kTwoByteStringCid == kStringCid + 2 &&
1571 kFourByteString == kString + 3 && 1572 kFourByteStringCid == kStringCid + 3 &&
1572 kExternalOneByteString == kString + 4 && 1573 kExternalOneByteStringCid == kStringCid + 4 &&
1573 kExternalTwoByteString == kString + 5 && 1574 kExternalTwoByteStringCid == kStringCid + 5 &&
1574 kExternalFourByteString == kString + 6 && 1575 kExternalFourByteStringCid == kStringCid + 6 &&
1575 kBool == kString + 7); 1576 kBoolCid == kStringCid + 7);
1576 return (index == kExternalOneByteString || 1577 return (index == kExternalOneByteStringCid ||
1577 index == kExternalTwoByteString || 1578 index == kExternalTwoByteStringCid ||
1578 index == kExternalFourByteString); 1579 index == kExternalFourByteStringCid);
1579 } 1580 }
1580 1581
1581 inline bool RawObject::IsBuiltinListClassId(intptr_t index) { 1582 inline bool RawObject::IsBuiltinListClassId(intptr_t index) {
1582 // Make sure this function is updated when new builtin List types are added. 1583 // Make sure this function is updated when new builtin List types are added.
1583 ASSERT(kImmutableArray == kArray + 1 && 1584 ASSERT(kImmutableArrayCid == kArrayCid + 1 &&
1584 kGrowableObjectArray == kArray + 2 && 1585 kGrowableObjectArrayCid == kArrayCid + 2 &&
1585 kByteArray == kArray + 3); 1586 kByteArrayCid == kArrayCid + 3);
1586 return (index >= kArray && index < kByteArray) || IsByteArrayClassId(index); 1587 return (index >= kArrayCid && index < kByteArrayCid) ||
1588 IsByteArrayClassId(index);
1587 } 1589 }
1588 1590
1589 inline bool RawObject::IsByteArrayClassId(intptr_t index) { 1591 inline bool RawObject::IsByteArrayClassId(intptr_t index) {
1590 // Make sure this function is updated when new ByteArray types are added. 1592 // Make sure this function is updated when new ByteArray types are added.
1591 ASSERT(kInt8Array == kByteArray + 1 && 1593 ASSERT(kInt8ArrayCid == kByteArrayCid + 1 &&
1592 kUint8Array == kByteArray + 2 && 1594 kUint8ArrayCid == kByteArrayCid + 2 &&
1593 kInt16Array == kByteArray + 3 && 1595 kInt16ArrayCid == kByteArrayCid + 3 &&
1594 kUint16Array == kByteArray + 4 && 1596 kUint16ArrayCid == kByteArrayCid + 4 &&
1595 kInt32Array == kByteArray + 5 && 1597 kInt32ArrayCid == kByteArrayCid + 5 &&
1596 kUint32Array == kByteArray + 6 && 1598 kUint32ArrayCid == kByteArrayCid + 6 &&
1597 kInt64Array == kByteArray + 7 && 1599 kInt64ArrayCid == kByteArrayCid + 7 &&
1598 kUint64Array == kByteArray + 8 && 1600 kUint64ArrayCid == kByteArrayCid + 8 &&
1599 kFloat32Array == kByteArray + 9 && 1601 kFloat32ArrayCid == kByteArrayCid + 9 &&
1600 kFloat64Array == kByteArray + 10 && 1602 kFloat64ArrayCid == kByteArrayCid + 10 &&
1601 kExternalInt8Array == kByteArray + 11 && 1603 kExternalInt8ArrayCid == kByteArrayCid + 11 &&
1602 kExternalUint8Array == kByteArray + 12 && 1604 kExternalUint8ArrayCid == kByteArrayCid + 12 &&
1603 kExternalInt16Array == kByteArray + 13 && 1605 kExternalInt16ArrayCid == kByteArrayCid + 13 &&
1604 kExternalUint16Array == kByteArray + 14 && 1606 kExternalUint16ArrayCid == kByteArrayCid + 14 &&
1605 kExternalInt32Array == kByteArray + 15 && 1607 kExternalInt32ArrayCid == kByteArrayCid + 15 &&
1606 kExternalUint32Array == kByteArray + 16 && 1608 kExternalUint32ArrayCid == kByteArrayCid + 16 &&
1607 kExternalInt64Array == kByteArray + 17 && 1609 kExternalInt64ArrayCid == kByteArrayCid + 17 &&
1608 kExternalUint64Array == kByteArray + 18 && 1610 kExternalUint64ArrayCid == kByteArrayCid + 18 &&
1609 kExternalFloat32Array == kByteArray + 19 && 1611 kExternalFloat32ArrayCid == kByteArrayCid + 19 &&
1610 kExternalFloat64Array == kByteArray + 20 && 1612 kExternalFloat64ArrayCid == kByteArrayCid + 20 &&
1611 kClosure == kByteArray + 21); 1613 kStacktraceCid == kByteArrayCid + 21);
1612 return (index >= kByteArray && index <= kClosure); 1614 return (index >= kByteArrayCid && index <= kExternalFloat64ArrayCid);
1613 } 1615 }
1614 1616
1615 } // namespace dart 1617 } // namespace dart
1616 1618
1617 #endif // VM_RAW_OBJECT_H_ 1619 #endif // VM_RAW_OBJECT_H_
OLDNEW
« no previous file with comments | « vm/object_test.cc ('k') | vm/raw_object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698