OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 // - CompilationCacheTable | 79 // - CompilationCacheTable |
80 // - CodeCacheHashTable | 80 // - CodeCacheHashTable |
81 // - MapCache | 81 // - MapCache |
82 // - Context | 82 // - Context |
83 // - JSFunctionResultCache | 83 // - JSFunctionResultCache |
84 // - SerializedScopeInfo | 84 // - SerializedScopeInfo |
85 // - String | 85 // - String |
86 // - SeqString | 86 // - SeqString |
87 // - SeqAsciiString | 87 // - SeqAsciiString |
88 // - SeqTwoByteString | 88 // - SeqTwoByteString |
| 89 // - SlicedString |
89 // - ConsString | 90 // - ConsString |
90 // - ExternalString | 91 // - ExternalString |
91 // - ExternalAsciiString | 92 // - ExternalAsciiString |
92 // - ExternalTwoByteString | 93 // - ExternalTwoByteString |
93 // - HeapNumber | 94 // - HeapNumber |
94 // - Code | 95 // - Code |
95 // - Map | 96 // - Map |
96 // - Oddball | 97 // - Oddball |
97 // - Foreign | 98 // - Foreign |
98 // - SharedFunctionInfo | 99 // - SharedFunctionInfo |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 V(ASCII_SYMBOL_TYPE) \ | 274 V(ASCII_SYMBOL_TYPE) \ |
274 V(CONS_SYMBOL_TYPE) \ | 275 V(CONS_SYMBOL_TYPE) \ |
275 V(CONS_ASCII_SYMBOL_TYPE) \ | 276 V(CONS_ASCII_SYMBOL_TYPE) \ |
276 V(EXTERNAL_SYMBOL_TYPE) \ | 277 V(EXTERNAL_SYMBOL_TYPE) \ |
277 V(EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE) \ | 278 V(EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE) \ |
278 V(EXTERNAL_ASCII_SYMBOL_TYPE) \ | 279 V(EXTERNAL_ASCII_SYMBOL_TYPE) \ |
279 V(STRING_TYPE) \ | 280 V(STRING_TYPE) \ |
280 V(ASCII_STRING_TYPE) \ | 281 V(ASCII_STRING_TYPE) \ |
281 V(CONS_STRING_TYPE) \ | 282 V(CONS_STRING_TYPE) \ |
282 V(CONS_ASCII_STRING_TYPE) \ | 283 V(CONS_ASCII_STRING_TYPE) \ |
| 284 V(SLICED_STRING_TYPE) \ |
283 V(EXTERNAL_STRING_TYPE) \ | 285 V(EXTERNAL_STRING_TYPE) \ |
284 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE) \ | 286 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE) \ |
285 V(EXTERNAL_ASCII_STRING_TYPE) \ | 287 V(EXTERNAL_ASCII_STRING_TYPE) \ |
286 V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \ | 288 V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \ |
287 \ | 289 \ |
288 V(MAP_TYPE) \ | 290 V(MAP_TYPE) \ |
289 V(CODE_TYPE) \ | 291 V(CODE_TYPE) \ |
290 V(ODDBALL_TYPE) \ | 292 V(ODDBALL_TYPE) \ |
291 V(JS_GLOBAL_PROPERTY_CELL_TYPE) \ | 293 V(JS_GLOBAL_PROPERTY_CELL_TYPE) \ |
292 \ | 294 \ |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 ascii_string, \ | 391 ascii_string, \ |
390 AsciiString) \ | 392 AsciiString) \ |
391 V(CONS_STRING_TYPE, \ | 393 V(CONS_STRING_TYPE, \ |
392 ConsString::kSize, \ | 394 ConsString::kSize, \ |
393 cons_string, \ | 395 cons_string, \ |
394 ConsString) \ | 396 ConsString) \ |
395 V(CONS_ASCII_STRING_TYPE, \ | 397 V(CONS_ASCII_STRING_TYPE, \ |
396 ConsString::kSize, \ | 398 ConsString::kSize, \ |
397 cons_ascii_string, \ | 399 cons_ascii_string, \ |
398 ConsAsciiString) \ | 400 ConsAsciiString) \ |
| 401 V(SLICED_STRING_TYPE, \ |
| 402 SlicedString::kSize, \ |
| 403 sliced_string, \ |
| 404 SlicedString) \ |
| 405 V(SLICED_ASCII_STRING_TYPE, \ |
| 406 SlicedString::kSize, \ |
| 407 sliced_ascii_string, \ |
| 408 SlicedAsciiString) \ |
399 V(EXTERNAL_STRING_TYPE, \ | 409 V(EXTERNAL_STRING_TYPE, \ |
400 ExternalTwoByteString::kSize, \ | 410 ExternalTwoByteString::kSize, \ |
401 external_string, \ | 411 external_string, \ |
402 ExternalString) \ | 412 ExternalString) \ |
403 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE, \ | 413 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE, \ |
404 ExternalTwoByteString::kSize, \ | 414 ExternalTwoByteString::kSize, \ |
405 external_string_with_ascii_data, \ | 415 external_string_with_ascii_data, \ |
406 ExternalStringWithAsciiData) \ | 416 ExternalStringWithAsciiData) \ |
407 V(EXTERNAL_ASCII_STRING_TYPE, \ | 417 V(EXTERNAL_ASCII_STRING_TYPE, \ |
408 ExternalAsciiString::kSize, \ | 418 ExternalAsciiString::kSize, \ |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 const uint32_t kStringEncodingMask = 0x4; | 472 const uint32_t kStringEncodingMask = 0x4; |
463 const uint32_t kTwoByteStringTag = 0x0; | 473 const uint32_t kTwoByteStringTag = 0x0; |
464 const uint32_t kAsciiStringTag = 0x4; | 474 const uint32_t kAsciiStringTag = 0x4; |
465 | 475 |
466 // If bit 7 is clear, the low-order 2 bits indicate the representation | 476 // If bit 7 is clear, the low-order 2 bits indicate the representation |
467 // of the string. | 477 // of the string. |
468 const uint32_t kStringRepresentationMask = 0x03; | 478 const uint32_t kStringRepresentationMask = 0x03; |
469 enum StringRepresentationTag { | 479 enum StringRepresentationTag { |
470 kSeqStringTag = 0x0, | 480 kSeqStringTag = 0x0, |
471 kConsStringTag = 0x1, | 481 kConsStringTag = 0x1, |
472 kExternalStringTag = 0x2 | 482 kExternalStringTag = 0x2, |
| 483 kSlicedStringTag = 0x3 |
473 }; | 484 }; |
474 const uint32_t kIsConsStringMask = 0x1; | 485 const uint32_t kIsIndirectStringMask = 0x1; |
| 486 const uint32_t kIsIndirectStringTag = 0x1; |
| 487 STATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0); |
| 488 STATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0); |
| 489 STATIC_ASSERT( |
| 490 (kConsStringTag & kIsIndirectStringMask) == kIsIndirectStringTag); |
| 491 STATIC_ASSERT( |
| 492 (kSlicedStringTag & kIsIndirectStringMask) == kIsIndirectStringTag); |
475 | 493 |
476 // If bit 7 is clear, then bit 3 indicates whether this two-byte | 494 // If bit 7 is clear, then bit 3 indicates whether this two-byte |
477 // string actually contains ascii data. | 495 // string actually contains ascii data. |
478 const uint32_t kAsciiDataHintMask = 0x08; | 496 const uint32_t kAsciiDataHintMask = 0x08; |
479 const uint32_t kAsciiDataHintTag = 0x08; | 497 const uint32_t kAsciiDataHintTag = 0x08; |
480 | 498 |
481 | 499 |
482 // A ConsString with an empty string as the right side is a candidate | 500 // A ConsString with an empty string as the right side is a candidate |
483 // for being shortcut by the garbage collector unless it is a | 501 // for being shortcut by the garbage collector unless it is a |
484 // symbol. It's not common to have non-flat symbols, so we do not | 502 // symbol. It's not common to have non-flat symbols, so we do not |
(...skipping 14 matching lines...) Expand all Loading... |
499 CONS_ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kConsStringTag, | 517 CONS_ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kConsStringTag, |
500 EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kExternalStringTag, | 518 EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kExternalStringTag, |
501 EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE = | 519 EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE = |
502 kTwoByteStringTag | kSymbolTag | kExternalStringTag | kAsciiDataHintTag, | 520 kTwoByteStringTag | kSymbolTag | kExternalStringTag | kAsciiDataHintTag, |
503 EXTERNAL_ASCII_SYMBOL_TYPE = | 521 EXTERNAL_ASCII_SYMBOL_TYPE = |
504 kAsciiStringTag | kSymbolTag | kExternalStringTag, | 522 kAsciiStringTag | kSymbolTag | kExternalStringTag, |
505 STRING_TYPE = kTwoByteStringTag | kSeqStringTag, | 523 STRING_TYPE = kTwoByteStringTag | kSeqStringTag, |
506 ASCII_STRING_TYPE = kAsciiStringTag | kSeqStringTag, | 524 ASCII_STRING_TYPE = kAsciiStringTag | kSeqStringTag, |
507 CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag, | 525 CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag, |
508 CONS_ASCII_STRING_TYPE = kAsciiStringTag | kConsStringTag, | 526 CONS_ASCII_STRING_TYPE = kAsciiStringTag | kConsStringTag, |
| 527 SLICED_STRING_TYPE = kTwoByteStringTag | kSlicedStringTag, |
| 528 SLICED_ASCII_STRING_TYPE = kAsciiStringTag | kSlicedStringTag, |
509 EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag, | 529 EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag, |
510 EXTERNAL_STRING_WITH_ASCII_DATA_TYPE = | 530 EXTERNAL_STRING_WITH_ASCII_DATA_TYPE = |
511 kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag, | 531 kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag, |
512 // LAST_STRING_TYPE | 532 // LAST_STRING_TYPE |
513 EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag, | 533 EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag, |
514 PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE, | 534 PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE, |
515 | 535 |
516 // Objects allocated in their own spaces (never in new space). | 536 // Objects allocated in their own spaces (never in new space). |
517 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE | 537 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE |
518 CODE_TYPE, | 538 CODE_TYPE, |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 V(HeapObject) \ | 722 V(HeapObject) \ |
703 V(Number) \ | 723 V(Number) \ |
704 | 724 |
705 #define HEAP_OBJECT_TYPE_LIST(V) \ | 725 #define HEAP_OBJECT_TYPE_LIST(V) \ |
706 V(HeapNumber) \ | 726 V(HeapNumber) \ |
707 V(String) \ | 727 V(String) \ |
708 V(Symbol) \ | 728 V(Symbol) \ |
709 V(SeqString) \ | 729 V(SeqString) \ |
710 V(ExternalString) \ | 730 V(ExternalString) \ |
711 V(ConsString) \ | 731 V(ConsString) \ |
| 732 V(SlicedString) \ |
712 V(ExternalTwoByteString) \ | 733 V(ExternalTwoByteString) \ |
713 V(ExternalAsciiString) \ | 734 V(ExternalAsciiString) \ |
714 V(SeqTwoByteString) \ | 735 V(SeqTwoByteString) \ |
715 V(SeqAsciiString) \ | 736 V(SeqAsciiString) \ |
716 \ | 737 \ |
717 V(ExternalArray) \ | 738 V(ExternalArray) \ |
718 V(ExternalByteArray) \ | 739 V(ExternalByteArray) \ |
719 V(ExternalUnsignedByteArray) \ | 740 V(ExternalUnsignedByteArray) \ |
720 V(ExternalShortArray) \ | 741 V(ExternalShortArray) \ |
721 V(ExternalUnsignedShortArray) \ | 742 V(ExternalUnsignedShortArray) \ |
(...skipping 4960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5682 // prone and so we no longer put StringShapes in variables unless there is a | 5703 // prone and so we no longer put StringShapes in variables unless there is a |
5683 // concrete performance benefit at that particular point in the code. | 5704 // concrete performance benefit at that particular point in the code. |
5684 class StringShape BASE_EMBEDDED { | 5705 class StringShape BASE_EMBEDDED { |
5685 public: | 5706 public: |
5686 inline explicit StringShape(String* s); | 5707 inline explicit StringShape(String* s); |
5687 inline explicit StringShape(Map* s); | 5708 inline explicit StringShape(Map* s); |
5688 inline explicit StringShape(InstanceType t); | 5709 inline explicit StringShape(InstanceType t); |
5689 inline bool IsSequential(); | 5710 inline bool IsSequential(); |
5690 inline bool IsExternal(); | 5711 inline bool IsExternal(); |
5691 inline bool IsCons(); | 5712 inline bool IsCons(); |
| 5713 inline bool IsSliced(); |
| 5714 inline bool IsIndirect(); |
5692 inline bool IsExternalAscii(); | 5715 inline bool IsExternalAscii(); |
5693 inline bool IsExternalTwoByte(); | 5716 inline bool IsExternalTwoByte(); |
5694 inline bool IsSequentialAscii(); | 5717 inline bool IsSequentialAscii(); |
5695 inline bool IsSequentialTwoByte(); | 5718 inline bool IsSequentialTwoByte(); |
5696 inline bool IsSymbol(); | 5719 inline bool IsSymbol(); |
5697 inline StringRepresentationTag representation_tag(); | 5720 inline StringRepresentationTag representation_tag(); |
5698 inline uint32_t full_representation_tag(); | 5721 inline uint32_t full_representation_tag(); |
5699 inline uint32_t size_tag(); | 5722 inline uint32_t size_tag(); |
5700 #ifdef DEBUG | 5723 #ifdef DEBUG |
5701 inline uint32_t type() { return type_; } | 5724 inline uint32_t type() { return type_; } |
(...skipping 28 matching lines...) Expand all Loading... |
5730 inline int length(); | 5753 inline int length(); |
5731 inline void set_length(int value); | 5754 inline void set_length(int value); |
5732 | 5755 |
5733 // Get and set the hash field of the string. | 5756 // Get and set the hash field of the string. |
5734 inline uint32_t hash_field(); | 5757 inline uint32_t hash_field(); |
5735 inline void set_hash_field(uint32_t value); | 5758 inline void set_hash_field(uint32_t value); |
5736 | 5759 |
5737 inline bool IsAsciiRepresentation(); | 5760 inline bool IsAsciiRepresentation(); |
5738 inline bool IsTwoByteRepresentation(); | 5761 inline bool IsTwoByteRepresentation(); |
5739 | 5762 |
| 5763 // Cons and slices have an encoding flag that may not represent the actual |
| 5764 // encoding of the underlying string. This is taken into account here. |
| 5765 // Requires: this->IsFlat() |
| 5766 inline bool IsAsciiRepresentationUnderneath(); |
| 5767 inline bool IsTwoByteRepresentationUnderneath(); |
| 5768 |
5740 // Returns whether this string has ascii chars, i.e. all of them can | 5769 // Returns whether this string has ascii chars, i.e. all of them can |
5741 // be ascii encoded. This might be the case even if the string is | 5770 // be ascii encoded. This might be the case even if the string is |
5742 // two-byte. Such strings may appear when the embedder prefers | 5771 // two-byte. Such strings may appear when the embedder prefers |
5743 // two-byte external representations even for ascii data. | 5772 // two-byte external representations even for ascii data. |
5744 // | 5773 // |
5745 // NOTE: this should be considered only a hint. False negatives are | 5774 // NOTE: this should be considered only a hint. False negatives are |
5746 // possible. | 5775 // possible. |
5747 inline bool HasOnlyAsciiChars(); | 5776 inline bool HasOnlyAsciiChars(); |
5748 | 5777 |
5749 // Get and set individual two byte chars in the string. | 5778 // Get and set individual two byte chars in the string. |
(...skipping 17 matching lines...) Expand all Loading... |
5767 // | 5796 // |
5768 // Use FlattenString from Handles.cc to flatten even in case an | 5797 // Use FlattenString from Handles.cc to flatten even in case an |
5769 // allocation failure happens. | 5798 // allocation failure happens. |
5770 inline MaybeObject* TryFlatten(PretenureFlag pretenure = NOT_TENURED); | 5799 inline MaybeObject* TryFlatten(PretenureFlag pretenure = NOT_TENURED); |
5771 | 5800 |
5772 // Convenience function. Has exactly the same behavior as | 5801 // Convenience function. Has exactly the same behavior as |
5773 // TryFlatten(), except in the case of failure returns the original | 5802 // TryFlatten(), except in the case of failure returns the original |
5774 // string. | 5803 // string. |
5775 inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED); | 5804 inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED); |
5776 | 5805 |
| 5806 // Returns the parent of a sliced string or first part of a flat cons string. |
| 5807 // Requires: StringShape(this).IsIndirect() && this->IsFlat() |
| 5808 inline String* GetUnderlying(); |
| 5809 |
5777 Vector<const char> ToAsciiVector(); | 5810 Vector<const char> ToAsciiVector(); |
5778 Vector<const uc16> ToUC16Vector(); | 5811 Vector<const uc16> ToUC16Vector(); |
5779 | 5812 |
5780 // Mark the string as an undetectable object. It only applies to | 5813 // Mark the string as an undetectable object. It only applies to |
5781 // ascii and two byte string types. | 5814 // ascii and two byte string types. |
5782 bool MarkAsUndetectable(); | 5815 bool MarkAsUndetectable(); |
5783 | 5816 |
5784 // Return a substring. | 5817 // Return a substring. |
5785 MUST_USE_RESULT MaybeObject* SubString(int from, | 5818 MUST_USE_RESULT MaybeObject* SubString(int from, |
5786 int to, | 5819 int to, |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6196 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | 6229 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, |
6197 unsigned* offset_ptr, | 6230 unsigned* offset_ptr, |
6198 unsigned chars); | 6231 unsigned chars); |
6199 | 6232 |
6200 // Minimum length for a cons string. | 6233 // Minimum length for a cons string. |
6201 static const int kMinLength = 13; | 6234 static const int kMinLength = 13; |
6202 | 6235 |
6203 typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> | 6236 typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> |
6204 BodyDescriptor; | 6237 BodyDescriptor; |
6205 | 6238 |
| 6239 #ifdef DEBUG |
| 6240 void ConsStringVerify(); |
| 6241 #endif |
| 6242 |
6206 private: | 6243 private: |
6207 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); | 6244 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); |
6208 }; | 6245 }; |
6209 | 6246 |
6210 | 6247 |
| 6248 // The Sliced String class describes strings that are substrings of another |
| 6249 // sequential string. The motivation is to save time and memory when creating |
| 6250 // a substring. A Sliced String is described as a pointer to the parent, |
| 6251 // the offset from the start of the parent string and the length. Using |
| 6252 // a Sliced String therefore requires unpacking of the parent string and |
| 6253 // adding the offset to the start address. A substring of a Sliced String |
| 6254 // are not nested since the double indirection is simplified when creating |
| 6255 // such a substring. |
| 6256 // Currently missing features are: |
| 6257 // - handling externalized parent strings |
| 6258 // - external strings as parent |
| 6259 // - truncating sliced string to enable otherwise unneeded parent to be GC'ed. |
| 6260 class SlicedString: public String { |
| 6261 public: |
| 6262 |
| 6263 inline String* parent(); |
| 6264 inline void set_parent(String* parent); |
| 6265 inline int offset(); |
| 6266 inline void set_offset(int offset); |
| 6267 |
| 6268 // Dispatched behavior. |
| 6269 uint16_t SlicedStringGet(int index); |
| 6270 |
| 6271 // Casting. |
| 6272 static inline SlicedString* cast(Object* obj); |
| 6273 |
| 6274 // Layout description. |
| 6275 static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize); |
| 6276 static const int kOffsetOffset = kParentOffset + kPointerSize; |
| 6277 static const int kSize = kOffsetOffset + kPointerSize; |
| 6278 |
| 6279 // Support for StringInputBuffer |
| 6280 inline const unibrow::byte* SlicedStringReadBlock(ReadBlockBuffer* buffer, |
| 6281 unsigned* offset_ptr, |
| 6282 unsigned chars); |
| 6283 inline void SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, |
| 6284 unsigned* offset_ptr, |
| 6285 unsigned chars); |
| 6286 // Minimum length for a sliced string. |
| 6287 static const int kMinLength = 13; |
| 6288 |
| 6289 typedef FixedBodyDescriptor<kParentOffset, |
| 6290 kOffsetOffset + kPointerSize, kSize> |
| 6291 BodyDescriptor; |
| 6292 |
| 6293 #ifdef DEBUG |
| 6294 void SlicedStringVerify(); |
| 6295 #endif |
| 6296 |
| 6297 private: |
| 6298 DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString); |
| 6299 }; |
| 6300 |
| 6301 |
6211 // The ExternalString class describes string values that are backed by | 6302 // The ExternalString class describes string values that are backed by |
6212 // a string resource that lies outside the V8 heap. ExternalStrings | 6303 // a string resource that lies outside the V8 heap. ExternalStrings |
6213 // consist of the length field common to all strings, a pointer to the | 6304 // consist of the length field common to all strings, a pointer to the |
6214 // external resource. It is important to ensure (externally) that the | 6305 // external resource. It is important to ensure (externally) that the |
6215 // resource is not deallocated while the ExternalString is live in the | 6306 // resource is not deallocated while the ExternalString is live in the |
6216 // V8 heap. | 6307 // V8 heap. |
6217 // | 6308 // |
6218 // The API expects that all ExternalStrings are created through the | 6309 // The API expects that all ExternalStrings are created through the |
6219 // API. Therefore, ExternalStrings should not be used internally. | 6310 // API. Therefore, ExternalStrings should not be used internally. |
6220 class ExternalString: public String { | 6311 class ExternalString: public String { |
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7183 } else { | 7274 } else { |
7184 value &= ~(1 << bit_position); | 7275 value &= ~(1 << bit_position); |
7185 } | 7276 } |
7186 return value; | 7277 return value; |
7187 } | 7278 } |
7188 }; | 7279 }; |
7189 | 7280 |
7190 } } // namespace v8::internal | 7281 } } // namespace v8::internal |
7191 | 7282 |
7192 #endif // V8_OBJECTS_H_ | 7283 #endif // V8_OBJECTS_H_ |
OLD | NEW |