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 5449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5460 uc32 r = decoder->GetNext(); | 5460 uc32 r = decoder->GetNext(); |
5461 if (Get(i) != r) return false; | 5461 if (Get(i) != r) return false; |
5462 } | 5462 } |
5463 return i == slen && !decoder->has_more(); | 5463 return i == slen && !decoder->has_more(); |
5464 } | 5464 } |
5465 | 5465 |
5466 | 5466 |
5467 bool String::IsAsciiEqualTo(Vector<const char> str) { | 5467 bool String::IsAsciiEqualTo(Vector<const char> str) { |
5468 int slen = length(); | 5468 int slen = length(); |
5469 if (str.length() != slen) return false; | 5469 if (str.length() != slen) return false; |
5470 for (int i = 0; i < slen; i++) { | 5470 if (this->IsSeqAsciiString()) { |
5471 if (Get(i) != static_cast<uint16_t>(str[i])) return false; | 5471 SeqAsciiString* seq = SeqAsciiString::cast(this); |
5472 char* ch = seq->GetChars(); | |
5473 for (int i = 0; i < slen; i++, ch++) { | |
5474 if (*ch != str[i]) return false; | |
5475 } | |
5476 } else { | |
5477 for (int i = 0; i < slen; i++) { | |
5478 if (Get(i) != static_cast<uint16_t>(str[i])) return false; | |
Lasse Reichstein
2011/05/19 07:27:40
Potentially unnecessarily slow for deeply nested c
Rico
2011/05/23 18:18:12
This is the existing version, so I will leave as i
| |
5479 } | |
5472 } | 5480 } |
5473 return true; | 5481 return true; |
5474 } | 5482 } |
5475 | 5483 |
5476 | 5484 |
5477 bool String::IsTwoByteEqualTo(Vector<const uc16> str) { | 5485 bool String::IsTwoByteEqualTo(Vector<const uc16> str) { |
5478 int slen = length(); | 5486 int slen = length(); |
5479 if (str.length() != slen) return false; | 5487 if (str.length() != slen) return false; |
5480 for (int i = 0; i < slen; i++) { | 5488 for (int i = 0; i < slen; i++) { |
5481 if (Get(i) != str[i]) return false; | 5489 if (Get(i) != str[i]) return false; |
(...skipping 3207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8689 return String::cast(string)->IsAsciiEqualTo(string_); | 8697 return String::cast(string)->IsAsciiEqualTo(string_); |
8690 } | 8698 } |
8691 | 8699 |
8692 MaybeObject* AsObject() { | 8700 MaybeObject* AsObject() { |
8693 if (hash_field_ == 0) Hash(); | 8701 if (hash_field_ == 0) Hash(); |
8694 return HEAP->AllocateAsciiSymbol(string_, hash_field_); | 8702 return HEAP->AllocateAsciiSymbol(string_, hash_field_); |
8695 } | 8703 } |
8696 }; | 8704 }; |
8697 | 8705 |
8698 | 8706 |
8707 class SubStringAsciiSymbolKey : public HashTableKey { | |
8708 public: | |
8709 explicit SubStringAsciiSymbolKey(Handle<SeqAsciiString> string, | |
8710 int from, | |
8711 int length) | |
8712 : string_(string), from_(from), length_(length) { } | |
8713 | |
8714 uint32_t Hash() { | |
8715 ASSERT(length_ >= 0); | |
8716 ASSERT(from_ + length_ <= string_->length()); | |
8717 StringHasher hasher(length_); | |
8718 | |
8719 // Very long strings have a trivial hash that doesn't inspect the | |
8720 // string contents. | |
8721 if (hasher.has_trivial_hash()) { | |
8722 hash_field_ = hasher.GetHashField(); | |
8723 } else { | |
8724 int i = 0; | |
8725 // Do the iterative array index computation as long as there is a | |
8726 // chance this is an array index. | |
8727 while (i < length_ && hasher.is_array_index()) { | |
8728 hasher.AddCharacter(static_cast<uc32>( | |
8729 string_->SeqAsciiStringGet(i + from_))); | |
8730 i++; | |
8731 } | |
8732 | |
8733 // Process the remaining characters without updating the array | |
8734 // index. | |
8735 while (i < length_) { | |
8736 hasher.AddCharacterNoIndex(static_cast<uc32>( | |
8737 string_->SeqAsciiStringGet(i + from_))); | |
8738 i++; | |
8739 } | |
8740 hash_field_ = hasher.GetHashField(); | |
8741 } | |
8742 | |
8743 uint32_t result = hash_field_ >> String::kHashShift; | |
8744 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. | |
8745 return result; | |
8746 } | |
8747 | |
8748 | |
8749 uint32_t HashForObject(Object* other) { | |
8750 return String::cast(other)->Hash(); | |
8751 } | |
8752 | |
8753 bool IsMatch(Object* string) { | |
8754 Vector<const char> chars(string_->GetChars() + from_, length_); | |
8755 return String::cast(string)->IsAsciiEqualTo(chars); | |
8756 } | |
8757 | |
8758 MaybeObject* AsObject() { | |
8759 if (hash_field_ == 0) Hash(); | |
8760 Vector<const char> chars(string_->GetChars() + from_, length_); | |
8761 return HEAP->AllocateAsciiSymbol(chars, hash_field_); | |
8762 } | |
8763 | |
8764 private: | |
8765 Handle<SeqAsciiString> string_; | |
8766 int from_; | |
8767 int length_; | |
8768 uint32_t hash_field_; | |
8769 }; | |
8770 | |
8771 | |
8699 class TwoByteSymbolKey : public SequentialSymbolKey<uc16> { | 8772 class TwoByteSymbolKey : public SequentialSymbolKey<uc16> { |
8700 public: | 8773 public: |
8701 explicit TwoByteSymbolKey(Vector<const uc16> str) | 8774 explicit TwoByteSymbolKey(Vector<const uc16> str) |
8702 : SequentialSymbolKey<uc16>(str) { } | 8775 : SequentialSymbolKey<uc16>(str) { } |
8703 | 8776 |
8704 bool IsMatch(Object* string) { | 8777 bool IsMatch(Object* string) { |
8705 return String::cast(string)->IsTwoByteEqualTo(string_); | 8778 return String::cast(string)->IsTwoByteEqualTo(string_); |
8706 } | 8779 } |
8707 | 8780 |
8708 MaybeObject* AsObject() { | 8781 MaybeObject* AsObject() { |
(...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9483 } | 9556 } |
9484 | 9557 |
9485 | 9558 |
9486 MaybeObject* SymbolTable::LookupAsciiSymbol(Vector<const char> str, | 9559 MaybeObject* SymbolTable::LookupAsciiSymbol(Vector<const char> str, |
9487 Object** s) { | 9560 Object** s) { |
9488 AsciiSymbolKey key(str); | 9561 AsciiSymbolKey key(str); |
9489 return LookupKey(&key, s); | 9562 return LookupKey(&key, s); |
9490 } | 9563 } |
9491 | 9564 |
9492 | 9565 |
9566 MaybeObject* SymbolTable::LookupSubStringAsciiSymbol(Handle<SeqAsciiString> str, | |
9567 int from, | |
9568 int length, | |
9569 Object** s) { | |
9570 SubStringAsciiSymbolKey key(str, from, length); | |
9571 return LookupKey(&key, s); | |
9572 } | |
9573 | |
9574 | |
9493 MaybeObject* SymbolTable::LookupTwoByteSymbol(Vector<const uc16> str, | 9575 MaybeObject* SymbolTable::LookupTwoByteSymbol(Vector<const uc16> str, |
9494 Object** s) { | 9576 Object** s) { |
9495 TwoByteSymbolKey key(str); | 9577 TwoByteSymbolKey key(str); |
9496 return LookupKey(&key, s); | 9578 return LookupKey(&key, s); |
9497 } | 9579 } |
9498 | 9580 |
9499 MaybeObject* SymbolTable::LookupKey(HashTableKey* key, Object** s) { | 9581 MaybeObject* SymbolTable::LookupKey(HashTableKey* key, Object** s) { |
9500 int entry = FindEntry(key); | 9582 int entry = FindEntry(key); |
9501 | 9583 |
9502 // Symbol already in table. | 9584 // Symbol already in table. |
(...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10430 if (break_point_objects()->IsUndefined()) return 0; | 10512 if (break_point_objects()->IsUndefined()) return 0; |
10431 // Single beak point. | 10513 // Single beak point. |
10432 if (!break_point_objects()->IsFixedArray()) return 1; | 10514 if (!break_point_objects()->IsFixedArray()) return 1; |
10433 // Multiple break points. | 10515 // Multiple break points. |
10434 return FixedArray::cast(break_point_objects())->length(); | 10516 return FixedArray::cast(break_point_objects())->length(); |
10435 } | 10517 } |
10436 #endif | 10518 #endif |
10437 | 10519 |
10438 | 10520 |
10439 } } // namespace v8::internal | 10521 } } // namespace v8::internal |
OLD | NEW |