Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 7bd8d59801f249183ea5b4e454af576d07cf4734..fb996a219e28df171504916345c496394ab4c3c1 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -459,6 +459,133 @@ uc32 FlatStringReader::Get(int index) { |
} |
+template <typename Char> |
+class SequentialStringKey : public HashTableKey { |
+ public: |
+ explicit SequentialStringKey(Vector<const Char> string, uint32_t seed) |
+ : string_(string), hash_field_(0), seed_(seed) { } |
+ |
+ virtual uint32_t Hash() { |
+ hash_field_ = StringHasher::HashSequentialString<Char>(string_.start(), |
+ string_.length(), |
+ seed_); |
+ |
+ uint32_t result = hash_field_ >> String::kHashShift; |
+ ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. |
+ return result; |
+ } |
+ |
+ |
+ virtual uint32_t HashForObject(Object* other) { |
+ return String::cast(other)->Hash(); |
+ } |
+ |
+ Vector<const Char> string_; |
+ uint32_t hash_field_; |
+ uint32_t seed_; |
+}; |
+ |
+ |
+class OneByteStringKey : public SequentialStringKey<uint8_t> { |
+ public: |
+ OneByteStringKey(Vector<const uint8_t> str, uint32_t seed) |
+ : SequentialStringKey<uint8_t>(str, seed) { } |
+ |
+ virtual bool IsMatch(Object* string) { |
+ return String::cast(string)->IsOneByteEqualTo(string_); |
+ } |
+ |
+ virtual MaybeObject* AsObject(Heap* heap); |
+}; |
+ |
+ |
+class SubStringOneByteStringKey : public HashTableKey { |
+ public: |
+ explicit SubStringOneByteStringKey(Handle<SeqOneByteString> string, |
+ int from, |
+ int length) |
+ : string_(string), from_(from), length_(length) { } |
+ |
+ virtual uint32_t Hash() { |
+ ASSERT(length_ >= 0); |
+ ASSERT(from_ + length_ <= string_->length()); |
+ uint8_t* chars = string_->GetChars() + from_; |
+ hash_field_ = StringHasher::HashSequentialString( |
+ chars, length_, string_->GetHeap()->HashSeed()); |
+ uint32_t result = hash_field_ >> String::kHashShift; |
+ ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. |
+ return result; |
+ } |
+ |
+ |
+ virtual uint32_t HashForObject(Object* other) { |
+ return String::cast(other)->Hash(); |
+ } |
+ |
+ virtual bool IsMatch(Object* string) { |
+ Vector<const uint8_t> chars(string_->GetChars() + from_, length_); |
+ return String::cast(string)->IsOneByteEqualTo(chars); |
+ } |
+ |
+ virtual MaybeObject* AsObject(Heap* heap); |
+ |
+ private: |
+ Handle<SeqOneByteString> string_; |
+ int from_; |
+ int length_; |
+ uint32_t hash_field_; |
+}; |
+ |
+ |
+class TwoByteStringKey : public SequentialStringKey<uc16> { |
+ public: |
+ explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed) |
+ : SequentialStringKey<uc16>(str, seed) { } |
+ |
+ virtual bool IsMatch(Object* string) { |
+ return String::cast(string)->IsTwoByteEqualTo(string_); |
+ } |
+ |
+ virtual MaybeObject* AsObject(Heap* heap); |
+}; |
+ |
+ |
+// Utf8StringKey carries a vector of chars as key. |
+class Utf8StringKey : public HashTableKey { |
+ public: |
+ explicit Utf8StringKey(Vector<const char> string, uint32_t seed) |
+ : string_(string), hash_field_(0), seed_(seed) { } |
+ |
+ virtual bool IsMatch(Object* string) { |
+ return String::cast(string)->IsUtf8EqualTo(string_); |
+ } |
+ |
+ virtual uint32_t Hash() { |
+ if (hash_field_ != 0) return hash_field_ >> String::kHashShift; |
+ hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_); |
+ uint32_t result = hash_field_ >> String::kHashShift; |
+ ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. |
+ return result; |
+ } |
+ |
+ virtual uint32_t HashForObject(Object* other) { |
+ return String::cast(other)->Hash(); |
+ } |
+ |
+ virtual MaybeObject* AsObject(Heap* heap) { |
+ if (hash_field_ == 0) Hash(); |
+ return heap->AllocateInternalizedStringFromUtf8(string_, |
+ chars_, |
+ hash_field_); |
+ } |
+ |
+ Vector<const char> string_; |
+ uint32_t hash_field_; |
+ int chars_; // Caches the number of characters when computing the hash code. |
+ uint32_t seed_; |
+}; |
+ |
+ |
bool Object::IsNumber() { |
return IsSmi() || IsHeapNumber(); |
} |
@@ -6671,7 +6798,6 @@ void FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj, |
#undef READ_BYTE_FIELD |
#undef WRITE_BYTE_FIELD |
- |
} } // namespace v8::internal |
#endif // V8_OBJECTS_INL_H_ |