OLD | NEW |
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 7295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7306 // string length is used as the hash value. | 7306 // string length is used as the hash value. |
7307 static const int kMaxHashCalcLength = 16383; | 7307 static const int kMaxHashCalcLength = 16383; |
7308 | 7308 |
7309 // Limit for truncation in short printing. | 7309 // Limit for truncation in short printing. |
7310 static const int kMaxShortPrintLength = 1024; | 7310 static const int kMaxShortPrintLength = 1024; |
7311 | 7311 |
7312 // Support for regular expressions. | 7312 // Support for regular expressions. |
7313 const uc16* GetTwoByteData(); | 7313 const uc16* GetTwoByteData(); |
7314 const uc16* GetTwoByteData(unsigned start); | 7314 const uc16* GetTwoByteData(unsigned start); |
7315 | 7315 |
7316 // Support for StringInputBuffer | |
7317 static const unibrow::byte* ReadBlock(String* input, | |
7318 unibrow::byte* util_buffer, | |
7319 unsigned capacity, | |
7320 unsigned* remaining, | |
7321 unsigned* offset); | |
7322 static const unibrow::byte* ReadBlock(String** input, | |
7323 unibrow::byte* util_buffer, | |
7324 unsigned capacity, | |
7325 unsigned* remaining, | |
7326 unsigned* offset); | |
7327 | |
7328 // Helper function for flattening strings. | 7316 // Helper function for flattening strings. |
7329 template <typename sinkchar> | 7317 template <typename sinkchar> |
7330 static void WriteToFlat(String* source, | 7318 static void WriteToFlat(String* source, |
7331 sinkchar* sink, | 7319 sinkchar* sink, |
7332 int from, | 7320 int from, |
7333 int to); | 7321 int to); |
7334 | 7322 |
7335 // The return value may point to the first aligned word containing the | 7323 // The return value may point to the first aligned word containing the |
7336 // first non-ascii character, rather than directly to the non-ascii character. | 7324 // first non-ascii character, rather than directly to the non-ascii character. |
7337 // If the return value is >= the passed length, the entire string was ASCII. | 7325 // If the return value is >= the passed length, the entire string was ASCII. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7376 } | 7364 } |
7377 | 7365 |
7378 template<class Visitor, class ConsOp> | 7366 template<class Visitor, class ConsOp> |
7379 static inline void Visit(String* string, | 7367 static inline void Visit(String* string, |
7380 unsigned offset, | 7368 unsigned offset, |
7381 Visitor& visitor, | 7369 Visitor& visitor, |
7382 ConsOp& cons_op, | 7370 ConsOp& cons_op, |
7383 int32_t type, | 7371 int32_t type, |
7384 unsigned length); | 7372 unsigned length); |
7385 | 7373 |
7386 protected: | |
7387 class ReadBlockBuffer { | |
7388 public: | |
7389 ReadBlockBuffer(unibrow::byte* util_buffer_, | |
7390 unsigned cursor_, | |
7391 unsigned capacity_, | |
7392 unsigned remaining_) : | |
7393 util_buffer(util_buffer_), | |
7394 cursor(cursor_), | |
7395 capacity(capacity_), | |
7396 remaining(remaining_) { | |
7397 } | |
7398 unibrow::byte* util_buffer; | |
7399 unsigned cursor; | |
7400 unsigned capacity; | |
7401 unsigned remaining; | |
7402 }; | |
7403 | |
7404 static inline const unibrow::byte* ReadBlock(String* input, | |
7405 ReadBlockBuffer* buffer, | |
7406 unsigned* offset, | |
7407 unsigned max_chars); | |
7408 static void ReadBlockIntoBuffer(String* input, | |
7409 ReadBlockBuffer* buffer, | |
7410 unsigned* offset_ptr, | |
7411 unsigned max_chars); | |
7412 | |
7413 private: | 7374 private: |
7414 // Try to flatten the top level ConsString that is hiding behind this | 7375 // Try to flatten the top level ConsString that is hiding behind this |
7415 // string. This is a no-op unless the string is a ConsString. Flatten | 7376 // string. This is a no-op unless the string is a ConsString. Flatten |
7416 // mutates the ConsString and might return a failure. | 7377 // mutates the ConsString and might return a failure. |
7417 MUST_USE_RESULT MaybeObject* SlowTryFlatten(PretenureFlag pretenure); | 7378 MUST_USE_RESULT MaybeObject* SlowTryFlatten(PretenureFlag pretenure); |
7418 | 7379 |
7419 static inline bool IsHashFieldComputed(uint32_t field); | 7380 static inline bool IsHashFieldComputed(uint32_t field); |
7420 | 7381 |
7421 // Slow case of String::Equals. This implementation works on any strings | 7382 // Slow case of String::Equals. This implementation works on any strings |
7422 // but it is most efficient on strings that are almost flat. | 7383 // but it is most efficient on strings that are almost flat. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7478 static int SizeFor(int length) { | 7439 static int SizeFor(int length) { |
7479 return OBJECT_POINTER_ALIGN(kHeaderSize + length * kCharSize); | 7440 return OBJECT_POINTER_ALIGN(kHeaderSize + length * kCharSize); |
7480 } | 7441 } |
7481 | 7442 |
7482 // Maximal memory usage for a single sequential ASCII string. | 7443 // Maximal memory usage for a single sequential ASCII string. |
7483 static const int kMaxSize = 512 * MB - 1; | 7444 static const int kMaxSize = 512 * MB - 1; |
7484 // Maximal length of a single sequential ASCII string. | 7445 // Maximal length of a single sequential ASCII string. |
7485 // Q.v. String::kMaxLength which is the maximal size of concatenated strings. | 7446 // Q.v. String::kMaxLength which is the maximal size of concatenated strings. |
7486 static const int kMaxLength = (kMaxSize - kHeaderSize); | 7447 static const int kMaxLength = (kMaxSize - kHeaderSize); |
7487 | 7448 |
7488 // Support for StringInputBuffer. | |
7489 inline void SeqOneByteStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | |
7490 unsigned* offset, | |
7491 unsigned chars); | |
7492 inline const unibrow::byte* SeqOneByteStringReadBlock(unsigned* remaining, | |
7493 unsigned* offset, | |
7494 unsigned chars); | |
7495 | |
7496 DECLARE_VERIFIER(SeqOneByteString) | 7449 DECLARE_VERIFIER(SeqOneByteString) |
7497 | 7450 |
7498 private: | 7451 private: |
7499 DISALLOW_IMPLICIT_CONSTRUCTORS(SeqOneByteString); | 7452 DISALLOW_IMPLICIT_CONSTRUCTORS(SeqOneByteString); |
7500 }; | 7453 }; |
7501 | 7454 |
7502 | 7455 |
7503 // The TwoByteString class captures sequential unicode string objects. | 7456 // The TwoByteString class captures sequential unicode string objects. |
7504 // Each character in the TwoByteString is a two-byte uint16_t. | 7457 // Each character in the TwoByteString is a two-byte uint16_t. |
7505 class SeqTwoByteString: public SeqString { | 7458 class SeqTwoByteString: public SeqString { |
(...skipping 24 matching lines...) Expand all Loading... |
7530 static int SizeFor(int length) { | 7483 static int SizeFor(int length) { |
7531 return OBJECT_POINTER_ALIGN(kHeaderSize + length * kShortSize); | 7484 return OBJECT_POINTER_ALIGN(kHeaderSize + length * kShortSize); |
7532 } | 7485 } |
7533 | 7486 |
7534 // Maximal memory usage for a single sequential two-byte string. | 7487 // Maximal memory usage for a single sequential two-byte string. |
7535 static const int kMaxSize = 512 * MB - 1; | 7488 static const int kMaxSize = 512 * MB - 1; |
7536 // Maximal length of a single sequential two-byte string. | 7489 // Maximal length of a single sequential two-byte string. |
7537 // Q.v. String::kMaxLength which is the maximal size of concatenated strings. | 7490 // Q.v. String::kMaxLength which is the maximal size of concatenated strings. |
7538 static const int kMaxLength = (kMaxSize - kHeaderSize) / sizeof(uint16_t); | 7491 static const int kMaxLength = (kMaxSize - kHeaderSize) / sizeof(uint16_t); |
7539 | 7492 |
7540 // Support for StringInputBuffer. | |
7541 inline void SeqTwoByteStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | |
7542 unsigned* offset_ptr, | |
7543 unsigned chars); | |
7544 | |
7545 private: | 7493 private: |
7546 DISALLOW_IMPLICIT_CONSTRUCTORS(SeqTwoByteString); | 7494 DISALLOW_IMPLICIT_CONSTRUCTORS(SeqTwoByteString); |
7547 }; | 7495 }; |
7548 | 7496 |
7549 | 7497 |
7550 // The ConsString class describes string values built by using the | 7498 // The ConsString class describes string values built by using the |
7551 // addition operator on strings. A ConsString is a pair where the | 7499 // addition operator on strings. A ConsString is a pair where the |
7552 // first and second components are pointers to other string values. | 7500 // first and second components are pointers to other string values. |
7553 // One or both components of a ConsString can be pointers to other | 7501 // One or both components of a ConsString can be pointers to other |
7554 // ConsStrings, creating a binary tree of ConsStrings where the leaves | 7502 // ConsStrings, creating a binary tree of ConsStrings where the leaves |
(...skipping 22 matching lines...) Expand all Loading... |
7577 uint16_t ConsStringGet(int index); | 7525 uint16_t ConsStringGet(int index); |
7578 | 7526 |
7579 // Casting. | 7527 // Casting. |
7580 static inline ConsString* cast(Object* obj); | 7528 static inline ConsString* cast(Object* obj); |
7581 | 7529 |
7582 // Layout description. | 7530 // Layout description. |
7583 static const int kFirstOffset = POINTER_SIZE_ALIGN(String::kSize); | 7531 static const int kFirstOffset = POINTER_SIZE_ALIGN(String::kSize); |
7584 static const int kSecondOffset = kFirstOffset + kPointerSize; | 7532 static const int kSecondOffset = kFirstOffset + kPointerSize; |
7585 static const int kSize = kSecondOffset + kPointerSize; | 7533 static const int kSize = kSecondOffset + kPointerSize; |
7586 | 7534 |
7587 // Support for StringInputBuffer. | |
7588 inline const unibrow::byte* ConsStringReadBlock(ReadBlockBuffer* buffer, | |
7589 unsigned* offset_ptr, | |
7590 unsigned chars); | |
7591 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | |
7592 unsigned* offset_ptr, | |
7593 unsigned chars); | |
7594 | |
7595 // Minimum length for a cons string. | 7535 // Minimum length for a cons string. |
7596 static const int kMinLength = 13; | 7536 static const int kMinLength = 13; |
7597 | 7537 |
7598 typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> | 7538 typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> |
7599 BodyDescriptor; | 7539 BodyDescriptor; |
7600 | 7540 |
7601 DECLARE_VERIFIER(ConsString) | 7541 DECLARE_VERIFIER(ConsString) |
7602 | 7542 |
7603 private: | 7543 private: |
7604 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); | 7544 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); |
(...skipping 24 matching lines...) Expand all Loading... |
7629 uint16_t SlicedStringGet(int index); | 7569 uint16_t SlicedStringGet(int index); |
7630 | 7570 |
7631 // Casting. | 7571 // Casting. |
7632 static inline SlicedString* cast(Object* obj); | 7572 static inline SlicedString* cast(Object* obj); |
7633 | 7573 |
7634 // Layout description. | 7574 // Layout description. |
7635 static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize); | 7575 static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize); |
7636 static const int kOffsetOffset = kParentOffset + kPointerSize; | 7576 static const int kOffsetOffset = kParentOffset + kPointerSize; |
7637 static const int kSize = kOffsetOffset + kPointerSize; | 7577 static const int kSize = kOffsetOffset + kPointerSize; |
7638 | 7578 |
7639 // Support for StringInputBuffer | |
7640 inline const unibrow::byte* SlicedStringReadBlock(ReadBlockBuffer* buffer, | |
7641 unsigned* offset_ptr, | |
7642 unsigned chars); | |
7643 inline void SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | |
7644 unsigned* offset_ptr, | |
7645 unsigned chars); | |
7646 // Minimum length for a sliced string. | 7579 // Minimum length for a sliced string. |
7647 static const int kMinLength = 13; | 7580 static const int kMinLength = 13; |
7648 | 7581 |
7649 typedef FixedBodyDescriptor<kParentOffset, | 7582 typedef FixedBodyDescriptor<kParentOffset, |
7650 kOffsetOffset + kPointerSize, kSize> | 7583 kOffsetOffset + kPointerSize, kSize> |
7651 BodyDescriptor; | 7584 BodyDescriptor; |
7652 | 7585 |
7653 DECLARE_VERIFIER(SlicedString) | 7586 DECLARE_VERIFIER(SlicedString) |
7654 | 7587 |
7655 private: | 7588 private: |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7712 | 7645 |
7713 // Casting. | 7646 // Casting. |
7714 static inline ExternalAsciiString* cast(Object* obj); | 7647 static inline ExternalAsciiString* cast(Object* obj); |
7715 | 7648 |
7716 // Garbage collection support. | 7649 // Garbage collection support. |
7717 inline void ExternalAsciiStringIterateBody(ObjectVisitor* v); | 7650 inline void ExternalAsciiStringIterateBody(ObjectVisitor* v); |
7718 | 7651 |
7719 template<typename StaticVisitor> | 7652 template<typename StaticVisitor> |
7720 inline void ExternalAsciiStringIterateBody(); | 7653 inline void ExternalAsciiStringIterateBody(); |
7721 | 7654 |
7722 // Support for StringInputBuffer. | |
7723 const unibrow::byte* ExternalAsciiStringReadBlock(unsigned* remaining, | |
7724 unsigned* offset, | |
7725 unsigned chars); | |
7726 inline void ExternalAsciiStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | |
7727 unsigned* offset, | |
7728 unsigned chars); | |
7729 | |
7730 private: | 7655 private: |
7731 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalAsciiString); | 7656 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalAsciiString); |
7732 }; | 7657 }; |
7733 | 7658 |
7734 | 7659 |
7735 // The ExternalTwoByteString class is an external string backed by a UTF-16 | 7660 // The ExternalTwoByteString class is an external string backed by a UTF-16 |
7736 // encoded string. | 7661 // encoded string. |
7737 class ExternalTwoByteString: public ExternalString { | 7662 class ExternalTwoByteString: public ExternalString { |
7738 public: | 7663 public: |
7739 static const bool kHasAsciiEncoding = false; | 7664 static const bool kHasAsciiEncoding = false; |
(...skipping 20 matching lines...) Expand all Loading... |
7760 | 7685 |
7761 // Casting. | 7686 // Casting. |
7762 static inline ExternalTwoByteString* cast(Object* obj); | 7687 static inline ExternalTwoByteString* cast(Object* obj); |
7763 | 7688 |
7764 // Garbage collection support. | 7689 // Garbage collection support. |
7765 inline void ExternalTwoByteStringIterateBody(ObjectVisitor* v); | 7690 inline void ExternalTwoByteStringIterateBody(ObjectVisitor* v); |
7766 | 7691 |
7767 template<typename StaticVisitor> | 7692 template<typename StaticVisitor> |
7768 inline void ExternalTwoByteStringIterateBody(); | 7693 inline void ExternalTwoByteStringIterateBody(); |
7769 | 7694 |
7770 | |
7771 // Support for StringInputBuffer. | |
7772 void ExternalTwoByteStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | |
7773 unsigned* offset_ptr, | |
7774 unsigned chars); | |
7775 | |
7776 private: | 7695 private: |
7777 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); | 7696 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); |
7778 }; | 7697 }; |
7779 | 7698 |
7780 | 7699 |
7781 // Utility superclass for stack-allocated objects that must be updated | 7700 // Utility superclass for stack-allocated objects that must be updated |
7782 // on gc. It provides two ways for the gc to update instances, either | 7701 // on gc. It provides two ways for the gc to update instances, either |
7783 // iterating or updating after gc. | 7702 // iterating or updating after gc. |
7784 class Relocatable BASE_EMBEDDED { | 7703 class Relocatable BASE_EMBEDDED { |
7785 public: | 7704 public: |
(...skipping 26 matching lines...) Expand all Loading... |
7812 inline uc32 Get(int index); | 7731 inline uc32 Get(int index); |
7813 int length() { return length_; } | 7732 int length() { return length_; } |
7814 private: | 7733 private: |
7815 String** str_; | 7734 String** str_; |
7816 bool is_ascii_; | 7735 bool is_ascii_; |
7817 int length_; | 7736 int length_; |
7818 const void* start_; | 7737 const void* start_; |
7819 }; | 7738 }; |
7820 | 7739 |
7821 | 7740 |
7822 // Note that StringInputBuffers are not valid across a GC! To fix this | |
7823 // it would have to store a String Handle instead of a String* and | |
7824 // AsciiStringReadBlock would have to be modified to use memcpy. | |
7825 // | |
7826 // StringInputBuffer is able to traverse any string regardless of how | |
7827 // deeply nested a sequence of ConsStrings it is made of. However, | |
7828 // performance will be better if deep strings are flattened before they | |
7829 // are traversed. Since flattening requires memory allocation this is | |
7830 // not always desirable, however (esp. in debugging situations). | |
7831 class StringInputBuffer: public unibrow::InputBuffer<String, String*, 1024> { | |
7832 public: | |
7833 virtual void Seek(unsigned pos); | |
7834 inline StringInputBuffer(): unibrow::InputBuffer<String, String*, 1024>() {} | |
7835 explicit inline StringInputBuffer(String* backing): | |
7836 unibrow::InputBuffer<String, String*, 1024>(backing) {} | |
7837 }; | |
7838 | |
7839 | |
7840 // A ConsStringOp that returns null. | 7741 // A ConsStringOp that returns null. |
7841 // Useful when the operation to apply on a ConsString | 7742 // Useful when the operation to apply on a ConsString |
7842 // requires an expensive data structure. | 7743 // requires an expensive data structure. |
7843 class ConsStringNullOp { | 7744 class ConsStringNullOp { |
7844 public: | 7745 public: |
7845 inline ConsStringNullOp() {} | 7746 inline ConsStringNullOp() {} |
7846 static inline String* Operate(String*, unsigned*, int32_t*, unsigned*); | 7747 static inline String* Operate(String*, unsigned*, int32_t*, unsigned*); |
7847 private: | 7748 private: |
7848 DISALLOW_COPY_AND_ASSIGN(ConsStringNullOp); | 7749 DISALLOW_COPY_AND_ASSIGN(ConsStringNullOp); |
7849 }; | 7750 }; |
(...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8885 } else { | 8786 } else { |
8886 value &= ~(1 << bit_position); | 8787 value &= ~(1 << bit_position); |
8887 } | 8788 } |
8888 return value; | 8789 return value; |
8889 } | 8790 } |
8890 }; | 8791 }; |
8891 | 8792 |
8892 } } // namespace v8::internal | 8793 } } // namespace v8::internal |
8893 | 8794 |
8894 #endif // V8_OBJECTS_H_ | 8795 #endif // V8_OBJECTS_H_ |
OLD | NEW |