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

Side by Side Diff: src/objects.h

Issue 12223071: ES6 symbols: Introduce Symbol class, along with abstract Name class (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed comments Created 7 years, 10 months 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
« no previous file with comments | « src/heap.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 // - FixedDoubleArray 88 // - FixedDoubleArray
89 // - ExternalArray 89 // - ExternalArray
90 // - ExternalPixelArray 90 // - ExternalPixelArray
91 // - ExternalByteArray 91 // - ExternalByteArray
92 // - ExternalUnsignedByteArray 92 // - ExternalUnsignedByteArray
93 // - ExternalShortArray 93 // - ExternalShortArray
94 // - ExternalUnsignedShortArray 94 // - ExternalUnsignedShortArray
95 // - ExternalIntArray 95 // - ExternalIntArray
96 // - ExternalUnsignedIntArray 96 // - ExternalUnsignedIntArray
97 // - ExternalFloatArray 97 // - ExternalFloatArray
98 // - String 98 // - Name
99 // - SeqString 99 // - String
100 // - SeqOneByteString 100 // - SeqString
101 // - SeqTwoByteString 101 // - SeqOneByteString
102 // - SlicedString 102 // - SeqTwoByteString
103 // - ConsString 103 // - SlicedString
104 // - ExternalString 104 // - ConsString
105 // - ExternalAsciiString 105 // - ExternalString
106 // - ExternalTwoByteString 106 // - ExternalAsciiString
107 // - ExternalTwoByteString
108 // - InternalizedString
109 // - SeqInternalizedString
110 // - SeqOneByteInternalizedString
111 // - SeqTwoByteInternalizedString
112 // - ConsInternalizedString
113 // - ExternalInternalizedString
114 // - ExternalAsciiInternalizedString
115 // - ExternalTwoByteInternalizedString
116 // - Symbol
107 // - HeapNumber 117 // - HeapNumber
108 // - Code 118 // - Code
109 // - Map 119 // - Map
110 // - Oddball 120 // - Oddball
111 // - Foreign 121 // - Foreign
112 // - SharedFunctionInfo 122 // - SharedFunctionInfo
113 // - Struct 123 // - Struct
114 // - AccessorInfo 124 // - AccessorInfo
115 // - AccessorPair 125 // - AccessorPair
116 // - AccessCheckInfo 126 // - AccessCheckInfo
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 V(ASCII_INTERNALIZED_STRING_TYPE) \ 269 V(ASCII_INTERNALIZED_STRING_TYPE) \
260 V(CONS_INTERNALIZED_STRING_TYPE) \ 270 V(CONS_INTERNALIZED_STRING_TYPE) \
261 V(CONS_ASCII_INTERNALIZED_STRING_TYPE) \ 271 V(CONS_ASCII_INTERNALIZED_STRING_TYPE) \
262 V(EXTERNAL_INTERNALIZED_STRING_TYPE) \ 272 V(EXTERNAL_INTERNALIZED_STRING_TYPE) \
263 V(EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE) \ 273 V(EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE) \
264 V(EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE) \ 274 V(EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE) \
265 V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE) \ 275 V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE) \
266 V(SHORT_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE) \ 276 V(SHORT_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE) \
267 V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE) \ 277 V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE) \
268 \ 278 \
279 V(SYMBOL_TYPE) \
269 V(MAP_TYPE) \ 280 V(MAP_TYPE) \
270 V(CODE_TYPE) \ 281 V(CODE_TYPE) \
271 V(ODDBALL_TYPE) \ 282 V(ODDBALL_TYPE) \
272 V(JS_GLOBAL_PROPERTY_CELL_TYPE) \ 283 V(JS_GLOBAL_PROPERTY_CELL_TYPE) \
273 \ 284 \
274 V(HEAP_NUMBER_TYPE) \ 285 V(HEAP_NUMBER_TYPE) \
275 V(FOREIGN_TYPE) \ 286 V(FOREIGN_TYPE) \
276 V(BYTE_ARRAY_TYPE) \ 287 V(BYTE_ARRAY_TYPE) \
277 V(FREE_SPACE_TYPE) \ 288 V(FREE_SPACE_TYPE) \
278 /* Note: the order of these external array */ \ 289 /* Note: the order of these external array */ \
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 EXTERNAL_ASCII_STRING_TYPE | kInternalizedTag, 575 EXTERNAL_ASCII_STRING_TYPE | kInternalizedTag,
565 EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE = 576 EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE =
566 EXTERNAL_STRING_WITH_ASCII_DATA_TYPE | kInternalizedTag, 577 EXTERNAL_STRING_WITH_ASCII_DATA_TYPE | kInternalizedTag,
567 SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE = 578 SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE =
568 SHORT_EXTERNAL_STRING_TYPE | kInternalizedTag, 579 SHORT_EXTERNAL_STRING_TYPE | kInternalizedTag,
569 SHORT_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE = 580 SHORT_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE =
570 SHORT_EXTERNAL_ASCII_STRING_TYPE | kInternalizedTag, 581 SHORT_EXTERNAL_ASCII_STRING_TYPE | kInternalizedTag,
571 SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE = 582 SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE =
572 SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE | kInternalizedTag, 583 SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE | kInternalizedTag,
573 584
585 // Non-string names
586 SYMBOL_TYPE = kNotStringTag, // LAST_NAME_TYPE, FIRST_NONSTRING_TYPE
587
574 // Objects allocated in their own spaces (never in new space). 588 // Objects allocated in their own spaces (never in new space).
575 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE 589 MAP_TYPE,
576 CODE_TYPE, 590 CODE_TYPE,
577 ODDBALL_TYPE, 591 ODDBALL_TYPE,
578 JS_GLOBAL_PROPERTY_CELL_TYPE, 592 JS_GLOBAL_PROPERTY_CELL_TYPE,
579 593
580 // "Data", objects that cannot contain non-map-word pointers to heap 594 // "Data", objects that cannot contain non-map-word pointers to heap
581 // objects. 595 // objects.
582 HEAP_NUMBER_TYPE, 596 HEAP_NUMBER_TYPE,
583 FOREIGN_TYPE, 597 FOREIGN_TYPE,
584 BYTE_ARRAY_TYPE, 598 BYTE_ARRAY_TYPE,
585 FREE_SPACE_TYPE, 599 FREE_SPACE_TYPE,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 JS_WEAK_MAP_TYPE, 659 JS_WEAK_MAP_TYPE,
646 660
647 JS_REGEXP_TYPE, 661 JS_REGEXP_TYPE,
648 662
649 JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE 663 JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE
650 664
651 // Pseudo-types 665 // Pseudo-types
652 FIRST_TYPE = 0x0, 666 FIRST_TYPE = 0x0,
653 LAST_TYPE = JS_FUNCTION_TYPE, 667 LAST_TYPE = JS_FUNCTION_TYPE,
654 INVALID_TYPE = FIRST_TYPE - 1, 668 INVALID_TYPE = FIRST_TYPE - 1,
655 FIRST_NONSTRING_TYPE = MAP_TYPE, 669 LAST_NAME_TYPE = SYMBOL_TYPE,
670 FIRST_NONSTRING_TYPE = SYMBOL_TYPE,
656 // Boundaries for testing for an external array. 671 // Boundaries for testing for an external array.
657 FIRST_EXTERNAL_ARRAY_TYPE = EXTERNAL_BYTE_ARRAY_TYPE, 672 FIRST_EXTERNAL_ARRAY_TYPE = EXTERNAL_BYTE_ARRAY_TYPE,
658 LAST_EXTERNAL_ARRAY_TYPE = EXTERNAL_PIXEL_ARRAY_TYPE, 673 LAST_EXTERNAL_ARRAY_TYPE = EXTERNAL_PIXEL_ARRAY_TYPE,
659 // Boundary for promotion to old data space/old pointer space. 674 // Boundary for promotion to old data space/old pointer space.
660 LAST_DATA_TYPE = FILLER_TYPE, 675 LAST_DATA_TYPE = FILLER_TYPE,
661 // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy). 676 // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy).
662 // Note that there is no range for JSObject or JSProxy, since their subtypes 677 // Note that there is no range for JSObject or JSProxy, since their subtypes
663 // are not continuous in this enum! The enum ranges instead reflect the 678 // are not continuous in this enum! The enum ranges instead reflect the
664 // external class names, where proxies are treated as either ordinary objects, 679 // external class names, where proxies are treated as either ordinary objects,
665 // or functions. 680 // or functions.
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 }; 836 };
822 837
823 838
824 #define OBJECT_TYPE_LIST(V) \ 839 #define OBJECT_TYPE_LIST(V) \
825 V(Smi) \ 840 V(Smi) \
826 V(HeapObject) \ 841 V(HeapObject) \
827 V(Number) \ 842 V(Number) \
828 843
829 #define HEAP_OBJECT_TYPE_LIST(V) \ 844 #define HEAP_OBJECT_TYPE_LIST(V) \
830 V(HeapNumber) \ 845 V(HeapNumber) \
846 V(Name) \
831 V(String) \ 847 V(String) \
832 V(SeqString) \ 848 V(SeqString) \
833 V(ExternalString) \ 849 V(ExternalString) \
834 V(ConsString) \ 850 V(ConsString) \
835 V(SlicedString) \ 851 V(SlicedString) \
836 V(ExternalTwoByteString) \ 852 V(ExternalTwoByteString) \
837 V(ExternalAsciiString) \ 853 V(ExternalAsciiString) \
838 V(SeqTwoByteString) \ 854 V(SeqTwoByteString) \
839 V(SeqOneByteString) \ 855 V(SeqOneByteString) \
840 V(InternalizedString) \ 856 V(InternalizedString) \
857 V(Symbol) \
841 \ 858 \
842 V(ExternalArray) \ 859 V(ExternalArray) \
843 V(ExternalByteArray) \ 860 V(ExternalByteArray) \
844 V(ExternalUnsignedByteArray) \ 861 V(ExternalUnsignedByteArray) \
845 V(ExternalShortArray) \ 862 V(ExternalShortArray) \
846 V(ExternalUnsignedShortArray) \ 863 V(ExternalUnsignedShortArray) \
847 V(ExternalIntArray) \ 864 V(ExternalIntArray) \
848 V(ExternalUnsignedIntArray) \ 865 V(ExternalUnsignedIntArray) \
849 V(ExternalFloatArray) \ 866 V(ExternalFloatArray) \
850 V(ExternalDoubleArray) \ 867 V(ExternalDoubleArray) \
(...skipping 6266 matching lines...) Expand 10 before | Expand all | Expand 10 after
7117 uint32_t type_; 7134 uint32_t type_;
7118 #ifdef DEBUG 7135 #ifdef DEBUG
7119 inline void set_valid() { valid_ = true; } 7136 inline void set_valid() { valid_ = true; }
7120 bool valid_; 7137 bool valid_;
7121 #else 7138 #else
7122 inline void set_valid() { } 7139 inline void set_valid() { }
7123 #endif 7140 #endif
7124 }; 7141 };
7125 7142
7126 7143
7144 // The Name abstract class captures anything that can be used as a property
7145 // name, i.e., strings and symbols. All names store a hash value.
7146 class Name: public HeapObject {
7147 public:
7148 // Get and set the hash field of the name.
7149 inline uint32_t hash_field();
7150 inline void set_hash_field(uint32_t value);
7151
7152 // Tells whether the hash code has been computed.
7153 inline bool HasHashCode();
7154
7155 // Returns a hash value used for the property table
7156 inline uint32_t Hash();
7157
7158 // Casting.
7159 static inline Name* cast(Object* obj);
7160
7161 // Layout description.
7162 static const int kHashFieldOffset = HeapObject::kHeaderSize;
7163 static const int kSize = kHashFieldOffset + kPointerSize;
7164
7165 // Mask constant for checking if a name has a computed hash code
7166 // and if it is a string that is an array index. The least significant bit
7167 // indicates whether a hash code has been computed. If the hash code has
7168 // been computed the 2nd bit tells whether the string can be used as an
7169 // array index.
7170 static const int kHashNotComputedMask = 1;
7171 static const int kIsNotArrayIndexMask = 1 << 1;
7172 static const int kNofHashBitFields = 2;
7173
7174 // Shift constant retrieving hash code from hash field.
7175 static const int kHashShift = kNofHashBitFields;
7176
7177 // Only these bits are relevant in the hash, since the top two are shifted
7178 // out.
7179 static const uint32_t kHashBitMask = 0xffffffffu >> kHashShift;
7180
7181 // Array index strings this short can keep their index in the hash field.
7182 static const int kMaxCachedArrayIndexLength = 7;
7183
7184 // For strings which are array indexes the hash value has the string length
7185 // mixed into the hash, mainly to avoid a hash value of zero which would be
7186 // the case for the string '0'. 24 bits are used for the array index value.
7187 static const int kArrayIndexValueBits = 24;
7188 static const int kArrayIndexLengthBits =
7189 kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields;
7190
7191 STATIC_CHECK((kArrayIndexLengthBits > 0));
7192
7193 static const int kArrayIndexHashLengthShift =
7194 kArrayIndexValueBits + kNofHashBitFields;
7195
7196 static const int kArrayIndexHashMask = (1 << kArrayIndexHashLengthShift) - 1;
7197
7198 static const int kArrayIndexValueMask =
7199 ((1 << kArrayIndexValueBits) - 1) << kHashShift;
7200
7201 // Check that kMaxCachedArrayIndexLength + 1 is a power of two so we
7202 // could use a mask to test if the length of string is less than or equal to
7203 // kMaxCachedArrayIndexLength.
7204 STATIC_CHECK(IS_POWER_OF_TWO(kMaxCachedArrayIndexLength + 1));
7205
7206 static const int kContainsCachedArrayIndexMask =
7207 (~kMaxCachedArrayIndexLength << kArrayIndexHashLengthShift) |
7208 kIsNotArrayIndexMask;
7209
7210 // Value of empty hash field indicating that the hash is not computed.
7211 static const int kEmptyHashField =
7212 kIsNotArrayIndexMask | kHashNotComputedMask;
7213
7214 protected:
7215 static inline bool IsHashFieldComputed(uint32_t field);
7216
7217 private:
7218 DISALLOW_IMPLICIT_CONSTRUCTORS(Name);
7219 };
7220
7221
7222 // ES6 symbols.
7223 class Symbol: public Name {
7224 public:
7225 // Casting.
7226 static inline Symbol* cast(Object* obj);
7227
7228 // Dispatched behavior.
7229 DECLARE_PRINTER(Symbol)
7230 DECLARE_VERIFIER(Symbol)
7231
7232 // Layout description.
7233 static const int kSize = Name::kSize;
7234
7235 private:
7236 DISALLOW_IMPLICIT_CONSTRUCTORS(Symbol);
7237 };
7238
7239
7127 // The String abstract class captures JavaScript string values: 7240 // The String abstract class captures JavaScript string values:
7128 // 7241 //
7129 // Ecma-262: 7242 // Ecma-262:
7130 // 4.3.16 String Value 7243 // 4.3.16 String Value
7131 // A string value is a member of the type String and is a finite 7244 // A string value is a member of the type String and is a finite
7132 // ordered sequence of zero or more 16-bit unsigned integer values. 7245 // ordered sequence of zero or more 16-bit unsigned integer values.
7133 // 7246 //
7134 // All string values have a length field. 7247 // All string values have a length field.
7135 class String: public HeapObject { 7248 class String: public Name {
7136 public: 7249 public:
7137 enum Encoding { ONE_BYTE_ENCODING, TWO_BYTE_ENCODING }; 7250 enum Encoding { ONE_BYTE_ENCODING, TWO_BYTE_ENCODING };
7138 7251
7139 // Representation of the flat content of a String. 7252 // Representation of the flat content of a String.
7140 // A non-flat string doesn't have flat content. 7253 // A non-flat string doesn't have flat content.
7141 // A flat string has content that's encoded as a sequence of either 7254 // A flat string has content that's encoded as a sequence of either
7142 // ASCII chars or two-byte UC16. 7255 // ASCII chars or two-byte UC16.
7143 // Returned by String::GetFlatContent(). 7256 // Returned by String::GetFlatContent().
7144 class FlatContent { 7257 class FlatContent {
7145 public: 7258 public:
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
7178 Vector<const uint8_t> buffer_; 7291 Vector<const uint8_t> buffer_;
7179 State state_; 7292 State state_;
7180 7293
7181 friend class String; 7294 friend class String;
7182 }; 7295 };
7183 7296
7184 // Get and set the length of the string. 7297 // Get and set the length of the string.
7185 inline int length(); 7298 inline int length();
7186 inline void set_length(int value); 7299 inline void set_length(int value);
7187 7300
7188 // Get and set the hash field of the string.
7189 inline uint32_t hash_field();
7190 inline void set_hash_field(uint32_t value);
7191
7192 // Returns whether this string has only ASCII chars, i.e. all of them can 7301 // Returns whether this string has only ASCII chars, i.e. all of them can
7193 // be ASCII encoded. This might be the case even if the string is 7302 // be ASCII encoded. This might be the case even if the string is
7194 // two-byte. Such strings may appear when the embedder prefers 7303 // two-byte. Such strings may appear when the embedder prefers
7195 // two-byte external representations even for ASCII data. 7304 // two-byte external representations even for ASCII data.
7196 inline bool IsOneByteRepresentation(); 7305 inline bool IsOneByteRepresentation();
7197 inline bool IsTwoByteRepresentation(); 7306 inline bool IsTwoByteRepresentation();
7198 7307
7199 // Cons and slices have an encoding flag that may not represent the actual 7308 // Cons and slices have an encoding flag that may not represent the actual
7200 // encoding of the underlying string. This is taken into account here. 7309 // encoding of the underlying string. This is taken into account here.
7201 // Requires: this->IsFlat() 7310 // Requires: this->IsFlat()
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
7282 7391
7283 // Return a 16 bit Unicode representation of the string. 7392 // Return a 16 bit Unicode representation of the string.
7284 // The string should be nearly flat, otherwise the performance of 7393 // The string should be nearly flat, otherwise the performance of
7285 // of this method may be very bad. Setting robustness_flag to 7394 // of this method may be very bad. Setting robustness_flag to
7286 // ROBUST_STRING_TRAVERSAL invokes behaviour that is robust This means it 7395 // ROBUST_STRING_TRAVERSAL invokes behaviour that is robust This means it
7287 // handles unexpected data without causing assert failures and it does not 7396 // handles unexpected data without causing assert failures and it does not
7288 // do any heap allocations. This is useful when printing stack traces. 7397 // do any heap allocations. This is useful when printing stack traces.
7289 SmartArrayPointer<uc16> ToWideCString( 7398 SmartArrayPointer<uc16> ToWideCString(
7290 RobustnessFlag robustness_flag = FAST_STRING_TRAVERSAL); 7399 RobustnessFlag robustness_flag = FAST_STRING_TRAVERSAL);
7291 7400
7292 // Tells whether the hash code has been computed.
7293 inline bool HasHashCode();
7294
7295 // Returns a hash value used for the property table
7296 inline uint32_t Hash();
7297
7298 bool ComputeArrayIndex(uint32_t* index); 7401 bool ComputeArrayIndex(uint32_t* index);
7299 7402
7300 // Externalization. 7403 // Externalization.
7301 bool MakeExternal(v8::String::ExternalStringResource* resource); 7404 bool MakeExternal(v8::String::ExternalStringResource* resource);
7302 bool MakeExternal(v8::String::ExternalAsciiStringResource* resource); 7405 bool MakeExternal(v8::String::ExternalAsciiStringResource* resource);
7303 7406
7304 // Conversion. 7407 // Conversion.
7305 inline bool AsArrayIndex(uint32_t* index); 7408 inline bool AsArrayIndex(uint32_t* index);
7306 7409
7307 // Casting. 7410 // Casting.
(...skipping 12 matching lines...) Expand all
7320 } 7423 }
7321 void StringPrint(FILE* out); 7424 void StringPrint(FILE* out);
7322 7425
7323 char* ToAsciiArray(); 7426 char* ToAsciiArray();
7324 #endif 7427 #endif
7325 DECLARE_VERIFIER(String) 7428 DECLARE_VERIFIER(String)
7326 7429
7327 inline bool IsFlat(); 7430 inline bool IsFlat();
7328 7431
7329 // Layout description. 7432 // Layout description.
7330 static const int kLengthOffset = HeapObject::kHeaderSize; 7433 static const int kLengthOffset = Name::kSize;
7331 static const int kHashFieldOffset = kLengthOffset + kPointerSize; 7434 static const int kSize = kLengthOffset + kPointerSize;
7332 static const int kSize = kHashFieldOffset + kPointerSize;
7333 7435
7334 // Maximum number of characters to consider when trying to convert a string 7436 // Maximum number of characters to consider when trying to convert a string
7335 // value into an array index. 7437 // value into an array index.
7336 static const int kMaxArrayIndexSize = 10; 7438 static const int kMaxArrayIndexSize = 10;
7439 STATIC_CHECK(kMaxArrayIndexSize < (1 << kArrayIndexLengthBits));
7337 7440
7338 // Max char codes. 7441 // Max char codes.
7339 static const int32_t kMaxOneByteCharCode = unibrow::Latin1::kMaxChar; 7442 static const int32_t kMaxOneByteCharCode = unibrow::Latin1::kMaxChar;
7340 static const uint32_t kMaxOneByteCharCodeU = unibrow::Latin1::kMaxChar; 7443 static const uint32_t kMaxOneByteCharCodeU = unibrow::Latin1::kMaxChar;
7341 static const int kMaxUtf16CodeUnit = 0xffff; 7444 static const int kMaxUtf16CodeUnit = 0xffff;
7342 7445
7343 // Mask constant for checking if a string has a computed hash code
7344 // and if it is an array index. The least significant bit indicates
7345 // whether a hash code has been computed. If the hash code has been
7346 // computed the 2nd bit tells whether the string can be used as an
7347 // array index.
7348 static const int kHashNotComputedMask = 1;
7349 static const int kIsNotArrayIndexMask = 1 << 1;
7350 static const int kNofHashBitFields = 2;
7351
7352 // Shift constant retrieving hash code from hash field.
7353 static const int kHashShift = kNofHashBitFields;
7354
7355 // Only these bits are relevant in the hash, since the top two are shifted
7356 // out.
7357 static const uint32_t kHashBitMask = 0xffffffffu >> kHashShift;
7358
7359 // Array index strings this short can keep their index in the hash
7360 // field.
7361 static const int kMaxCachedArrayIndexLength = 7;
7362
7363 // For strings which are array indexes the hash value has the string length
7364 // mixed into the hash, mainly to avoid a hash value of zero which would be
7365 // the case for the string '0'. 24 bits are used for the array index value.
7366 static const int kArrayIndexValueBits = 24;
7367 static const int kArrayIndexLengthBits =
7368 kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields;
7369
7370 STATIC_CHECK((kArrayIndexLengthBits > 0));
7371 STATIC_CHECK(kMaxArrayIndexSize < (1 << kArrayIndexLengthBits));
7372
7373 static const int kArrayIndexHashLengthShift =
7374 kArrayIndexValueBits + kNofHashBitFields;
7375
7376 static const int kArrayIndexHashMask = (1 << kArrayIndexHashLengthShift) - 1;
7377
7378 static const int kArrayIndexValueMask =
7379 ((1 << kArrayIndexValueBits) - 1) << kHashShift;
7380
7381 // Check that kMaxCachedArrayIndexLength + 1 is a power of two so we
7382 // could use a mask to test if the length of string is less than or equal to
7383 // kMaxCachedArrayIndexLength.
7384 STATIC_CHECK(IS_POWER_OF_TWO(kMaxCachedArrayIndexLength + 1));
7385
7386 static const int kContainsCachedArrayIndexMask =
7387 (~kMaxCachedArrayIndexLength << kArrayIndexHashLengthShift) |
7388 kIsNotArrayIndexMask;
7389
7390 // Value of empty hash field indicating that the hash is not computed.
7391 static const int kEmptyHashField =
7392 kIsNotArrayIndexMask | kHashNotComputedMask;
7393
7394 // Value of hash field containing computed hash equal to zero. 7446 // Value of hash field containing computed hash equal to zero.
7395 static const int kEmptyStringHash = kIsNotArrayIndexMask; 7447 static const int kEmptyStringHash = kIsNotArrayIndexMask;
7396 7448
7397 // Maximal string length. 7449 // Maximal string length.
7398 static const int kMaxLength = (1 << (32 - 2)) - 1; 7450 static const int kMaxLength = (1 << (32 - 2)) - 1;
7399 7451
7400 // Max length for computing hash. For strings longer than this limit the 7452 // Max length for computing hash. For strings longer than this limit the
7401 // string length is used as the hash value. 7453 // string length is used as the hash value.
7402 static const int kMaxHashCalcLength = 16383; 7454 static const int kMaxHashCalcLength = 16383;
7403 7455
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
7465 7517
7466 template<class Visitor, class ConsOp> 7518 template<class Visitor, class ConsOp>
7467 static inline void Visit(String* string, 7519 static inline void Visit(String* string,
7468 unsigned offset, 7520 unsigned offset,
7469 Visitor& visitor, 7521 Visitor& visitor,
7470 ConsOp& cons_op, 7522 ConsOp& cons_op,
7471 int32_t type, 7523 int32_t type,
7472 unsigned length); 7524 unsigned length);
7473 7525
7474 private: 7526 private:
7527 friend class Name;
7528
7475 // Try to flatten the top level ConsString that is hiding behind this 7529 // Try to flatten the top level ConsString that is hiding behind this
7476 // string. This is a no-op unless the string is a ConsString. Flatten 7530 // string. This is a no-op unless the string is a ConsString. Flatten
7477 // mutates the ConsString and might return a failure. 7531 // mutates the ConsString and might return a failure.
7478 MUST_USE_RESULT MaybeObject* SlowTryFlatten(PretenureFlag pretenure); 7532 MUST_USE_RESULT MaybeObject* SlowTryFlatten(PretenureFlag pretenure);
7479 7533
7480 static inline bool IsHashFieldComputed(uint32_t field);
7481
7482 // Slow case of String::Equals. This implementation works on any strings 7534 // Slow case of String::Equals. This implementation works on any strings
7483 // but it is most efficient on strings that are almost flat. 7535 // but it is most efficient on strings that are almost flat.
7484 bool SlowEquals(String* other); 7536 bool SlowEquals(String* other);
7485 7537
7486 // Slow case of AsArrayIndex. 7538 // Slow case of AsArrayIndex.
7487 bool SlowAsArrayIndex(uint32_t* index); 7539 bool SlowAsArrayIndex(uint32_t* index);
7488 7540
7489 // Compute and set the hash code. 7541 // Compute and set the hash code.
7490 uint32_t ComputeAndSetHash(); 7542 uint32_t ComputeAndSetHash();
7491 7543
(...skipping 1394 matching lines...) Expand 10 before | Expand all | Expand 10 after
8886 } else { 8938 } else {
8887 value &= ~(1 << bit_position); 8939 value &= ~(1 << bit_position);
8888 } 8940 }
8889 return value; 8941 return value;
8890 } 8942 }
8891 }; 8943 };
8892 8944
8893 } } // namespace v8::internal 8945 } } // namespace v8::internal
8894 8946
8895 #endif // V8_OBJECTS_H_ 8947 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/heap.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698