OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 5326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5337 | 5337 |
5338 // The NumberKey uses carries the uint32_t as key. | 5338 // The NumberKey uses carries the uint32_t as key. |
5339 // This avoids allocation in HasProperty. | 5339 // This avoids allocation in HasProperty. |
5340 class NumberKey : public HashTableKey { | 5340 class NumberKey : public HashTableKey { |
5341 public: | 5341 public: |
5342 explicit NumberKey(uint32_t number) { | 5342 explicit NumberKey(uint32_t number) { |
5343 number_ = number; | 5343 number_ = number; |
5344 } | 5344 } |
5345 | 5345 |
5346 private: | 5346 private: |
5347 bool IsMatch(Object* other) { | 5347 bool IsMatch(Object* number) { |
5348 return number_ == ToUint32(other); | 5348 return number_ == ToUint32(number); |
5349 } | 5349 } |
5350 | 5350 |
5351 // Thomas Wang, Integer Hash Functions. | 5351 // Thomas Wang, Integer Hash Functions. |
5352 // http://www.concentric.net/~Ttwang/tech/inthash.htm | 5352 // http://www.concentric.net/~Ttwang/tech/inthash.htm |
5353 static uint32_t ComputeHash(uint32_t key) { | 5353 static uint32_t ComputeHash(uint32_t key) { |
5354 uint32_t hash = key; | 5354 uint32_t hash = key; |
5355 hash = ~hash + (hash << 15); // hash = (hash << 15) - hash - 1; | 5355 hash = ~hash + (hash << 15); // hash = (hash << 15) - hash - 1; |
5356 hash = hash ^ (hash >> 12); | 5356 hash = hash ^ (hash >> 12); |
5357 hash = hash + (hash << 2); | 5357 hash = hash + (hash << 2); |
5358 hash = hash ^ (hash >> 4); | 5358 hash = hash ^ (hash >> 4); |
(...skipping 25 matching lines...) Expand all Loading... |
5384 }; | 5384 }; |
5385 | 5385 |
5386 | 5386 |
5387 // StringKey simply carries a string object as key. | 5387 // StringKey simply carries a string object as key. |
5388 class StringKey : public HashTableKey { | 5388 class StringKey : public HashTableKey { |
5389 public: | 5389 public: |
5390 explicit StringKey(String* string) { | 5390 explicit StringKey(String* string) { |
5391 string_ = string; | 5391 string_ = string; |
5392 } | 5392 } |
5393 | 5393 |
5394 bool IsMatch(Object* other) { | 5394 bool IsMatch(Object* string) { |
5395 if (!other->IsString()) return false; | 5395 return string_->Equals(String::cast(string)); |
5396 return string_->Equals(String::cast(other)); | |
5397 } | 5396 } |
5398 | 5397 |
5399 uint32_t Hash() { return StringHash(string_); } | 5398 uint32_t Hash() { return StringHash(string_); } |
5400 | 5399 |
5401 HashFunction GetHashFunction() { return StringHash; } | 5400 HashFunction GetHashFunction() { return StringHash; } |
5402 | 5401 |
5403 Object* GetObject() { return string_; } | 5402 Object* GetObject() { return string_; } |
5404 | 5403 |
5405 static uint32_t StringHash(Object* obj) { | 5404 static uint32_t StringHash(Object* obj) { |
5406 return String::cast(obj)->Hash(); | 5405 return String::cast(obj)->Hash(); |
5407 } | 5406 } |
5408 | 5407 |
5409 bool IsStringKey() { return true; } | 5408 bool IsStringKey() { return true; } |
5410 | 5409 |
5411 String* string_; | 5410 String* string_; |
5412 }; | 5411 }; |
5413 | 5412 |
5414 // Utf8SymbolKey carries a vector of chars as key. | 5413 // Utf8SymbolKey carries a vector of chars as key. |
5415 class Utf8SymbolKey : public HashTableKey { | 5414 class Utf8SymbolKey : public HashTableKey { |
5416 public: | 5415 public: |
5417 explicit Utf8SymbolKey(Vector<const char> string) | 5416 explicit Utf8SymbolKey(Vector<const char> string) |
5418 : string_(string), length_field_(0) { } | 5417 : string_(string), length_field_(0) { } |
5419 | 5418 |
5420 bool IsMatch(Object* other) { | 5419 bool IsMatch(Object* string) { |
5421 if (!other->IsString()) return false; | 5420 return String::cast(string)->IsEqualTo(string_); |
5422 return String::cast(other)->IsEqualTo(string_); | |
5423 } | 5421 } |
5424 | 5422 |
5425 HashFunction GetHashFunction() { | 5423 HashFunction GetHashFunction() { |
5426 return StringHash; | 5424 return StringHash; |
5427 } | 5425 } |
5428 | 5426 |
5429 uint32_t Hash() { | 5427 uint32_t Hash() { |
5430 if (length_field_ != 0) return length_field_ >> String::kHashShift; | 5428 if (length_field_ != 0) return length_field_ >> String::kHashShift; |
5431 unibrow::Utf8InputBuffer<> buffer(string_.start(), | 5429 unibrow::Utf8InputBuffer<> buffer(string_.start(), |
5432 static_cast<unsigned>(string_.length())); | 5430 static_cast<unsigned>(string_.length())); |
(...skipping 23 matching lines...) Expand all Loading... |
5456 | 5454 |
5457 // SymbolKey carries a string/symbol object as key. | 5455 // SymbolKey carries a string/symbol object as key. |
5458 class SymbolKey : public HashTableKey { | 5456 class SymbolKey : public HashTableKey { |
5459 public: | 5457 public: |
5460 explicit SymbolKey(String* string) : string_(string) { } | 5458 explicit SymbolKey(String* string) : string_(string) { } |
5461 | 5459 |
5462 HashFunction GetHashFunction() { | 5460 HashFunction GetHashFunction() { |
5463 return StringHash; | 5461 return StringHash; |
5464 } | 5462 } |
5465 | 5463 |
5466 bool IsMatch(Object* other) { | 5464 bool IsMatch(Object* string) { |
5467 if (!other->IsString()) return false; | 5465 return String::cast(string)->Equals(string_); |
5468 return String::cast(other)->Equals(string_); | |
5469 } | 5466 } |
5470 | 5467 |
5471 uint32_t Hash() { return string_->Hash(); } | 5468 uint32_t Hash() { return string_->Hash(); } |
5472 | 5469 |
5473 Object* GetObject() { | 5470 Object* GetObject() { |
5474 // If the string is a cons string, attempt to flatten it so that | 5471 // If the string is a cons string, attempt to flatten it so that |
5475 // symbols will most often be flat strings. | 5472 // symbols will most often be flat strings. |
5476 if (string_->IsConsString()) { | 5473 if (string_->IsConsString()) { |
5477 ConsString* cons_string = ConsString::cast(string_); | 5474 ConsString* cons_string = ConsString::cast(string_); |
5478 cons_string->TryFlatten(); | 5475 cons_string->TryFlatten(); |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5705 } | 5702 } |
5706 | 5703 |
5707 | 5704 |
5708 // SymbolsKey used for HashTable where key is array of symbols. | 5705 // SymbolsKey used for HashTable where key is array of symbols. |
5709 class SymbolsKey : public HashTableKey { | 5706 class SymbolsKey : public HashTableKey { |
5710 public: | 5707 public: |
5711 explicit SymbolsKey(FixedArray* symbols) { | 5708 explicit SymbolsKey(FixedArray* symbols) { |
5712 symbols_ = symbols; | 5709 symbols_ = symbols; |
5713 } | 5710 } |
5714 | 5711 |
5715 bool IsMatch(Object* other) { | 5712 bool IsMatch(Object* symbols) { |
5716 if (!other->IsFixedArray()) return false; | 5713 FixedArray* o = FixedArray::cast(symbols); |
5717 FixedArray* o = FixedArray::cast(other); | |
5718 int len = symbols_->length(); | 5714 int len = symbols_->length(); |
5719 if (o->length() != len) return false; | 5715 if (o->length() != len) return false; |
5720 for (int i = 0; i < len; i++) { | 5716 for (int i = 0; i < len; i++) { |
5721 if (o->get(i) != symbols_->get(i)) return false; | 5717 if (o->get(i) != symbols_->get(i)) return false; |
5722 } | 5718 } |
5723 return true; | 5719 return true; |
5724 } | 5720 } |
5725 | 5721 |
5726 uint32_t Hash() { return SymbolsHash(symbols_); } | 5722 uint32_t Hash() { return SymbolsHash(symbols_); } |
5727 | 5723 |
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6428 // No break point. | 6424 // No break point. |
6429 if (break_point_objects()->IsUndefined()) return 0; | 6425 if (break_point_objects()->IsUndefined()) return 0; |
6430 // Single beak point. | 6426 // Single beak point. |
6431 if (!break_point_objects()->IsFixedArray()) return 1; | 6427 if (!break_point_objects()->IsFixedArray()) return 1; |
6432 // Multiple break points. | 6428 // Multiple break points. |
6433 return FixedArray::cast(break_point_objects())->length(); | 6429 return FixedArray::cast(break_point_objects())->length(); |
6434 } | 6430 } |
6435 | 6431 |
6436 | 6432 |
6437 } } // namespace v8::internal | 6433 } } // namespace v8::internal |
OLD | NEW |