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

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

Issue 11318018: - Represent strings internally in UTF-16 format, this makes it (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 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 | 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 V(TypeParameter) \ 52 V(TypeParameter) \
53 V(Number) \ 53 V(Number) \
54 V(Integer) \ 54 V(Integer) \
55 V(Smi) \ 55 V(Smi) \
56 V(Mint) \ 56 V(Mint) \
57 V(Bigint) \ 57 V(Bigint) \
58 V(Double) \ 58 V(Double) \
59 V(String) \ 59 V(String) \
60 V(OneByteString) \ 60 V(OneByteString) \
61 V(TwoByteString) \ 61 V(TwoByteString) \
62 V(FourByteString) \
63 V(ExternalOneByteString) \ 62 V(ExternalOneByteString) \
64 V(ExternalTwoByteString) \ 63 V(ExternalTwoByteString) \
65 V(ExternalFourByteString) \
66 V(Bool) \ 64 V(Bool) \
67 V(Array) \ 65 V(Array) \
68 V(ImmutableArray) \ 66 V(ImmutableArray) \
69 V(GrowableObjectArray) \ 67 V(GrowableObjectArray) \
70 V(ByteArray) \ 68 V(ByteArray) \
71 V(Int8Array) \ 69 V(Int8Array) \
72 V(Uint8Array) \ 70 V(Uint8Array) \
73 V(Int16Array) \ 71 V(Int16Array) \
74 V(Uint16Array) \ 72 V(Uint16Array) \
75 V(Int32Array) \ 73 V(Int32Array) \
(...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 class RawTwoByteString : public RawString { 1116 class RawTwoByteString : public RawString {
1119 RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString); 1117 RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString);
1120 1118
1121 // Variable length data follows here. 1119 // Variable length data follows here.
1122 uint16_t data_[0]; 1120 uint16_t data_[0];
1123 1121
1124 friend class SnapshotReader; 1122 friend class SnapshotReader;
1125 }; 1123 };
1126 1124
1127 1125
1128 class RawFourByteString : public RawString {
1129 RAW_HEAP_OBJECT_IMPLEMENTATION(FourByteString);
1130
1131 // Variable length data follows here.
1132 uint32_t data_[0];
1133
1134 friend class SnapshotReader;
1135 };
1136
1137
1138 template<typename T> 1126 template<typename T>
1139 class ExternalStringData { 1127 class ExternalStringData {
1140 public: 1128 public:
1141 ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) : 1129 ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) :
1142 data_(data), peer_(peer), callback_(callback) { 1130 data_(data), peer_(peer), callback_(callback) {
1143 } 1131 }
1144 ~ExternalStringData() { 1132 ~ExternalStringData() {
1145 if (callback_ != NULL) (*callback_)(peer_); 1133 if (callback_ != NULL) (*callback_)(peer_);
1146 } 1134 }
1147 1135
(...skipping 20 matching lines...) Expand all
1168 1156
1169 1157
1170 class RawExternalTwoByteString : public RawString { 1158 class RawExternalTwoByteString : public RawString {
1171 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString); 1159 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString);
1172 1160
1173 ExternalStringData<uint16_t>* external_data_; 1161 ExternalStringData<uint16_t>* external_data_;
1174 friend class Api; 1162 friend class Api;
1175 }; 1163 };
1176 1164
1177 1165
1178 class RawExternalFourByteString : public RawString {
1179 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalFourByteString);
1180
1181 ExternalStringData<uint32_t>* external_data_;
1182 friend class Api;
1183 };
1184
1185
1186 class RawBool : public RawInstance { 1166 class RawBool : public RawInstance {
1187 RAW_HEAP_OBJECT_IMPLEMENTATION(Bool); 1167 RAW_HEAP_OBJECT_IMPLEMENTATION(Bool);
1188 1168
1189 bool value_; 1169 bool value_;
1190 }; 1170 };
1191 1171
1192 1172
1193 class RawArray : public RawInstance { 1173 class RawArray : public RawInstance {
1194 RAW_HEAP_OBJECT_IMPLEMENTATION(Array); 1174 RAW_HEAP_OBJECT_IMPLEMENTATION(Array);
1195 1175
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
1466 return reinterpret_cast<RawObject**>(&ptr()->pattern_); 1446 return reinterpret_cast<RawObject**>(&ptr()->pattern_);
1467 } 1447 }
1468 1448
1469 intptr_t type_; // Uninitialized, simple or complex. 1449 intptr_t type_; // Uninitialized, simple or complex.
1470 intptr_t flags_; // Represents global/local, case insensitive, multiline. 1450 intptr_t flags_; // Represents global/local, case insensitive, multiline.
1471 1451
1472 // Variable length data follows here. 1452 // Variable length data follows here.
1473 uint8_t data_[0]; 1453 uint8_t data_[0];
1474 }; 1454 };
1475 1455
1456
1476 class RawWeakProperty : public RawInstance { 1457 class RawWeakProperty : public RawInstance {
1477 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); 1458 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
1478 1459
1479 RawObject** from() { 1460 RawObject** from() {
1480 return reinterpret_cast<RawObject**>(&ptr()->key_); 1461 return reinterpret_cast<RawObject**>(&ptr()->key_);
1481 } 1462 }
1482 RawObject* key_; 1463 RawObject* key_;
1483 RawObject* value_; 1464 RawObject* value_;
1484 RawObject** to() { 1465 RawObject** to() {
1485 return reinterpret_cast<RawObject**>(&ptr()->value_); 1466 return reinterpret_cast<RawObject**>(&ptr()->value_);
1486 } 1467 }
1487 1468
1488 friend class GCMarker; 1469 friend class GCMarker;
1489 friend class MarkingVisitor; 1470 friend class MarkingVisitor;
1490 friend class Scavenger; 1471 friend class Scavenger;
1491 friend class ScavengerVisitor; 1472 friend class ScavengerVisitor;
1492 }; 1473 };
1493 1474
1475
1494 // Class Id predicates. 1476 // Class Id predicates.
1495 1477
1496 inline bool RawObject::IsErrorClassId(intptr_t index) { 1478 inline bool RawObject::IsErrorClassId(intptr_t index) {
1497 // Make sure this function is updated when new Error types are added. 1479 // Make sure this function is updated when new Error types are added.
1498 ASSERT(kApiErrorCid == kErrorCid + 1 && 1480 ASSERT(kApiErrorCid == kErrorCid + 1 &&
1499 kLanguageErrorCid == kErrorCid + 2 && 1481 kLanguageErrorCid == kErrorCid + 2 &&
1500 kUnhandledExceptionCid == kErrorCid + 3 && 1482 kUnhandledExceptionCid == kErrorCid + 3 &&
1501 kUnwindErrorCid == kErrorCid + 4 && 1483 kUnwindErrorCid == kErrorCid + 4 &&
1502 kInstanceCid == kErrorCid + 5); 1484 kInstanceCid == kErrorCid + 5);
1503 return (index >= kErrorCid && index < kInstanceCid); 1485 return (index >= kErrorCid && index < kInstanceCid);
1504 } 1486 }
1505 1487
1488
1506 inline bool RawObject::IsNumberClassId(intptr_t index) { 1489 inline bool RawObject::IsNumberClassId(intptr_t index) {
1507 // Make sure this function is updated when new Number types are added. 1490 // Make sure this function is updated when new Number types are added.
1508 ASSERT(kIntegerCid == kNumberCid + 1 && 1491 ASSERT(kIntegerCid == kNumberCid + 1 &&
1509 kSmiCid == kNumberCid + 2 && 1492 kSmiCid == kNumberCid + 2 &&
1510 kMintCid == kNumberCid + 3 && 1493 kMintCid == kNumberCid + 3 &&
1511 kBigintCid == kNumberCid + 4 && 1494 kBigintCid == kNumberCid + 4 &&
1512 kDoubleCid == kNumberCid + 5 && 1495 kDoubleCid == kNumberCid + 5 &&
1513 kStringCid == kNumberCid + 6); 1496 kStringCid == kNumberCid + 6);
1514 return (index >= kNumberCid && index < kStringCid); 1497 return (index >= kNumberCid && index < kStringCid);
1515 } 1498 }
1516 1499
1500
1517 inline bool RawObject::IsIntegerClassId(intptr_t index) { 1501 inline bool RawObject::IsIntegerClassId(intptr_t index) {
1518 // Make sure this function is updated when new Integer types are added. 1502 // Make sure this function is updated when new Integer types are added.
1519 ASSERT(kSmiCid == kIntegerCid + 1 && 1503 ASSERT(kSmiCid == kIntegerCid + 1 &&
1520 kMintCid == kIntegerCid + 2 && 1504 kMintCid == kIntegerCid + 2 &&
1521 kBigintCid == kIntegerCid + 3 && 1505 kBigintCid == kIntegerCid + 3 &&
1522 kDoubleCid == kIntegerCid + 4); 1506 kDoubleCid == kIntegerCid + 4);
1523 return (index >= kIntegerCid && index < kDoubleCid); 1507 return (index >= kIntegerCid && index < kDoubleCid);
1524 } 1508 }
1525 1509
1510
1526 inline bool RawObject::IsStringClassId(intptr_t index) { 1511 inline bool RawObject::IsStringClassId(intptr_t index) {
1527 // Make sure this function is updated when new StringCid types are added. 1512 // Make sure this function is updated when new StringCid types are added.
1528 ASSERT(kOneByteStringCid == kStringCid + 1 && 1513 ASSERT(kOneByteStringCid == kStringCid + 1 &&
1529 kTwoByteStringCid == kStringCid + 2 && 1514 kTwoByteStringCid == kStringCid + 2 &&
1530 kFourByteStringCid == kStringCid + 3 && 1515 kExternalOneByteStringCid == kStringCid + 3 &&
1531 kExternalOneByteStringCid == kStringCid + 4 && 1516 kExternalTwoByteStringCid == kStringCid + 4 &&
1532 kExternalTwoByteStringCid == kStringCid + 5 && 1517 kBoolCid == kStringCid + 5);
1533 kExternalFourByteStringCid == kStringCid + 6 &&
1534 kBoolCid == kStringCid + 7);
1535 return (index >= kStringCid && index < kBoolCid); 1518 return (index >= kStringCid && index < kBoolCid);
1536 } 1519 }
1537 1520
1521
1538 inline bool RawObject::IsOneByteStringClassId(intptr_t index) { 1522 inline bool RawObject::IsOneByteStringClassId(intptr_t index) {
1539 // Make sure this function is updated when new StringCid types are added. 1523 // Make sure this function is updated when new StringCid types are added.
1540 ASSERT(kOneByteStringCid == kStringCid + 1 && 1524 ASSERT(kOneByteStringCid == kStringCid + 1 &&
1541 kTwoByteStringCid == kStringCid + 2 && 1525 kTwoByteStringCid == kStringCid + 2 &&
1542 kFourByteStringCid == kStringCid + 3 && 1526 kExternalOneByteStringCid == kStringCid + 3 &&
1543 kExternalOneByteStringCid == kStringCid + 4 && 1527 kExternalTwoByteStringCid == kStringCid + 4 &&
1544 kExternalTwoByteStringCid == kStringCid + 5 && 1528 kBoolCid == kStringCid + 5);
1545 kExternalFourByteStringCid == kStringCid + 6 &&
1546 kBoolCid == kStringCid + 7);
1547 return (index == kOneByteStringCid || index == kExternalOneByteStringCid); 1529 return (index == kOneByteStringCid || index == kExternalOneByteStringCid);
1548 } 1530 }
1549 1531
1532
1550 inline bool RawObject::IsTwoByteStringClassId(intptr_t index) { 1533 inline bool RawObject::IsTwoByteStringClassId(intptr_t index) {
1551 // Make sure this function is updated when new StringCid types are added. 1534 // Make sure this function is updated when new StringCid types are added.
1552 ASSERT(kOneByteStringCid == kStringCid + 1 && 1535 ASSERT(kOneByteStringCid == kStringCid + 1 &&
1553 kTwoByteStringCid == kStringCid + 2 && 1536 kTwoByteStringCid == kStringCid + 2 &&
1554 kFourByteStringCid == kStringCid + 3 && 1537 kExternalOneByteStringCid == kStringCid + 3 &&
1555 kExternalOneByteStringCid == kStringCid + 4 && 1538 kExternalTwoByteStringCid == kStringCid + 4 &&
1556 kExternalTwoByteStringCid == kStringCid + 5 && 1539 kBoolCid == kStringCid + 5);
1557 kExternalFourByteStringCid == kStringCid + 6 &&
1558 kBoolCid == kStringCid + 7);
1559 return (index == kOneByteStringCid || 1540 return (index == kOneByteStringCid ||
1560 index == kTwoByteStringCid || 1541 index == kTwoByteStringCid ||
1561 index == kExternalOneByteStringCid || 1542 index == kExternalOneByteStringCid ||
1562 index == kExternalTwoByteStringCid); 1543 index == kExternalTwoByteStringCid);
1563 } 1544 }
1564 1545
1546
1565 inline bool RawObject::IsExternalStringClassId(intptr_t index) { 1547 inline bool RawObject::IsExternalStringClassId(intptr_t index) {
1566 // Make sure this function is updated when new StringCid types are added. 1548 // Make sure this function is updated when new StringCid types are added.
1567 ASSERT(kOneByteStringCid == kStringCid + 1 && 1549 ASSERT(kOneByteStringCid == kStringCid + 1 &&
1568 kTwoByteStringCid == kStringCid + 2 && 1550 kTwoByteStringCid == kStringCid + 2 &&
1569 kFourByteStringCid == kStringCid + 3 && 1551 kExternalOneByteStringCid == kStringCid + 3 &&
1570 kExternalOneByteStringCid == kStringCid + 4 && 1552 kExternalTwoByteStringCid == kStringCid + 4 &&
1571 kExternalTwoByteStringCid == kStringCid + 5 && 1553 kBoolCid == kStringCid + 5);
1572 kExternalFourByteStringCid == kStringCid + 6 &&
1573 kBoolCid == kStringCid + 7);
1574 return (index == kExternalOneByteStringCid || 1554 return (index == kExternalOneByteStringCid ||
1575 index == kExternalTwoByteStringCid || 1555 index == kExternalTwoByteStringCid);
1576 index == kExternalFourByteStringCid);
1577 } 1556 }
1578 1557
1558
1579 inline bool RawObject::IsBuiltinListClassId(intptr_t index) { 1559 inline bool RawObject::IsBuiltinListClassId(intptr_t index) {
1580 // Make sure this function is updated when new builtin List types are added. 1560 // Make sure this function is updated when new builtin List types are added.
1581 ASSERT(kImmutableArrayCid == kArrayCid + 1 && 1561 ASSERT(kImmutableArrayCid == kArrayCid + 1 &&
1582 kGrowableObjectArrayCid == kArrayCid + 2 && 1562 kGrowableObjectArrayCid == kArrayCid + 2 &&
1583 kByteArrayCid == kArrayCid + 3); 1563 kByteArrayCid == kArrayCid + 3);
1584 return (index >= kArrayCid && index < kByteArrayCid) || 1564 return (index >= kArrayCid && index < kByteArrayCid) ||
1585 IsByteArrayClassId(index); 1565 IsByteArrayClassId(index);
1586 } 1566 }
1587 1567
1568
1588 inline bool RawObject::IsByteArrayClassId(intptr_t index) { 1569 inline bool RawObject::IsByteArrayClassId(intptr_t index) {
1589 // Make sure this function is updated when new ByteArray types are added. 1570 // Make sure this function is updated when new ByteArray types are added.
1590 ASSERT(kInt8ArrayCid == kByteArrayCid + 1 && 1571 ASSERT(kInt8ArrayCid == kByteArrayCid + 1 &&
1591 kUint8ArrayCid == kByteArrayCid + 2 && 1572 kUint8ArrayCid == kByteArrayCid + 2 &&
1592 kInt16ArrayCid == kByteArrayCid + 3 && 1573 kInt16ArrayCid == kByteArrayCid + 3 &&
1593 kUint16ArrayCid == kByteArrayCid + 4 && 1574 kUint16ArrayCid == kByteArrayCid + 4 &&
1594 kInt32ArrayCid == kByteArrayCid + 5 && 1575 kInt32ArrayCid == kByteArrayCid + 5 &&
1595 kUint32ArrayCid == kByteArrayCid + 6 && 1576 kUint32ArrayCid == kByteArrayCid + 6 &&
1596 kInt64ArrayCid == kByteArrayCid + 7 && 1577 kInt64ArrayCid == kByteArrayCid + 7 &&
1597 kUint64ArrayCid == kByteArrayCid + 8 && 1578 kUint64ArrayCid == kByteArrayCid + 8 &&
1598 kFloat32ArrayCid == kByteArrayCid + 9 && 1579 kFloat32ArrayCid == kByteArrayCid + 9 &&
1599 kFloat64ArrayCid == kByteArrayCid + 10 && 1580 kFloat64ArrayCid == kByteArrayCid + 10 &&
1600 kExternalInt8ArrayCid == kByteArrayCid + 11 && 1581 kExternalInt8ArrayCid == kByteArrayCid + 11 &&
1601 kExternalUint8ArrayCid == kByteArrayCid + 12 && 1582 kExternalUint8ArrayCid == kByteArrayCid + 12 &&
1602 kExternalInt16ArrayCid == kByteArrayCid + 13 && 1583 kExternalInt16ArrayCid == kByteArrayCid + 13 &&
1603 kExternalUint16ArrayCid == kByteArrayCid + 14 && 1584 kExternalUint16ArrayCid == kByteArrayCid + 14 &&
1604 kExternalInt32ArrayCid == kByteArrayCid + 15 && 1585 kExternalInt32ArrayCid == kByteArrayCid + 15 &&
1605 kExternalUint32ArrayCid == kByteArrayCid + 16 && 1586 kExternalUint32ArrayCid == kByteArrayCid + 16 &&
1606 kExternalInt64ArrayCid == kByteArrayCid + 17 && 1587 kExternalInt64ArrayCid == kByteArrayCid + 17 &&
1607 kExternalUint64ArrayCid == kByteArrayCid + 18 && 1588 kExternalUint64ArrayCid == kByteArrayCid + 18 &&
1608 kExternalFloat32ArrayCid == kByteArrayCid + 19 && 1589 kExternalFloat32ArrayCid == kByteArrayCid + 19 &&
1609 kExternalFloat64ArrayCid == kByteArrayCid + 20 && 1590 kExternalFloat64ArrayCid == kByteArrayCid + 20 &&
1610 kStacktraceCid == kByteArrayCid + 21); 1591 kStacktraceCid == kByteArrayCid + 21);
1611 return (index >= kByteArrayCid && index <= kExternalFloat64ArrayCid); 1592 return (index >= kByteArrayCid && index <= kExternalFloat64ArrayCid);
1612 } 1593 }
1613 1594
1614 } // namespace dart 1595 } // namespace dart
1615 1596
1616 #endif // VM_RAW_OBJECT_H_ 1597 #endif // VM_RAW_OBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698