Index: src/objects.h |
=================================================================== |
--- src/objects.h (revision 654) |
+++ src/objects.h (working copy) |
@@ -595,20 +595,16 @@ |
inline bool IsHeapObject(); |
inline bool IsHeapNumber(); |
inline bool IsString(); |
+ inline bool IsSymbol(); |
inline bool IsSeqString(); |
- inline bool IsAsciiStringRepresentation(); |
- inline bool IsTwoByteStringRepresentation(); |
- inline bool IsSeqAsciiString(); |
- inline bool IsSeqTwoByteString(); |
- inline bool IsConsString(); |
inline bool IsSlicedString(); |
inline bool IsExternalString(); |
+ inline bool IsConsString(); |
+ inline bool IsExternalTwoByteString(); |
inline bool IsExternalAsciiString(); |
- inline bool IsExternalTwoByteString(); |
- inline bool IsShortString(); |
- inline bool IsMediumString(); |
- inline bool IsLongString(); |
- inline bool IsSymbol(); |
+ inline bool IsSeqTwoByteString(); |
+ inline bool IsSeqAsciiString(); |
+ |
inline bool IsNumber(); |
inline bool IsByteArray(); |
inline bool IsFailure(); |
@@ -3021,6 +3017,46 @@ |
}; |
+// The characteristics of a string are stored in its map. Retrieving these |
+// few bits of information is moderately expensive, involving two memory |
+// loads where the second is dependent on the first. To improve efficiency |
+// the shape of the string is given its own class so that it can be retrieved |
+// once and used for several string operations. A StringShape is small enough |
+// to be passed by value and is immutable, but be aware that flattening a |
+// string can potentially alter its shape. |
Mads Ager (chromium)
2008/11/03 08:45:49
Would it make sense to put in some debug code that
Erik Corry
2008/11/03 09:33:54
At the moment the flatten operation doesn't actual
|
+// |
+// Most of the methods designed to interrogate a string as to its exact nature |
+// have been made into methods on StringShape in order to encourage the use of |
+// StringShape. The String class has both a length() and a length(StringShape) |
+// operation. The former is simpler to type, but the latter is faster if you |
+// need the StringShape for some other operation immediately before or after. |
+class StringShape { |
Mads Ager (chromium)
2008/11/03 08:45:49
Are these intended to be only stack allocated? In
|
+ public: |
+ inline StringShape(String* s); |
Mads Ager (chromium)
2008/11/03 08:45:49
One-argument constructors should be explicit.
|
+ inline StringShape(Map* s); |
+ inline StringShape(InstanceType t); |
+ inline bool IsAsciiRepresentation(); |
+ inline bool IsTwoByteRepresentation(); |
+ inline bool IsSequential(); |
+ inline bool IsExternal(); |
+ inline bool IsCons(); |
+ inline bool IsSliced(); |
+ inline bool IsExternalAscii(); |
+ inline bool IsExternalTwoByte(); |
+ inline bool IsSequentialAscii(); |
+ inline bool IsSequentialTwoByte(); |
+ inline bool IsSymbol(); |
+ inline StringRepresentationTag representation_tag(); |
+ inline uint32_t full_representation_tag(); |
+ inline uint32_t size_tag(); |
+#ifdef DEBUG |
+ inline uint32_t type() { return type_; } |
+#endif |
+ private: |
+ uint32_t type_; |
+}; |
+ |
+ |
// The String abstract class captures JavaScript string values: |
// |
// Ecma-262: |
@@ -3032,6 +3068,9 @@ |
class String: public HeapObject { |
public: |
// Get and set the length of the string. |
+ // Fast version. |
+ inline int length(StringShape shape); |
+ // Easy version. |
inline int length(); |
inline void set_length(int value); |
@@ -3043,33 +3082,21 @@ |
inline void set_length_field(uint32_t value); |
// Get and set individual two byte chars in the string. |
- inline void Set(int index, uint16_t value); |
+ inline void Set(StringShape shape, int index, uint16_t value); |
// Get individual two byte char in the string. Repeated calls |
// to this method are not efficient unless the string is flat. |
- inline uint16_t Get(int index); |
+ inline uint16_t Get(StringShape shape, int index); |
// Flatten the top level ConsString that is hiding behind this |
// string. This is a no-op unless the string is a ConsString or a |
// SlicedString. Flatten mutates the ConsString and might return a |
// failure. |
- Object* Flatten(); |
+ Object* Flatten(StringShape shape); |
// Try to flatten the string. Do not allow handling of allocation |
// failures. After calling TryFlatten, the string could still be a |
// ConsString. |
- inline void TryFlatten(); |
+ inline void TryFlatten(StringShape shape); |
- // Is this string an ascii string. |
- inline bool IsAsciiRepresentation(); |
- |
- // Specialization of this function from Object that skips the |
- // string check. |
- inline bool IsSeqAsciiString(); |
- |
- // Fast testing routines that assume the receiver is a string and |
- // just check whether it is a certain kind of string. |
- inline bool StringIsSlicedString(); |
- inline bool StringIsConsString(); |
- |
Vector<const char> ToAsciiVector(); |
Vector<const uc16> ToUC16Vector(); |
@@ -3078,7 +3105,7 @@ |
bool MarkAsUndetectable(); |
// Slice the string and return a substring. |
- Object* Slice(int from, int to); |
+ Object* Slice(StringShape shape, int from, int to); |
// String equality operations. |
inline bool Equals(String* other); |
@@ -3134,24 +3161,6 @@ |
void PrintOn(FILE* out); |
- // Get the size tag. |
- inline uint32_t size_tag(); |
- static inline uint32_t map_size_tag(Map* map); |
- |
- // True if the string is a symbol. |
- inline bool is_symbol(); |
- static inline bool is_symbol_map(Map* map); |
- |
- // True if the string is ASCII. |
- inline bool is_ascii_representation(); |
- static inline bool is_ascii_representation_map(Map* map); |
- |
- // Get the representation tag. |
- inline StringRepresentationTag representation_tag(); |
- // Get the representation and ASCII tag. |
- inline int full_representation_tag(); |
- static inline StringRepresentationTag map_representation_tag(Map* map); |
- |
// For use during stack traces. Performs rudimentary sanity check. |
bool LooksValid(); |
@@ -3161,7 +3170,7 @@ |
void StringPrint(); |
void StringVerify(); |
#endif |
- inline bool IsFlat(); |
+ inline bool IsFlat(StringShape shape); |
// Layout description. |
static const int kLengthOffset = HeapObject::kHeaderSize; |
@@ -3221,6 +3230,7 @@ |
// Helper function for flattening strings. |
template <typename sinkchar> |
static void WriteToFlat(String* source, |
+ StringShape shape, |
sinkchar* sink, |
int from, |
int to); |
@@ -3261,7 +3271,9 @@ |
private: |
// Slow case of String::Equals. This implementation works on any strings |
// but it is most efficient on strings that are almost flat. |
- bool SlowEquals(String* other); |
+ bool SlowEquals(StringShape this_shape, |
+ String* other, |
+ StringShape other_shape); |
// Slow case of AsArrayIndex. |
bool SlowAsArrayIndex(uint32_t* index); |
@@ -3308,7 +3320,7 @@ |
// Garbage collection support. This method is called by the |
// garbage collector to compute the actual size of an AsciiString |
// instance. |
- inline int SeqAsciiStringSize(Map* map); |
+ inline int SeqAsciiStringSize(StringShape shape); |
// Computes the size for an AsciiString instance of a given length. |
static int SizeFor(int length) { |
@@ -3353,7 +3365,7 @@ |
// Garbage collection support. This method is called by the |
// garbage collector to compute the actual size of a TwoByteString |
// instance. |
- inline int SeqTwoByteStringSize(Map* map); |
+ inline int SeqTwoByteStringSize(StringShape shape); |
// Computes the size for a TwoByteString instance of a given length. |
static int SizeFor(int length) { |
@@ -3383,14 +3395,20 @@ |
// values in a left-to-right depth-first traversal of the tree. |
class ConsString: public String { |
public: |
- // First object of the cons cell. |
- inline Object* first(); |
- inline void set_first(Object* first, |
+ // First string of the cons cell. |
+ inline String* first(); |
+ // Doesn't check that the result is a string, even in debug mode. This is |
+ // useful during GC where the mark bits confuse the checks. |
+ inline Object* unchecked_first(); |
+ inline void set_first(String* first, |
WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
- // Second object of the cons cell. |
- inline Object* second(); |
- inline void set_second(Object* second, |
+ // Second string of the cons cell. |
+ inline String* second(); |
+ // Doesn't check that the result is a string, even in debug mode. This is |
+ // useful during GC where the mark bits confuse the checks. |
+ inline Object* unchecked_second(); |
+ inline void set_second(String* second, |
WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
// Dispatched behavior. |
@@ -3432,8 +3450,8 @@ |
class SlicedString: public String { |
public: |
// The underlying string buffer. |
- inline Object* buffer(); |
- inline void set_buffer(Object* buffer); |
+ inline String* buffer(); |
+ inline void set_buffer(String* buffer); |
// The start index of the slice. |
inline int start(); |