| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 13982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13993 | 13993 |
| 13994 static uint32_t RegExpHash(String* string, Smi* flags) { | 13994 static uint32_t RegExpHash(String* string, Smi* flags) { |
| 13995 return string->Hash() + flags->value(); | 13995 return string->Hash() + flags->value(); |
| 13996 } | 13996 } |
| 13997 | 13997 |
| 13998 String* string_; | 13998 String* string_; |
| 13999 Smi* flags_; | 13999 Smi* flags_; |
| 14000 }; | 14000 }; |
| 14001 | 14001 |
| 14002 | 14002 |
| 14003 // Utf8StringKey carries a vector of chars as key. | 14003 MaybeObject* OneByteStringKey::AsObject(Heap* heap) { |
| 14004 class Utf8StringKey : public HashTableKey { | 14004 if (hash_field_ == 0) Hash(); |
| 14005 public: | 14005 return heap->AllocateOneByteInternalizedString(string_, hash_field_); |
| 14006 explicit Utf8StringKey(Vector<const char> string, uint32_t seed) | 14006 } |
| 14007 : string_(string), hash_field_(0), seed_(seed) { } | |
| 14008 | |
| 14009 bool IsMatch(Object* string) { | |
| 14010 return String::cast(string)->IsUtf8EqualTo(string_); | |
| 14011 } | |
| 14012 | |
| 14013 uint32_t Hash() { | |
| 14014 if (hash_field_ != 0) return hash_field_ >> String::kHashShift; | |
| 14015 hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_); | |
| 14016 uint32_t result = hash_field_ >> String::kHashShift; | |
| 14017 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. | |
| 14018 return result; | |
| 14019 } | |
| 14020 | |
| 14021 uint32_t HashForObject(Object* other) { | |
| 14022 return String::cast(other)->Hash(); | |
| 14023 } | |
| 14024 | |
| 14025 MaybeObject* AsObject(Heap* heap) { | |
| 14026 if (hash_field_ == 0) Hash(); | |
| 14027 return heap->AllocateInternalizedStringFromUtf8(string_, | |
| 14028 chars_, | |
| 14029 hash_field_); | |
| 14030 } | |
| 14031 | |
| 14032 Vector<const char> string_; | |
| 14033 uint32_t hash_field_; | |
| 14034 int chars_; // Caches the number of characters when computing the hash code. | |
| 14035 uint32_t seed_; | |
| 14036 }; | |
| 14037 | 14007 |
| 14038 | 14008 |
| 14039 template <typename Char> | 14009 MaybeObject* SubStringOneByteStringKey::AsObject(Heap* heap) { |
| 14040 class SequentialStringKey : public HashTableKey { | 14010 if (hash_field_ == 0) Hash(); |
| 14041 public: | 14011 Vector<const uint8_t> chars(string_->GetChars() + from_, length_); |
| 14042 explicit SequentialStringKey(Vector<const Char> string, uint32_t seed) | 14012 return heap->AllocateOneByteInternalizedString(chars, hash_field_); |
| 14043 : string_(string), hash_field_(0), seed_(seed) { } | 14013 } |
| 14044 | |
| 14045 uint32_t Hash() { | |
| 14046 hash_field_ = StringHasher::HashSequentialString<Char>(string_.start(), | |
| 14047 string_.length(), | |
| 14048 seed_); | |
| 14049 | |
| 14050 uint32_t result = hash_field_ >> String::kHashShift; | |
| 14051 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. | |
| 14052 return result; | |
| 14053 } | |
| 14054 | 14014 |
| 14055 | 14015 |
| 14056 uint32_t HashForObject(Object* other) { | 14016 MaybeObject* TwoByteStringKey::AsObject(Heap* heap) { |
| 14057 return String::cast(other)->Hash(); | 14017 if (hash_field_ == 0) Hash(); |
| 14058 } | 14018 return heap->AllocateTwoByteInternalizedString(string_, hash_field_); |
| 14059 | 14019 } |
| 14060 Vector<const Char> string_; | |
| 14061 uint32_t hash_field_; | |
| 14062 uint32_t seed_; | |
| 14063 }; | |
| 14064 | |
| 14065 | |
| 14066 | |
| 14067 class OneByteStringKey : public SequentialStringKey<uint8_t> { | |
| 14068 public: | |
| 14069 OneByteStringKey(Vector<const uint8_t> str, uint32_t seed) | |
| 14070 : SequentialStringKey<uint8_t>(str, seed) { } | |
| 14071 | |
| 14072 bool IsMatch(Object* string) { | |
| 14073 return String::cast(string)->IsOneByteEqualTo(string_); | |
| 14074 } | |
| 14075 | |
| 14076 MaybeObject* AsObject(Heap* heap) { | |
| 14077 if (hash_field_ == 0) Hash(); | |
| 14078 return heap->AllocateOneByteInternalizedString(string_, hash_field_); | |
| 14079 } | |
| 14080 }; | |
| 14081 | |
| 14082 | |
| 14083 class SubStringOneByteStringKey : public HashTableKey { | |
| 14084 public: | |
| 14085 explicit SubStringOneByteStringKey(Handle<SeqOneByteString> string, | |
| 14086 int from, | |
| 14087 int length) | |
| 14088 : string_(string), from_(from), length_(length) { } | |
| 14089 | |
| 14090 uint32_t Hash() { | |
| 14091 ASSERT(length_ >= 0); | |
| 14092 ASSERT(from_ + length_ <= string_->length()); | |
| 14093 uint8_t* chars = string_->GetChars() + from_; | |
| 14094 hash_field_ = StringHasher::HashSequentialString( | |
| 14095 chars, length_, string_->GetHeap()->HashSeed()); | |
| 14096 uint32_t result = hash_field_ >> String::kHashShift; | |
| 14097 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. | |
| 14098 return result; | |
| 14099 } | |
| 14100 | |
| 14101 | |
| 14102 uint32_t HashForObject(Object* other) { | |
| 14103 return String::cast(other)->Hash(); | |
| 14104 } | |
| 14105 | |
| 14106 bool IsMatch(Object* string) { | |
| 14107 Vector<const uint8_t> chars(string_->GetChars() + from_, length_); | |
| 14108 return String::cast(string)->IsOneByteEqualTo(chars); | |
| 14109 } | |
| 14110 | |
| 14111 MaybeObject* AsObject(Heap* heap) { | |
| 14112 if (hash_field_ == 0) Hash(); | |
| 14113 Vector<const uint8_t> chars(string_->GetChars() + from_, length_); | |
| 14114 return heap->AllocateOneByteInternalizedString(chars, hash_field_); | |
| 14115 } | |
| 14116 | |
| 14117 private: | |
| 14118 Handle<SeqOneByteString> string_; | |
| 14119 int from_; | |
| 14120 int length_; | |
| 14121 uint32_t hash_field_; | |
| 14122 }; | |
| 14123 | |
| 14124 | |
| 14125 class TwoByteStringKey : public SequentialStringKey<uc16> { | |
| 14126 public: | |
| 14127 explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed) | |
| 14128 : SequentialStringKey<uc16>(str, seed) { } | |
| 14129 | |
| 14130 bool IsMatch(Object* string) { | |
| 14131 return String::cast(string)->IsTwoByteEqualTo(string_); | |
| 14132 } | |
| 14133 | |
| 14134 MaybeObject* AsObject(Heap* heap) { | |
| 14135 if (hash_field_ == 0) Hash(); | |
| 14136 return heap->AllocateTwoByteInternalizedString(string_, hash_field_); | |
| 14137 } | |
| 14138 }; | |
| 14139 | 14020 |
| 14140 | 14021 |
| 14141 // InternalizedStringKey carries a string/internalized-string object as key. | 14022 // InternalizedStringKey carries a string/internalized-string object as key. |
| 14142 class InternalizedStringKey : public HashTableKey { | 14023 class InternalizedStringKey : public HashTableKey { |
| 14143 public: | 14024 public: |
| 14144 explicit InternalizedStringKey(String* string) | 14025 explicit InternalizedStringKey(String* string) |
| 14145 : string_(string) { } | 14026 : string_(string) { } |
| 14146 | 14027 |
| 14147 bool IsMatch(Object* string) { | 14028 bool IsMatch(Object* string) { |
| 14148 return String::cast(string)->Equals(string_); | 14029 return String::cast(string)->Equals(string_); |
| (...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15192 if (entry == kNotFound) { | 15073 if (entry == kNotFound) { |
| 15193 return false; | 15074 return false; |
| 15194 } else { | 15075 } else { |
| 15195 *result = String::cast(KeyAt(entry)); | 15076 *result = String::cast(KeyAt(entry)); |
| 15196 ASSERT(StringShape(*result).IsInternalized()); | 15077 ASSERT(StringShape(*result).IsInternalized()); |
| 15197 return true; | 15078 return true; |
| 15198 } | 15079 } |
| 15199 } | 15080 } |
| 15200 | 15081 |
| 15201 | 15082 |
| 15202 MaybeObject* StringTable::LookupUtf8String(Vector<const char> str, | |
| 15203 Object** s) { | |
| 15204 Utf8StringKey key(str, GetHeap()->HashSeed()); | |
| 15205 return LookupKey(&key, s); | |
| 15206 } | |
| 15207 | |
| 15208 | |
| 15209 MaybeObject* StringTable::LookupOneByteString(Vector<const uint8_t> str, | |
| 15210 Object** s) { | |
| 15211 OneByteStringKey key(str, GetHeap()->HashSeed()); | |
| 15212 return LookupKey(&key, s); | |
| 15213 } | |
| 15214 | |
| 15215 | |
| 15216 MaybeObject* StringTable::LookupSubStringOneByteString( | |
| 15217 Handle<SeqOneByteString> str, | |
| 15218 int from, | |
| 15219 int length, | |
| 15220 Object** s) { | |
| 15221 SubStringOneByteStringKey key(str, from, length); | |
| 15222 return LookupKey(&key, s); | |
| 15223 } | |
| 15224 | |
| 15225 | |
| 15226 MaybeObject* StringTable::LookupTwoByteString(Vector<const uc16> str, | |
| 15227 Object** s) { | |
| 15228 TwoByteStringKey key(str, GetHeap()->HashSeed()); | |
| 15229 return LookupKey(&key, s); | |
| 15230 } | |
| 15231 | |
| 15232 | |
| 15233 MaybeObject* StringTable::LookupKey(HashTableKey* key, Object** s) { | 15083 MaybeObject* StringTable::LookupKey(HashTableKey* key, Object** s) { |
| 15234 int entry = FindEntry(key); | 15084 int entry = FindEntry(key); |
| 15235 | 15085 |
| 15236 // String already in table. | 15086 // String already in table. |
| 15237 if (entry != kNotFound) { | 15087 if (entry != kNotFound) { |
| 15238 *s = KeyAt(entry); | 15088 *s = KeyAt(entry); |
| 15239 return this; | 15089 return this; |
| 15240 } | 15090 } |
| 15241 | 15091 |
| 15242 // Adding new string. Grow table if needed. | 15092 // Adding new string. Grow table if needed. |
| (...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16760 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16610 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16761 static const char* error_messages_[] = { | 16611 static const char* error_messages_[] = { |
| 16762 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16612 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16763 }; | 16613 }; |
| 16764 #undef ERROR_MESSAGES_TEXTS | 16614 #undef ERROR_MESSAGES_TEXTS |
| 16765 return error_messages_[reason]; | 16615 return error_messages_[reason]; |
| 16766 } | 16616 } |
| 16767 | 16617 |
| 16768 | 16618 |
| 16769 } } // namespace v8::internal | 16619 } } // namespace v8::internal |
| OLD | NEW |