Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index ff67447f31a9e3db0d64ea872574fc6c06349ac9..19800c454cc8ca638fd4aa168f15a2410a3b4476 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -107,6 +107,7 @@ |
// - SeqTwoByteString |
// - SlicedString |
// - ConsString |
+// - ThinString |
// - ExternalString |
// - ExternalOneByteString |
// - ExternalTwoByteString |
@@ -324,6 +325,8 @@ const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1; |
V(ONE_BYTE_STRING_TYPE) \ |
V(CONS_STRING_TYPE) \ |
V(CONS_ONE_BYTE_STRING_TYPE) \ |
+ V(THIN_STRING_TYPE) \ |
+ V(THIN_ONE_BYTE_STRING_TYPE) \ |
V(SLICED_STRING_TYPE) \ |
V(SLICED_ONE_BYTE_STRING_TYPE) \ |
V(EXTERNAL_STRING_TYPE) \ |
@@ -524,7 +527,10 @@ const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1; |
V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \ |
ExternalTwoByteString::kShortSize, \ |
short_external_internalized_string_with_one_byte_data, \ |
- ShortExternalInternalizedStringWithOneByteData) |
+ ShortExternalInternalizedStringWithOneByteData) \ |
+ V(THIN_STRING_TYPE, ThinString::kSize, thin_string, ThinString) \ |
+ V(THIN_ONE_BYTE_STRING_TYPE, ThinString::kSize, thin_one_byte_string, \ |
+ ThinOneByteString) |
// A struct is a simple object a set of object-valued fields. Including an |
// object type in this causes the compiler to generate most of the boilerplate |
@@ -576,20 +582,21 @@ const uint32_t kIsNotInternalizedMask = 0x40; |
const uint32_t kNotInternalizedTag = 0x40; |
const uint32_t kInternalizedTag = 0x0; |
-// If bit 7 is clear then bit 2 indicates whether the string consists of |
+// If bit 7 is clear then bit 3 indicates whether the string consists of |
// two-byte characters or one-byte characters. |
-const uint32_t kStringEncodingMask = 0x4; |
+const uint32_t kStringEncodingMask = 0x8; |
const uint32_t kTwoByteStringTag = 0x0; |
-const uint32_t kOneByteStringTag = 0x4; |
+const uint32_t kOneByteStringTag = 0x8; |
-// If bit 7 is clear, the low-order 2 bits indicate the representation |
+// If bit 7 is clear, the low-order 3 bits indicate the representation |
// of the string. |
-const uint32_t kStringRepresentationMask = 0x03; |
+const uint32_t kStringRepresentationMask = 0x07; |
enum StringRepresentationTag { |
kSeqStringTag = 0x0, |
kConsStringTag = 0x1, |
kExternalStringTag = 0x2, |
- kSlicedStringTag = 0x3 |
+ kSlicedStringTag = 0x3, |
+ kThinStringTag = 0x5 |
}; |
const uint32_t kIsIndirectStringMask = 0x1; |
const uint32_t kIsIndirectStringTag = 0x1; |
@@ -599,22 +606,17 @@ STATIC_ASSERT((kConsStringTag & |
kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT |
STATIC_ASSERT((kSlicedStringTag & |
kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT |
+STATIC_ASSERT((kThinStringTag & kIsIndirectStringMask) == kIsIndirectStringTag); |
-// Use this mask to distinguish between cons and slice only after making |
-// sure that the string is one of the two (an indirect string). |
-const uint32_t kSlicedNotConsMask = kSlicedStringTag & ~kConsStringTag; |
-STATIC_ASSERT(IS_POWER_OF_TWO(kSlicedNotConsMask)); |
- |
-// If bit 7 is clear, then bit 3 indicates whether this two-byte |
+// If bit 7 is clear, then bit 4 indicates whether this two-byte |
// string actually contains one byte data. |
-const uint32_t kOneByteDataHintMask = 0x08; |
-const uint32_t kOneByteDataHintTag = 0x08; |
+const uint32_t kOneByteDataHintMask = 0x10; |
+const uint32_t kOneByteDataHintTag = 0x10; |
// If bit 7 is clear and string representation indicates an external string, |
-// then bit 4 indicates whether the data pointer is cached. |
-const uint32_t kShortExternalStringMask = 0x10; |
-const uint32_t kShortExternalStringTag = 0x10; |
- |
+// then bit 5 indicates whether the data pointer is cached. |
+const uint32_t kShortExternalStringMask = 0x20; |
+const uint32_t kShortExternalStringTag = 0x20; |
// A ConsString with an empty string as the right side is a candidate |
// for being shortcut by the garbage collector. We don't allocate any |
@@ -678,6 +680,9 @@ enum InstanceType { |
SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = |
SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | |
kNotInternalizedTag, |
+ THIN_STRING_TYPE = kTwoByteStringTag | kThinStringTag | kNotInternalizedTag, |
+ THIN_ONE_BYTE_STRING_TYPE = |
+ kOneByteStringTag | kThinStringTag | kNotInternalizedTag, |
// Non-string names |
SYMBOL_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE |
@@ -1052,6 +1057,7 @@ template <class C> inline bool Is(Object* obj); |
V(SeqTwoByteString) \ |
V(SeqOneByteString) \ |
V(InternalizedString) \ |
+ V(ThinString) \ |
V(Symbol) \ |
\ |
V(FixedTypedArrayBase) \ |
@@ -9595,6 +9601,7 @@ class StringShape BASE_EMBEDDED { |
inline bool IsExternal(); |
inline bool IsCons(); |
inline bool IsSliced(); |
+ inline bool IsThin(); |
inline bool IsIndirect(); |
inline bool IsExternalOneByte(); |
inline bool IsExternalTwoByte(); |
@@ -10307,6 +10314,27 @@ class ConsString: public String { |
DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); |
}; |
+class ThinString : public String { |
Hannes Payer (out of office)
2016/12/21 09:53:14
Please add a description what a ThinString is.
Jakob Kummerow
2017/01/04 12:45:06
Done.
|
+ public: |
+ // Actual string that this ThinString refers to. |
+ inline String* actual() const; |
+ inline void set_actual(String* s, |
+ WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
+ |
+ V8_EXPORT_PRIVATE uint16_t ThinStringGet(int index); |
+ |
+ DECLARE_CAST(ThinString) |
+ DECLARE_VERIFIER(ThinString) |
+ |
+ // Layout description. |
+ static const int kActualOffset = String::kSize; |
+ static const int kSize = kActualOffset + kPointerSize; |
+ |
+ typedef FixedBodyDescriptor<kActualOffset, kSize, kSize> BodyDescriptor; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ThinString); |
+}; |
// The Sliced String class describes strings that are substrings of another |
// sequential string. The motivation is to save time and memory when creating |