diff options
Diffstat (limited to 'src/ast/ast-value-factory.cc')
-rw-r--r-- | src/ast/ast-value-factory.cc | 125 |
1 files changed, 48 insertions, 77 deletions
diff --git a/src/ast/ast-value-factory.cc b/src/ast/ast-value-factory.cc index ed2976f5..b160c48a 100644 --- a/src/ast/ast-value-factory.cc +++ b/src/ast/ast-value-factory.cc @@ -28,6 +28,8 @@ #include "src/ast/ast-value-factory.h" #include "src/api.h" +#include "src/char-predicates-inl.h" +#include "src/objects-inl.h" #include "src/objects.h" #include "src/utils.h" @@ -127,6 +129,36 @@ bool AstRawString::IsOneByteEqualTo(const char* data) const { return false; } +bool AstRawString::Compare(void* a, void* b) { + const AstRawString* lhs = static_cast<AstRawString*>(a); + const AstRawString* rhs = static_cast<AstRawString*>(b); + DCHECK_EQ(lhs->hash(), rhs->hash()); + if (lhs->length() != rhs->length()) return false; + const unsigned char* l = lhs->raw_data(); + const unsigned char* r = rhs->raw_data(); + size_t length = rhs->length(); + if (lhs->is_one_byte()) { + if (rhs->is_one_byte()) { + return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(l), + reinterpret_cast<const uint8_t*>(r), + length) == 0; + } else { + return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(l), + reinterpret_cast<const uint16_t*>(r), + length) == 0; + } + } else { + if (rhs->is_one_byte()) { + return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), + reinterpret_cast<const uint8_t*>(r), + length) == 0; + } else { + return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), + reinterpret_cast<const uint16_t*>(r), + length) == 0; + } + } +} void AstConsString::Internalize(Isolate* isolate) { // AstRawStrings are internalized before AstConsStrings so left and right are @@ -182,14 +214,10 @@ void AstValue::Internalize(Isolate* isolate) { DCHECK(!string_->string().is_null()); break; case SYMBOL: - if (symbol_name_[0] == 'i') { - DCHECK_EQ(0, strcmp(symbol_name_, "iterator_symbol")); - set_value(isolate->factory()->iterator_symbol()); - } else if (strcmp(symbol_name_, "hasInstance_symbol") == 0) { - set_value(isolate->factory()->has_instance_symbol()); - } else { - DCHECK_EQ(0, strcmp(symbol_name_, "home_object_symbol")); - set_value(isolate->factory()->home_object_symbol()); + switch (symbol_) { + case AstSymbol::kHomeObjectSymbol: + set_value(isolate->factory()->home_object_symbol()); + break; } break; case NUMBER_WITH_DOT: @@ -219,9 +247,17 @@ void AstValue::Internalize(Isolate* isolate) { } } - AstRawString* AstValueFactory::GetOneByteStringInternal( Vector<const uint8_t> literal) { + if (literal.length() == 1 && IsInRange(literal[0], 'a', 'z')) { + int key = literal[0] - 'a'; + if (one_character_strings_[key] == nullptr) { + uint32_t hash = StringHasher::HashSequentialString<uint8_t>( + literal.start(), literal.length(), hash_seed_); + one_character_strings_[key] = GetString(hash, true, literal); + } + return one_character_strings_[key]; + } uint32_t hash = StringHasher::HashSequentialString<uint8_t>( literal.start(), literal.length(), hash_seed_); return GetString(hash, true, literal); @@ -260,39 +296,6 @@ const AstConsString* AstValueFactory::NewConsString( return new_string; } -const AstRawString* AstValueFactory::ConcatStrings(const AstRawString* left, - const AstRawString* right) { - int left_length = left->length(); - int right_length = right->length(); - const unsigned char* left_data = left->raw_data(); - const unsigned char* right_data = right->raw_data(); - if (left->is_one_byte() && right->is_one_byte()) { - uint8_t* buffer = zone_->NewArray<uint8_t>(left_length + right_length); - memcpy(buffer, left_data, left_length); - memcpy(buffer + left_length, right_data, right_length); - Vector<const uint8_t> literal(buffer, left_length + right_length); - return GetOneByteStringInternal(literal); - } else { - uint16_t* buffer = zone_->NewArray<uint16_t>(left_length + right_length); - if (left->is_one_byte()) { - for (int i = 0; i < left_length; ++i) { - buffer[i] = left_data[i]; - } - } else { - memcpy(buffer, left_data, 2 * left_length); - } - if (right->is_one_byte()) { - for (int i = 0; i < right_length; ++i) { - buffer[i + left_length] = right_data[i]; - } - } else { - memcpy(buffer + left_length, right_data, 2 * right_length); - } - Vector<const uint16_t> literal(buffer, left_length + right_length); - return GetTwoByteStringInternal(literal); - } -} - void AstValueFactory::Internalize(Isolate* isolate) { // Strings need to be internalized before values, because values refer to // strings. @@ -318,9 +321,8 @@ const AstValue* AstValueFactory::NewString(const AstRawString* string) { return AddValue(value); } - -const AstValue* AstValueFactory::NewSymbol(const char* name) { - AstValue* value = new (zone_) AstValue(name); +const AstValue* AstValueFactory::NewSymbol(AstSymbol symbol) { + AstValue* value = new (zone_) AstValue(symbol); return AddValue(value); } @@ -379,7 +381,7 @@ AstRawString* AstValueFactory::GetString(uint32_t hash, bool is_one_byte, // return this AstRawString. AstRawString key(is_one_byte, literal_bytes, hash); base::HashMap::Entry* entry = string_table_.LookupOrInsert(&key, hash); - if (entry->value == NULL) { + if (entry->value == nullptr) { // Copy literal contents for later comparison. int length = literal_bytes.length(); byte* new_literal_bytes = zone_->NewArray<byte>(length); @@ -394,36 +396,5 @@ AstRawString* AstValueFactory::GetString(uint32_t hash, bool is_one_byte, return reinterpret_cast<AstRawString*>(entry->key); } - -bool AstValueFactory::AstRawStringCompare(void* a, void* b) { - const AstRawString* lhs = static_cast<AstRawString*>(a); - const AstRawString* rhs = static_cast<AstRawString*>(b); - DCHECK_EQ(lhs->hash(), rhs->hash()); - if (lhs->length() != rhs->length()) return false; - const unsigned char* l = lhs->raw_data(); - const unsigned char* r = rhs->raw_data(); - size_t length = rhs->length(); - if (lhs->is_one_byte()) { - if (rhs->is_one_byte()) { - return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(l), - reinterpret_cast<const uint8_t*>(r), - length) == 0; - } else { - return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(l), - reinterpret_cast<const uint16_t*>(r), - length) == 0; - } - } else { - if (rhs->is_one_byte()) { - return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), - reinterpret_cast<const uint8_t*>(r), - length) == 0; - } else { - return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), - reinterpret_cast<const uint16_t*>(r), - length) == 0; - } - } -} } // namespace internal } // namespace v8 |