| 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 6911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6922 // Should only be called if hash code has not yet been computed. | 6922 // Should only be called if hash code has not yet been computed. |
| 6923 ASSERT(!HasHashCode()); | 6923 ASSERT(!HasHashCode()); |
| 6924 | 6924 |
| 6925 const int len = length(); | 6925 const int len = length(); |
| 6926 | 6926 |
| 6927 // Compute the hash code. | 6927 // Compute the hash code. |
| 6928 uint32_t field = 0; | 6928 uint32_t field = 0; |
| 6929 if (StringShape(this).IsSequentialAscii()) { | 6929 if (StringShape(this).IsSequentialAscii()) { |
| 6930 field = HashSequentialString(SeqAsciiString::cast(this)->GetChars(), | 6930 field = HashSequentialString(SeqAsciiString::cast(this)->GetChars(), |
| 6931 len, | 6931 len, |
| 6932 GetHeap()->StringHashSeed()); | 6932 GetHeap()->HashSeed()); |
| 6933 } else if (StringShape(this).IsSequentialTwoByte()) { | 6933 } else if (StringShape(this).IsSequentialTwoByte()) { |
| 6934 field = HashSequentialString(SeqTwoByteString::cast(this)->GetChars(), | 6934 field = HashSequentialString(SeqTwoByteString::cast(this)->GetChars(), |
| 6935 len, | 6935 len, |
| 6936 GetHeap()->StringHashSeed()); | 6936 GetHeap()->HashSeed()); |
| 6937 } else { | 6937 } else { |
| 6938 StringInputBuffer buffer(this); | 6938 StringInputBuffer buffer(this); |
| 6939 field = ComputeHashField(&buffer, len, GetHeap()->StringHashSeed()); | 6939 field = ComputeHashField(&buffer, len, GetHeap()->HashSeed()); |
| 6940 } | 6940 } |
| 6941 | 6941 |
| 6942 // Store the hash code in the object. | 6942 // Store the hash code in the object. |
| 6943 set_hash_field(field); | 6943 set_hash_field(field); |
| 6944 | 6944 |
| 6945 // Check the hash code is there. | 6945 // Check the hash code is there. |
| 6946 ASSERT(HasHashCode()); | 6946 ASSERT(HasHashCode()); |
| 6947 uint32_t result = field >> kHashShift; | 6947 uint32_t result = field >> kHashShift; |
| 6948 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. | 6948 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. |
| 6949 return result; | 6949 return result; |
| (...skipping 3761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10711 public: | 10711 public: |
| 10712 explicit SubStringAsciiSymbolKey(Handle<SeqAsciiString> string, | 10712 explicit SubStringAsciiSymbolKey(Handle<SeqAsciiString> string, |
| 10713 int from, | 10713 int from, |
| 10714 int length, | 10714 int length, |
| 10715 uint32_t seed) | 10715 uint32_t seed) |
| 10716 : string_(string), from_(from), length_(length), seed_(seed) { } | 10716 : string_(string), from_(from), length_(length), seed_(seed) { } |
| 10717 | 10717 |
| 10718 uint32_t Hash() { | 10718 uint32_t Hash() { |
| 10719 ASSERT(length_ >= 0); | 10719 ASSERT(length_ >= 0); |
| 10720 ASSERT(from_ + length_ <= string_->length()); | 10720 ASSERT(from_ + length_ <= string_->length()); |
| 10721 StringHasher hasher(length_, string_->GetHeap()->StringHashSeed()); | 10721 StringHasher hasher(length_, string_->GetHeap()->HashSeed()); |
| 10722 | 10722 |
| 10723 // Very long strings have a trivial hash that doesn't inspect the | 10723 // Very long strings have a trivial hash that doesn't inspect the |
| 10724 // string contents. | 10724 // string contents. |
| 10725 if (hasher.has_trivial_hash()) { | 10725 if (hasher.has_trivial_hash()) { |
| 10726 hash_field_ = hasher.GetHashField(); | 10726 hash_field_ = hasher.GetHashField(); |
| 10727 } else { | 10727 } else { |
| 10728 int i = 0; | 10728 int i = 0; |
| 10729 // Do the iterative array index computation as long as there is a | 10729 // Do the iterative array index computation as long as there is a |
| 10730 // chance this is an array index. | 10730 // chance this is an array index. |
| 10731 while (i < length_ && hasher.is_array_index()) { | 10731 while (i < length_ && hasher.is_array_index()) { |
| (...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11629 ASSERT(StringShape(result).IsSymbol()); | 11629 ASSERT(StringShape(result).IsSymbol()); |
| 11630 *symbol = result; | 11630 *symbol = result; |
| 11631 return true; | 11631 return true; |
| 11632 } | 11632 } |
| 11633 } | 11633 } |
| 11634 | 11634 |
| 11635 | 11635 |
| 11636 bool SymbolTable::LookupTwoCharsSymbolIfExists(uint32_t c1, | 11636 bool SymbolTable::LookupTwoCharsSymbolIfExists(uint32_t c1, |
| 11637 uint32_t c2, | 11637 uint32_t c2, |
| 11638 String** symbol) { | 11638 String** symbol) { |
| 11639 TwoCharHashTableKey key(c1, c2, GetHeap()->StringHashSeed()); | 11639 TwoCharHashTableKey key(c1, c2, GetHeap()->HashSeed()); |
| 11640 int entry = FindEntry(&key); | 11640 int entry = FindEntry(&key); |
| 11641 if (entry == kNotFound) { | 11641 if (entry == kNotFound) { |
| 11642 return false; | 11642 return false; |
| 11643 } else { | 11643 } else { |
| 11644 String* result = String::cast(KeyAt(entry)); | 11644 String* result = String::cast(KeyAt(entry)); |
| 11645 ASSERT(StringShape(result).IsSymbol()); | 11645 ASSERT(StringShape(result).IsSymbol()); |
| 11646 *symbol = result; | 11646 *symbol = result; |
| 11647 return true; | 11647 return true; |
| 11648 } | 11648 } |
| 11649 } | 11649 } |
| 11650 | 11650 |
| 11651 | 11651 |
| 11652 MaybeObject* SymbolTable::LookupSymbol(Vector<const char> str, | 11652 MaybeObject* SymbolTable::LookupSymbol(Vector<const char> str, |
| 11653 Object** s) { | 11653 Object** s) { |
| 11654 Utf8SymbolKey key(str, GetHeap()->StringHashSeed()); | 11654 Utf8SymbolKey key(str, GetHeap()->HashSeed()); |
| 11655 return LookupKey(&key, s); | 11655 return LookupKey(&key, s); |
| 11656 } | 11656 } |
| 11657 | 11657 |
| 11658 | 11658 |
| 11659 MaybeObject* SymbolTable::LookupAsciiSymbol(Vector<const char> str, | 11659 MaybeObject* SymbolTable::LookupAsciiSymbol(Vector<const char> str, |
| 11660 Object** s) { | 11660 Object** s) { |
| 11661 AsciiSymbolKey key(str, GetHeap()->StringHashSeed()); | 11661 AsciiSymbolKey key(str, GetHeap()->HashSeed()); |
| 11662 return LookupKey(&key, s); | 11662 return LookupKey(&key, s); |
| 11663 } | 11663 } |
| 11664 | 11664 |
| 11665 | 11665 |
| 11666 MaybeObject* SymbolTable::LookupSubStringAsciiSymbol(Handle<SeqAsciiString> str, | 11666 MaybeObject* SymbolTable::LookupSubStringAsciiSymbol(Handle<SeqAsciiString> str, |
| 11667 int from, | 11667 int from, |
| 11668 int length, | 11668 int length, |
| 11669 Object** s) { | 11669 Object** s) { |
| 11670 SubStringAsciiSymbolKey key(str, from, length, GetHeap()->StringHashSeed()); | 11670 SubStringAsciiSymbolKey key(str, from, length, GetHeap()->HashSeed()); |
| 11671 return LookupKey(&key, s); | 11671 return LookupKey(&key, s); |
| 11672 } | 11672 } |
| 11673 | 11673 |
| 11674 | 11674 |
| 11675 MaybeObject* SymbolTable::LookupTwoByteSymbol(Vector<const uc16> str, | 11675 MaybeObject* SymbolTable::LookupTwoByteSymbol(Vector<const uc16> str, |
| 11676 Object** s) { | 11676 Object** s) { |
| 11677 TwoByteSymbolKey key(str, GetHeap()->StringHashSeed()); | 11677 TwoByteSymbolKey key(str, GetHeap()->HashSeed()); |
| 11678 return LookupKey(&key, s); | 11678 return LookupKey(&key, s); |
| 11679 } | 11679 } |
| 11680 | 11680 |
| 11681 MaybeObject* SymbolTable::LookupKey(HashTableKey* key, Object** s) { | 11681 MaybeObject* SymbolTable::LookupKey(HashTableKey* key, Object** s) { |
| 11682 int entry = FindEntry(key); | 11682 int entry = FindEntry(key); |
| 11683 | 11683 |
| 11684 // Symbol already in table. | 11684 // Symbol already in table. |
| 11685 if (entry != kNotFound) { | 11685 if (entry != kNotFound) { |
| 11686 *s = KeyAt(entry); | 11686 *s = KeyAt(entry); |
| 11687 return this; | 11687 return this; |
| (...skipping 1056 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12744 if (break_point_objects()->IsUndefined()) return 0; | 12744 if (break_point_objects()->IsUndefined()) return 0; |
| 12745 // Single break point. | 12745 // Single break point. |
| 12746 if (!break_point_objects()->IsFixedArray()) return 1; | 12746 if (!break_point_objects()->IsFixedArray()) return 1; |
| 12747 // Multiple break points. | 12747 // Multiple break points. |
| 12748 return FixedArray::cast(break_point_objects())->length(); | 12748 return FixedArray::cast(break_point_objects())->length(); |
| 12749 } | 12749 } |
| 12750 #endif // ENABLE_DEBUGGER_SUPPORT | 12750 #endif // ENABLE_DEBUGGER_SUPPORT |
| 12751 | 12751 |
| 12752 | 12752 |
| 12753 } } // namespace v8::internal | 12753 } } // namespace v8::internal |
| OLD | NEW |