| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index 93f7a1d119d0f7321df3c1f42fe16bb50df2c6bb..76fc0d5b489ff18e16805012360422f144defaaf 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -5789,6 +5789,7 @@ class StringShape BASE_EMBEDDED {
|
| inline bool IsSequentialTwoByte();
|
| inline bool IsSymbol();
|
| inline StringRepresentationTag representation_tag();
|
| + inline uint32_t encoding_tag();
|
| inline uint32_t full_representation_tag();
|
| inline uint32_t size_tag();
|
| #ifdef DEBUG
|
| @@ -5820,6 +5821,51 @@ class StringShape BASE_EMBEDDED {
|
| // All string values have a length field.
|
| class String: public HeapObject {
|
| public:
|
| + // Representation of the flat content of a String.
|
| + // A non-flat string doesn't have flat content.
|
| + // A flat string has content that's encoded as a sequence of either
|
| + // ASCII chars or two-byte UC16.
|
| + // Returned by String::GetFlatContent().
|
| + class FlatContent {
|
| + public:
|
| + // Returns true if the string is flat and this structure contains content.
|
| + bool IsFlat() { return state_ != NON_FLAT; }
|
| + // Returns true if the structure contains ASCII content.
|
| + bool IsAscii() { return state_ == ASCII; }
|
| + // Returns true if the structure contains two-byte content.
|
| + bool IsTwoByte() { return state_ == TWO_BYTE; }
|
| +
|
| + // Return the ASCII content of the string. Only use if IsAscii() returns
|
| + // true.
|
| + Vector<const char> ToAsciiVector() {
|
| + ASSERT_EQ(ASCII, state_);
|
| + return Vector<const char>::cast(buffer_);
|
| + }
|
| + // Return the two-byte content of the string. Only use if IsTwoByte()
|
| + // returns true.
|
| + Vector<const uc16> ToUC16Vector() {
|
| + ASSERT_EQ(TWO_BYTE, state_);
|
| + return Vector<const uc16>::cast(buffer_);
|
| + }
|
| +
|
| + private:
|
| + enum State { NON_FLAT, ASCII, TWO_BYTE };
|
| +
|
| + // Constructors only used by String::GetFlatContent().
|
| + explicit FlatContent(Vector<const char> chars)
|
| + : buffer_(Vector<const byte>::cast(chars)),
|
| + state_(ASCII) { }
|
| + explicit FlatContent(Vector<const uc16> chars)
|
| + : buffer_(Vector<const byte>::cast(chars)),
|
| + state_(TWO_BYTE) { }
|
| + FlatContent() : buffer_(), state_(NON_FLAT) { }
|
| +
|
| + Vector<const byte> buffer_;
|
| + State state_;
|
| +
|
| + friend class String;
|
| + };
|
| +
|
| // Get and set the length of the string.
|
| inline int length();
|
| inline void set_length(int value);
|
| @@ -5831,10 +5877,10 @@ class String: public HeapObject {
|
| inline bool IsAsciiRepresentation();
|
| inline bool IsTwoByteRepresentation();
|
|
|
| - // Returns whether this string has ascii chars, i.e. all of them can
|
| - // be ascii encoded. This might be the case even if the string is
|
| + // Returns whether this string has only ASCII chars, i.e. all of them can
|
| + // be ASCII encoded. This might be the case even if the string is
|
| // two-byte. Such strings may appear when the embedder prefers
|
| - // two-byte external representations even for ascii data.
|
| + // two-byte external representations even for ASCII data.
|
| //
|
| // NOTE: this should be considered only a hint. False negatives are
|
| // possible.
|
| @@ -5868,8 +5914,12 @@ class String: public HeapObject {
|
| // string.
|
| inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED);
|
|
|
| - Vector<const char> ToAsciiVector();
|
| - Vector<const uc16> ToUC16Vector();
|
| + // Tries to return the content of a flat string as a structure holding either
|
| + // a flat vector of char or of uc16.
|
| + // If the string isn't flat, and therefore doesn't have flat content, the
|
| + // returned structure will report so, and can't provide a vector of either
|
| + // kind.
|
| + FlatContent GetFlatContent(const AssertNoAllocation& safety_promise);
|
|
|
| // Mark the string as an undetectable object. It only applies to
|
| // ascii and two byte string types.
|
|
|