Index: src/objects.h |
=================================================================== |
--- src/objects.h (revision 3336) |
+++ src/objects.h (working copy) |
@@ -221,248 +221,128 @@ |
// NOTE: Everything following JS_VALUE_TYPE is considered a |
// JSObject for GC purposes. The first four entries here have typeof |
// 'object', whereas JS_FUNCTION_TYPE has typeof 'function'. |
-#define INSTANCE_TYPE_LIST_ALL(V) \ |
- V(SHORT_SYMBOL_TYPE) \ |
- V(MEDIUM_SYMBOL_TYPE) \ |
- V(LONG_SYMBOL_TYPE) \ |
- V(SHORT_ASCII_SYMBOL_TYPE) \ |
- V(MEDIUM_ASCII_SYMBOL_TYPE) \ |
- V(LONG_ASCII_SYMBOL_TYPE) \ |
- V(SHORT_CONS_SYMBOL_TYPE) \ |
- V(MEDIUM_CONS_SYMBOL_TYPE) \ |
- V(LONG_CONS_SYMBOL_TYPE) \ |
- V(SHORT_CONS_ASCII_SYMBOL_TYPE) \ |
- V(MEDIUM_CONS_ASCII_SYMBOL_TYPE) \ |
- V(LONG_CONS_ASCII_SYMBOL_TYPE) \ |
- V(SHORT_EXTERNAL_SYMBOL_TYPE) \ |
- V(MEDIUM_EXTERNAL_SYMBOL_TYPE) \ |
- V(LONG_EXTERNAL_SYMBOL_TYPE) \ |
- V(SHORT_EXTERNAL_ASCII_SYMBOL_TYPE) \ |
- V(MEDIUM_EXTERNAL_ASCII_SYMBOL_TYPE) \ |
- V(LONG_EXTERNAL_ASCII_SYMBOL_TYPE) \ |
- V(SHORT_STRING_TYPE) \ |
- V(MEDIUM_STRING_TYPE) \ |
- V(LONG_STRING_TYPE) \ |
- V(SHORT_ASCII_STRING_TYPE) \ |
- V(MEDIUM_ASCII_STRING_TYPE) \ |
- V(LONG_ASCII_STRING_TYPE) \ |
- V(SHORT_CONS_STRING_TYPE) \ |
- V(MEDIUM_CONS_STRING_TYPE) \ |
- V(LONG_CONS_STRING_TYPE) \ |
- V(SHORT_CONS_ASCII_STRING_TYPE) \ |
- V(MEDIUM_CONS_ASCII_STRING_TYPE) \ |
- V(LONG_CONS_ASCII_STRING_TYPE) \ |
- V(SHORT_EXTERNAL_STRING_TYPE) \ |
- V(MEDIUM_EXTERNAL_STRING_TYPE) \ |
- V(LONG_EXTERNAL_STRING_TYPE) \ |
- V(SHORT_EXTERNAL_ASCII_STRING_TYPE) \ |
- V(MEDIUM_EXTERNAL_ASCII_STRING_TYPE) \ |
- V(LONG_EXTERNAL_ASCII_STRING_TYPE) \ |
- V(LONG_PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \ |
- \ |
- V(MAP_TYPE) \ |
- V(HEAP_NUMBER_TYPE) \ |
- V(FIXED_ARRAY_TYPE) \ |
- V(CODE_TYPE) \ |
- V(JS_GLOBAL_PROPERTY_CELL_TYPE) \ |
- V(ODDBALL_TYPE) \ |
- V(PROXY_TYPE) \ |
- V(BYTE_ARRAY_TYPE) \ |
- V(PIXEL_ARRAY_TYPE) \ |
- /* Note: the order of these external array */ \ |
- /* types is relied upon in */ \ |
- /* Object::IsExternalArray(). */ \ |
- V(EXTERNAL_BYTE_ARRAY_TYPE) \ |
- V(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) \ |
- V(EXTERNAL_SHORT_ARRAY_TYPE) \ |
- V(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) \ |
- V(EXTERNAL_INT_ARRAY_TYPE) \ |
- V(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) \ |
- V(EXTERNAL_FLOAT_ARRAY_TYPE) \ |
- V(FILLER_TYPE) \ |
- \ |
- V(ACCESSOR_INFO_TYPE) \ |
- V(ACCESS_CHECK_INFO_TYPE) \ |
- V(INTERCEPTOR_INFO_TYPE) \ |
- V(SHARED_FUNCTION_INFO_TYPE) \ |
- V(CALL_HANDLER_INFO_TYPE) \ |
- V(FUNCTION_TEMPLATE_INFO_TYPE) \ |
- V(OBJECT_TEMPLATE_INFO_TYPE) \ |
- V(SIGNATURE_INFO_TYPE) \ |
- V(TYPE_SWITCH_INFO_TYPE) \ |
- V(SCRIPT_TYPE) \ |
- \ |
- V(JS_VALUE_TYPE) \ |
- V(JS_OBJECT_TYPE) \ |
- V(JS_CONTEXT_EXTENSION_OBJECT_TYPE) \ |
- V(JS_GLOBAL_OBJECT_TYPE) \ |
- V(JS_BUILTINS_OBJECT_TYPE) \ |
- V(JS_GLOBAL_PROXY_TYPE) \ |
- V(JS_ARRAY_TYPE) \ |
- V(JS_REGEXP_TYPE) \ |
- \ |
- V(JS_FUNCTION_TYPE) \ |
+#define INSTANCE_TYPE_LIST_ALL(V) \ |
+ V(SYMBOL_TYPE) \ |
+ V(ASCII_SYMBOL_TYPE) \ |
+ V(CONS_SYMBOL_TYPE) \ |
+ V(CONS_ASCII_SYMBOL_TYPE) \ |
+ V(EXTERNAL_SYMBOL_TYPE) \ |
+ V(EXTERNAL_ASCII_SYMBOL_TYPE) \ |
+ V(STRING_TYPE) \ |
+ V(ASCII_STRING_TYPE) \ |
+ V(CONS_STRING_TYPE) \ |
+ V(CONS_ASCII_STRING_TYPE) \ |
+ V(EXTERNAL_STRING_TYPE) \ |
+ V(EXTERNAL_ASCII_STRING_TYPE) \ |
+ V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \ |
+ \ |
+ V(MAP_TYPE) \ |
+ V(HEAP_NUMBER_TYPE) \ |
+ V(FIXED_ARRAY_TYPE) \ |
+ V(CODE_TYPE) \ |
+ V(JS_GLOBAL_PROPERTY_CELL_TYPE) \ |
+ V(ODDBALL_TYPE) \ |
+ V(PROXY_TYPE) \ |
+ V(BYTE_ARRAY_TYPE) \ |
+ V(PIXEL_ARRAY_TYPE) \ |
+ /* Note: the order of these external array */ \ |
+ /* types is relied upon in */ \ |
+ /* Object::IsExternalArray(). */ \ |
+ V(EXTERNAL_BYTE_ARRAY_TYPE) \ |
+ V(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) \ |
+ V(EXTERNAL_SHORT_ARRAY_TYPE) \ |
+ V(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) \ |
+ V(EXTERNAL_INT_ARRAY_TYPE) \ |
+ V(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) \ |
+ V(EXTERNAL_FLOAT_ARRAY_TYPE) \ |
+ V(FILLER_TYPE) \ |
+ \ |
+ V(ACCESSOR_INFO_TYPE) \ |
+ V(ACCESS_CHECK_INFO_TYPE) \ |
+ V(INTERCEPTOR_INFO_TYPE) \ |
+ V(SHARED_FUNCTION_INFO_TYPE) \ |
+ V(CALL_HANDLER_INFO_TYPE) \ |
+ V(FUNCTION_TEMPLATE_INFO_TYPE) \ |
+ V(OBJECT_TEMPLATE_INFO_TYPE) \ |
+ V(SIGNATURE_INFO_TYPE) \ |
+ V(TYPE_SWITCH_INFO_TYPE) \ |
+ V(SCRIPT_TYPE) \ |
+ \ |
+ V(JS_VALUE_TYPE) \ |
+ V(JS_OBJECT_TYPE) \ |
+ V(JS_CONTEXT_EXTENSION_OBJECT_TYPE) \ |
+ V(JS_GLOBAL_OBJECT_TYPE) \ |
+ V(JS_BUILTINS_OBJECT_TYPE) \ |
+ V(JS_GLOBAL_PROXY_TYPE) \ |
+ V(JS_ARRAY_TYPE) \ |
+ V(JS_REGEXP_TYPE) \ |
+ \ |
+ V(JS_FUNCTION_TYPE) \ |
#ifdef ENABLE_DEBUGGER_SUPPORT |
-#define INSTANCE_TYPE_LIST_DEBUGGER(V) \ |
- V(DEBUG_INFO_TYPE) \ |
+#define INSTANCE_TYPE_LIST_DEBUGGER(V) \ |
+ V(DEBUG_INFO_TYPE) \ |
V(BREAK_POINT_INFO_TYPE) |
#else |
#define INSTANCE_TYPE_LIST_DEBUGGER(V) |
#endif |
-#define INSTANCE_TYPE_LIST(V) \ |
- INSTANCE_TYPE_LIST_ALL(V) \ |
+#define INSTANCE_TYPE_LIST(V) \ |
+ INSTANCE_TYPE_LIST_ALL(V) \ |
INSTANCE_TYPE_LIST_DEBUGGER(V) |
// Since string types are not consecutive, this macro is used to |
// iterate over them. |
#define STRING_TYPE_LIST(V) \ |
- V(SHORT_SYMBOL_TYPE, \ |
+ V(SYMBOL_TYPE, \ |
SeqTwoByteString::kAlignedSize, \ |
- short_symbol, \ |
- ShortSymbol) \ |
- V(MEDIUM_SYMBOL_TYPE, \ |
- SeqTwoByteString::kAlignedSize, \ |
- medium_symbol, \ |
- MediumSymbol) \ |
- V(LONG_SYMBOL_TYPE, \ |
- SeqTwoByteString::kAlignedSize, \ |
- long_symbol, \ |
- LongSymbol) \ |
- V(SHORT_ASCII_SYMBOL_TYPE, \ |
+ symbol, \ |
+ Symbol) \ |
+ V(ASCII_SYMBOL_TYPE, \ |
SeqAsciiString::kAlignedSize, \ |
- short_ascii_symbol, \ |
- ShortAsciiSymbol) \ |
- V(MEDIUM_ASCII_SYMBOL_TYPE, \ |
- SeqAsciiString::kAlignedSize, \ |
- medium_ascii_symbol, \ |
- MediumAsciiSymbol) \ |
- V(LONG_ASCII_SYMBOL_TYPE, \ |
- SeqAsciiString::kAlignedSize, \ |
- long_ascii_symbol, \ |
- LongAsciiSymbol) \ |
- V(SHORT_CONS_SYMBOL_TYPE, \ |
+ ascii_symbol, \ |
+ AsciiSymbol) \ |
+ V(CONS_SYMBOL_TYPE, \ |
ConsString::kSize, \ |
- short_cons_symbol, \ |
- ShortConsSymbol) \ |
- V(MEDIUM_CONS_SYMBOL_TYPE, \ |
+ cons_symbol, \ |
+ ConsSymbol) \ |
+ V(CONS_ASCII_SYMBOL_TYPE, \ |
ConsString::kSize, \ |
- medium_cons_symbol, \ |
- MediumConsSymbol) \ |
- V(LONG_CONS_SYMBOL_TYPE, \ |
- ConsString::kSize, \ |
- long_cons_symbol, \ |
- LongConsSymbol) \ |
- V(SHORT_CONS_ASCII_SYMBOL_TYPE, \ |
- ConsString::kSize, \ |
- short_cons_ascii_symbol, \ |
- ShortConsAsciiSymbol) \ |
- V(MEDIUM_CONS_ASCII_SYMBOL_TYPE, \ |
- ConsString::kSize, \ |
- medium_cons_ascii_symbol, \ |
- MediumConsAsciiSymbol) \ |
- V(LONG_CONS_ASCII_SYMBOL_TYPE, \ |
- ConsString::kSize, \ |
- long_cons_ascii_symbol, \ |
- LongConsAsciiSymbol) \ |
- V(SHORT_EXTERNAL_SYMBOL_TYPE, \ |
+ cons_ascii_symbol, \ |
+ ConsAsciiSymbol) \ |
+ V(EXTERNAL_SYMBOL_TYPE, \ |
ExternalTwoByteString::kSize, \ |
- short_external_symbol, \ |
- ShortExternalSymbol) \ |
- V(MEDIUM_EXTERNAL_SYMBOL_TYPE, \ |
- ExternalTwoByteString::kSize, \ |
- medium_external_symbol, \ |
- MediumExternalSymbol) \ |
- V(LONG_EXTERNAL_SYMBOL_TYPE, \ |
- ExternalTwoByteString::kSize, \ |
- long_external_symbol, \ |
- LongExternalSymbol) \ |
- V(SHORT_EXTERNAL_ASCII_SYMBOL_TYPE, \ |
+ external_symbol, \ |
+ ExternalSymbol) \ |
+ V(EXTERNAL_ASCII_SYMBOL_TYPE, \ |
ExternalAsciiString::kSize, \ |
- short_external_ascii_symbol, \ |
- ShortExternalAsciiSymbol) \ |
- V(MEDIUM_EXTERNAL_ASCII_SYMBOL_TYPE, \ |
- ExternalAsciiString::kSize, \ |
- medium_external_ascii_symbol, \ |
- MediumExternalAsciiSymbol) \ |
- V(LONG_EXTERNAL_ASCII_SYMBOL_TYPE, \ |
- ExternalAsciiString::kSize, \ |
- long_external_ascii_symbol, \ |
- LongExternalAsciiSymbol) \ |
- V(SHORT_STRING_TYPE, \ |
+ external_ascii_symbol, \ |
+ ExternalAsciiSymbol) \ |
+ V(STRING_TYPE, \ |
SeqTwoByteString::kAlignedSize, \ |
- short_string, \ |
- ShortString) \ |
- V(MEDIUM_STRING_TYPE, \ |
- SeqTwoByteString::kAlignedSize, \ |
- medium_string, \ |
- MediumString) \ |
- V(LONG_STRING_TYPE, \ |
- SeqTwoByteString::kAlignedSize, \ |
- long_string, \ |
- LongString) \ |
- V(SHORT_ASCII_STRING_TYPE, \ |
+ string, \ |
+ String) \ |
+ V(ASCII_STRING_TYPE, \ |
SeqAsciiString::kAlignedSize, \ |
- short_ascii_string, \ |
- ShortAsciiString) \ |
- V(MEDIUM_ASCII_STRING_TYPE, \ |
- SeqAsciiString::kAlignedSize, \ |
- medium_ascii_string, \ |
- MediumAsciiString) \ |
- V(LONG_ASCII_STRING_TYPE, \ |
- SeqAsciiString::kAlignedSize, \ |
- long_ascii_string, \ |
- LongAsciiString) \ |
- V(SHORT_CONS_STRING_TYPE, \ |
+ ascii_string, \ |
+ AsciiString) \ |
+ V(CONS_STRING_TYPE, \ |
ConsString::kSize, \ |
- short_cons_string, \ |
- ShortConsString) \ |
- V(MEDIUM_CONS_STRING_TYPE, \ |
+ cons_string, \ |
+ ConsString) \ |
+ V(CONS_ASCII_STRING_TYPE, \ |
ConsString::kSize, \ |
- medium_cons_string, \ |
- MediumConsString) \ |
- V(LONG_CONS_STRING_TYPE, \ |
- ConsString::kSize, \ |
- long_cons_string, \ |
- LongConsString) \ |
- V(SHORT_CONS_ASCII_STRING_TYPE, \ |
- ConsString::kSize, \ |
- short_cons_ascii_string, \ |
- ShortConsAsciiString) \ |
- V(MEDIUM_CONS_ASCII_STRING_TYPE, \ |
- ConsString::kSize, \ |
- medium_cons_ascii_string, \ |
- MediumConsAsciiString) \ |
- V(LONG_CONS_ASCII_STRING_TYPE, \ |
- ConsString::kSize, \ |
- long_cons_ascii_string, \ |
- LongConsAsciiString) \ |
- V(SHORT_EXTERNAL_STRING_TYPE, \ |
+ cons_ascii_string, \ |
+ ConsAsciiString) \ |
+ V(EXTERNAL_STRING_TYPE, \ |
ExternalTwoByteString::kSize, \ |
- short_external_string, \ |
- ShortExternalString) \ |
- V(MEDIUM_EXTERNAL_STRING_TYPE, \ |
- ExternalTwoByteString::kSize, \ |
- medium_external_string, \ |
- MediumExternalString) \ |
- V(LONG_EXTERNAL_STRING_TYPE, \ |
- ExternalTwoByteString::kSize, \ |
- long_external_string, \ |
- LongExternalString) \ |
- V(SHORT_EXTERNAL_ASCII_STRING_TYPE, \ |
+ external_string, \ |
+ ExternalString) \ |
+ V(EXTERNAL_ASCII_STRING_TYPE, \ |
ExternalAsciiString::kSize, \ |
- short_external_ascii_string, \ |
- ShortExternalAsciiString) \ |
- V(MEDIUM_EXTERNAL_ASCII_STRING_TYPE, \ |
- ExternalAsciiString::kSize, \ |
- medium_external_ascii_string, \ |
- MediumExternalAsciiString) \ |
- V(LONG_EXTERNAL_ASCII_STRING_TYPE, \ |
- ExternalAsciiString::kSize, \ |
- long_external_ascii_string, \ |
- LongExternalAsciiString) |
+ external_ascii_string, \ |
+ ExternalAsciiString) \ |
// 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 |
@@ -473,27 +353,27 @@ |
// Note that for subtle reasons related to the ordering or numerical values of |
// type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST |
// manually. |
-#define STRUCT_LIST_ALL(V) \ |
- V(ACCESSOR_INFO, AccessorInfo, accessor_info) \ |
- V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ |
- V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ |
- V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \ |
- V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \ |
- V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \ |
- V(SIGNATURE_INFO, SignatureInfo, signature_info) \ |
- V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info) \ |
+#define STRUCT_LIST_ALL(V) \ |
+ V(ACCESSOR_INFO, AccessorInfo, accessor_info) \ |
+ V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ |
+ V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ |
+ V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \ |
+ V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \ |
+ V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \ |
+ V(SIGNATURE_INFO, SignatureInfo, signature_info) \ |
+ V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info) \ |
V(SCRIPT, Script, script) |
#ifdef ENABLE_DEBUGGER_SUPPORT |
-#define STRUCT_LIST_DEBUGGER(V) \ |
- V(DEBUG_INFO, DebugInfo, debug_info) \ |
+#define STRUCT_LIST_DEBUGGER(V) \ |
+ V(DEBUG_INFO, DebugInfo, debug_info) \ |
V(BREAK_POINT_INFO, BreakPointInfo, break_point_info) |
#else |
#define STRUCT_LIST_DEBUGGER(V) |
#endif |
-#define STRUCT_LIST(V) \ |
- STRUCT_LIST_ALL(V) \ |
+#define STRUCT_LIST(V) \ |
+ STRUCT_LIST_ALL(V) \ |
STRUCT_LIST_DEBUGGER(V) |
// We use the full 8 bits of the instance_type field to encode heap object |
@@ -509,15 +389,6 @@ |
const uint32_t kNotSymbolTag = 0x0; |
const uint32_t kSymbolTag = 0x20; |
-// If bit 7 is clear, bits 3 and 4 are the string's size (short, medium or |
-// long). These values are very special in that they are also used to shift |
-// the length field to get the length, removing the hash value. This avoids |
-// using if or switch when getting the length of a string. |
-const uint32_t kStringSizeMask = 0x18; |
-const uint32_t kShortStringTag = 0x18; |
-const uint32_t kMediumStringTag = 0x10; |
-const uint32_t kLongStringTag = 0x00; |
- |
// If bit 7 is clear then bit 2 indicates whether the string consists of |
// two-byte characters or one-byte characters. |
const uint32_t kStringEncodingMask = 0x4; |
@@ -547,60 +418,20 @@ |
enum InstanceType { |
- SHORT_SYMBOL_TYPE = kShortStringTag | kSymbolTag | kSeqStringTag, |
- MEDIUM_SYMBOL_TYPE = kMediumStringTag | kSymbolTag | kSeqStringTag, |
- LONG_SYMBOL_TYPE = kLongStringTag | kSymbolTag | kSeqStringTag, |
- SHORT_ASCII_SYMBOL_TYPE = |
- kShortStringTag | kAsciiStringTag | kSymbolTag | kSeqStringTag, |
- MEDIUM_ASCII_SYMBOL_TYPE = |
- kMediumStringTag | kAsciiStringTag | kSymbolTag | kSeqStringTag, |
- LONG_ASCII_SYMBOL_TYPE = |
- kLongStringTag | kAsciiStringTag | kSymbolTag | kSeqStringTag, |
- SHORT_CONS_SYMBOL_TYPE = kShortStringTag | kSymbolTag | kConsStringTag, |
- MEDIUM_CONS_SYMBOL_TYPE = kMediumStringTag | kSymbolTag | kConsStringTag, |
- LONG_CONS_SYMBOL_TYPE = kLongStringTag | kSymbolTag | kConsStringTag, |
- SHORT_CONS_ASCII_SYMBOL_TYPE = |
- kShortStringTag | kAsciiStringTag | kSymbolTag | kConsStringTag, |
- MEDIUM_CONS_ASCII_SYMBOL_TYPE = |
- kMediumStringTag | kAsciiStringTag | kSymbolTag | kConsStringTag, |
- LONG_CONS_ASCII_SYMBOL_TYPE = |
- kLongStringTag | kAsciiStringTag | kSymbolTag | kConsStringTag, |
- SHORT_EXTERNAL_SYMBOL_TYPE = |
- kShortStringTag | kSymbolTag | kExternalStringTag, |
- MEDIUM_EXTERNAL_SYMBOL_TYPE = |
- kMediumStringTag | kSymbolTag | kExternalStringTag, |
- LONG_EXTERNAL_SYMBOL_TYPE = kLongStringTag | kSymbolTag | kExternalStringTag, |
- SHORT_EXTERNAL_ASCII_SYMBOL_TYPE = |
- kShortStringTag | kAsciiStringTag | kSymbolTag | kExternalStringTag, |
- MEDIUM_EXTERNAL_ASCII_SYMBOL_TYPE = |
- kMediumStringTag | kAsciiStringTag | kSymbolTag | kExternalStringTag, |
- LONG_EXTERNAL_ASCII_SYMBOL_TYPE = |
- kLongStringTag | kAsciiStringTag | kSymbolTag | kExternalStringTag, |
- SHORT_STRING_TYPE = kShortStringTag | kSeqStringTag, |
- MEDIUM_STRING_TYPE = kMediumStringTag | kSeqStringTag, |
- LONG_STRING_TYPE = kLongStringTag | kSeqStringTag, |
- SHORT_ASCII_STRING_TYPE = kShortStringTag | kAsciiStringTag | kSeqStringTag, |
- MEDIUM_ASCII_STRING_TYPE = kMediumStringTag | kAsciiStringTag | kSeqStringTag, |
- LONG_ASCII_STRING_TYPE = kLongStringTag | kAsciiStringTag | kSeqStringTag, |
- SHORT_CONS_STRING_TYPE = kShortStringTag | kConsStringTag, |
- MEDIUM_CONS_STRING_TYPE = kMediumStringTag | kConsStringTag, |
- LONG_CONS_STRING_TYPE = kLongStringTag | kConsStringTag, |
- SHORT_CONS_ASCII_STRING_TYPE = |
- kShortStringTag | kAsciiStringTag | kConsStringTag, |
- MEDIUM_CONS_ASCII_STRING_TYPE = |
- kMediumStringTag | kAsciiStringTag | kConsStringTag, |
- LONG_CONS_ASCII_STRING_TYPE = |
- kLongStringTag | kAsciiStringTag | kConsStringTag, |
- SHORT_EXTERNAL_STRING_TYPE = kShortStringTag | kExternalStringTag, |
- MEDIUM_EXTERNAL_STRING_TYPE = kMediumStringTag | kExternalStringTag, |
- LONG_EXTERNAL_STRING_TYPE = kLongStringTag | kExternalStringTag, |
- SHORT_EXTERNAL_ASCII_STRING_TYPE = |
- kShortStringTag | kAsciiStringTag | kExternalStringTag, |
- MEDIUM_EXTERNAL_ASCII_STRING_TYPE = |
- kMediumStringTag | kAsciiStringTag | kExternalStringTag, |
- LONG_EXTERNAL_ASCII_STRING_TYPE = |
- kLongStringTag | kAsciiStringTag | kExternalStringTag, |
- LONG_PRIVATE_EXTERNAL_ASCII_STRING_TYPE = LONG_EXTERNAL_ASCII_STRING_TYPE, |
+ SYMBOL_TYPE = kSymbolTag | kSeqStringTag, |
+ ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kSeqStringTag, |
+ CONS_SYMBOL_TYPE = kSymbolTag | kConsStringTag, |
+ CONS_ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kConsStringTag, |
+ EXTERNAL_SYMBOL_TYPE = kSymbolTag | kExternalStringTag, |
+ EXTERNAL_ASCII_SYMBOL_TYPE = |
+ kAsciiStringTag | kSymbolTag | kExternalStringTag, |
+ STRING_TYPE = kSeqStringTag, |
+ ASCII_STRING_TYPE = kAsciiStringTag | kSeqStringTag, |
+ CONS_STRING_TYPE = kConsStringTag, |
+ CONS_ASCII_STRING_TYPE = kAsciiStringTag | kConsStringTag, |
+ EXTERNAL_STRING_TYPE = kExternalStringTag, |
+ EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag, |
+ PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE, |
MAP_TYPE = kNotStringTag, |
HEAP_NUMBER_TYPE, |
@@ -3910,12 +3741,9 @@ |
inline int length(); |
inline void set_length(int value); |
- // Get and set the uninterpreted length field of the string. Notice |
- // that the length field is also used to cache the hash value of |
- // strings. In order to get or set the actual length of the string |
- // use the length() and set_length methods. |
- inline uint32_t length_field(); |
- inline void set_length_field(uint32_t value); |
+ // Get and set the hash field of the string. |
+ inline uint32_t hash_field(); |
+ inline void set_hash_field(uint32_t value); |
inline bool IsAsciiRepresentation(); |
inline bool IsTwoByteRepresentation(); |
@@ -3986,8 +3814,8 @@ |
// Returns a hash value used for the property table |
inline uint32_t Hash(); |
- static uint32_t ComputeLengthAndHashField(unibrow::CharacterStream* buffer, |
- int length); |
+ static uint32_t ComputeHashField(unibrow::CharacterStream* buffer, |
+ int length); |
static bool ComputeArrayIndex(unibrow::CharacterStream* buffer, |
uint32_t* index, |
@@ -4018,7 +3846,8 @@ |
// Layout description. |
static const int kLengthOffset = HeapObject::kHeaderSize; |
- static const int kSize = kLengthOffset + kIntSize; |
+ static const int kHashFieldOffset = kLengthOffset + kIntSize; |
+ static const int kSize = kHashFieldOffset + kIntSize; |
// Notice: kSize is not pointer-size aligned if pointers are 64-bit. |
// Maximum number of characters to consider when trying to convert a string |
@@ -4042,23 +3871,31 @@ |
static const int kIsArrayIndexMask = 1 << 1; |
static const int kNofLengthBitFields = 2; |
+ // Shift constant retrieving hash code from hash field. |
+ static const int kHashShift = kNofLengthBitFields; |
+ |
// Array index strings this short can keep their index in the hash |
// field. |
static const int kMaxCachedArrayIndexLength = 7; |
- // Shift constants for retrieving length and hash code from |
- // length/hash field. |
- static const int kHashShift = kNofLengthBitFields; |
- static const int kShortLengthShift = kHashShift + kShortStringTag; |
- static const int kMediumLengthShift = kHashShift + kMediumStringTag; |
- static const int kLongLengthShift = kHashShift + kLongStringTag; |
+ // For strings which are array indexes the hash value has the string length |
+ // mixed into the hash, mainly to avoid a hash value of zero which would be |
+ // the case for the string '0'. 24 bits are used for the array index value. |
+ static const int kArrayIndexHashLengthShift = 24 + kNofLengthBitFields; |
+ static const int kArrayIndexHashMask = (1 << kArrayIndexHashLengthShift) - 1; |
+ static const int kArrayIndexValueBits = |
+ kArrayIndexHashLengthShift - kHashShift; |
- // Maximal string length that can be stored in the hash/length field for |
- // different types of strings. |
- static const int kMaxShortSize = (1 << (32 - kShortLengthShift)) - 1; |
- static const int kMaxMediumSize = (1 << (32 - kMediumLengthShift)) - 1; |
- static const int kMaxLength = (1 << (32 - kLongLengthShift)) - 1; |
+ // Value of empty hash field indicating that the hash is not computed. |
+ static const int kEmptyHashField = 0; |
+ // Maximal string length. |
+ static const int kMaxLength = (1 << (32 - 2)) - 1; |
+ |
+ // Max length for computing hash. For strings longer than this limit the |
+ // string length is used as the hash value. |
+ static const int kMaxHashCalcLength = 16383; |
+ |
// Limit for truncation in short printing. |
static const int kMaxShortPrintLength = 1024; |
@@ -4339,9 +4176,6 @@ |
unsigned* offset, |
unsigned chars); |
- // Identify the map for the external string/symbol with a particular length. |
- static inline Map* StringMap(int length); |
- static inline Map* SymbolMap(int length); |
private: |
DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalAsciiString); |
}; |
@@ -4374,9 +4208,6 @@ |
unsigned* offset_ptr, |
unsigned chars); |
- // Identify the map for the external string/symbol with a particular length. |
- static inline Map* StringMap(int length); |
- static inline Map* SymbolMap(int length); |
private: |
DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); |
}; |