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

Side by Side Diff: src/objects-inl.h

Issue 140953002: Refactor string internalization. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: whitespace Created 6 years, 11 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/objects.cc ('k') | no next file » | 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 6654 matching lines...) Expand 10 before | Expand all | Expand 10 after
6665 #undef READ_INTPTR_FIELD 6665 #undef READ_INTPTR_FIELD
6666 #undef WRITE_INTPTR_FIELD 6666 #undef WRITE_INTPTR_FIELD
6667 #undef READ_UINT32_FIELD 6667 #undef READ_UINT32_FIELD
6668 #undef WRITE_UINT32_FIELD 6668 #undef WRITE_UINT32_FIELD
6669 #undef READ_SHORT_FIELD 6669 #undef READ_SHORT_FIELD
6670 #undef WRITE_SHORT_FIELD 6670 #undef WRITE_SHORT_FIELD
6671 #undef READ_BYTE_FIELD 6671 #undef READ_BYTE_FIELD
6672 #undef WRITE_BYTE_FIELD 6672 #undef WRITE_BYTE_FIELD
6673 6673
6674 6674
6675 template <typename Char>
6676 class SequentialStringKey : public HashTableKey {
6677 public:
6678 explicit SequentialStringKey(Vector<const Char> string, uint32_t seed)
6679 : string_(string), hash_field_(0), seed_(seed) { }
6680
6681 uint32_t Hash() {
marja 2014/01/16 16:18:18 Drive-by coding style nit: don't you need to mark
ulan 2014/01/16 16:23:11 I guess we don't need to mark them as virtual. I s
6682 hash_field_ = StringHasher::HashSequentialString<Char>(string_.start(),
6683 string_.length(),
6684 seed_);
6685
6686 uint32_t result = hash_field_ >> String::kHashShift;
6687 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed.
6688 return result;
6689 }
6690
6691
6692 uint32_t HashForObject(Object* other) {
6693 return String::cast(other)->Hash();
6694 }
6695
6696 Vector<const Char> string_;
6697 uint32_t hash_field_;
6698 uint32_t seed_;
6699 };
6700
6701
6702 class OneByteStringKey : public SequentialStringKey<uint8_t> {
6703 public:
6704 OneByteStringKey(Vector<const uint8_t> str, uint32_t seed)
6705 : SequentialStringKey<uint8_t>(str, seed) { }
6706
6707 bool IsMatch(Object* string) {
6708 return String::cast(string)->IsOneByteEqualTo(string_);
6709 }
6710
6711 MaybeObject* AsObject(Heap* heap);
6712 };
6713
6714
6715 class SubStringOneByteStringKey : public HashTableKey {
6716 public:
6717 explicit SubStringOneByteStringKey(Handle<SeqOneByteString> string,
6718 int from,
6719 int length)
6720 : string_(string), from_(from), length_(length) { }
6721
6722 uint32_t Hash() {
6723 ASSERT(length_ >= 0);
6724 ASSERT(from_ + length_ <= string_->length());
6725 uint8_t* chars = string_->GetChars() + from_;
6726 hash_field_ = StringHasher::HashSequentialString(
6727 chars, length_, string_->GetHeap()->HashSeed());
6728 uint32_t result = hash_field_ >> String::kHashShift;
6729 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed.
6730 return result;
6731 }
6732
6733
6734 uint32_t HashForObject(Object* other) {
6735 return String::cast(other)->Hash();
6736 }
6737
6738 bool IsMatch(Object* string) {
6739 Vector<const uint8_t> chars(string_->GetChars() + from_, length_);
6740 return String::cast(string)->IsOneByteEqualTo(chars);
6741 }
6742
6743 MaybeObject* AsObject(Heap* heap);
6744
6745 private:
6746 Handle<SeqOneByteString> string_;
6747 int from_;
6748 int length_;
6749 uint32_t hash_field_;
6750 };
6751
6752
6753 class TwoByteStringKey : public SequentialStringKey<uc16> {
6754 public:
6755 explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed)
6756 : SequentialStringKey<uc16>(str, seed) { }
6757
6758 bool IsMatch(Object* string) {
6759 return String::cast(string)->IsTwoByteEqualTo(string_);
6760 }
6761
6762 MaybeObject* AsObject(Heap* heap);
6763 };
6764
6765
6766 // Utf8StringKey carries a vector of chars as key.
6767 class Utf8StringKey : public HashTableKey {
6768 public:
6769 explicit Utf8StringKey(Vector<const char> string, uint32_t seed)
6770 : string_(string), hash_field_(0), seed_(seed) { }
6771
6772 bool IsMatch(Object* string) {
6773 return String::cast(string)->IsUtf8EqualTo(string_);
6774 }
6775
6776 uint32_t Hash() {
6777 if (hash_field_ != 0) return hash_field_ >> String::kHashShift;
6778 hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_);
6779 uint32_t result = hash_field_ >> String::kHashShift;
6780 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed.
6781 return result;
6782 }
6783
6784 uint32_t HashForObject(Object* other) {
6785 return String::cast(other)->Hash();
6786 }
6787
6788 MaybeObject* AsObject(Heap* heap) {
6789 if (hash_field_ == 0) Hash();
6790 return heap->AllocateInternalizedStringFromUtf8(string_,
6791 chars_,
6792 hash_field_);
6793 }
6794
6795 Vector<const char> string_;
6796 uint32_t hash_field_;
6797 int chars_; // Caches the number of characters when computing the hash code.
6798 uint32_t seed_;
6799 };
6800
6801
6675 } } // namespace v8::internal 6802 } } // namespace v8::internal
6676 6803
6677 #endif // V8_OBJECTS_INL_H_ 6804 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698