| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 122 |
| 123 bool AstRawString::IsOneByteEqualTo(const char* data) const { | 123 bool AstRawString::IsOneByteEqualTo(const char* data) const { |
| 124 int length = static_cast<int>(strlen(data)); | 124 int length = static_cast<int>(strlen(data)); |
| 125 if (is_one_byte() && literal_bytes_.length() == length) { | 125 if (is_one_byte() && literal_bytes_.length() == length) { |
| 126 const char* token = reinterpret_cast<const char*>(literal_bytes_.start()); | 126 const char* token = reinterpret_cast<const char*>(literal_bytes_.start()); |
| 127 return !strncmp(token, data, length); | 127 return !strncmp(token, data, length); |
| 128 } | 128 } |
| 129 return false; | 129 return false; |
| 130 } | 130 } |
| 131 | 131 |
| 132 bool AstRawString::Compare(void* a, void* b) { |
| 133 const AstRawString* lhs = static_cast<AstRawString*>(a); |
| 134 const AstRawString* rhs = static_cast<AstRawString*>(b); |
| 135 DCHECK_EQ(lhs->hash(), rhs->hash()); |
| 136 if (lhs->length() != rhs->length()) return false; |
| 137 const unsigned char* l = lhs->raw_data(); |
| 138 const unsigned char* r = rhs->raw_data(); |
| 139 size_t length = rhs->length(); |
| 140 if (lhs->is_one_byte()) { |
| 141 if (rhs->is_one_byte()) { |
| 142 return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(l), |
| 143 reinterpret_cast<const uint8_t*>(r), |
| 144 length) == 0; |
| 145 } else { |
| 146 return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(l), |
| 147 reinterpret_cast<const uint16_t*>(r), |
| 148 length) == 0; |
| 149 } |
| 150 } else { |
| 151 if (rhs->is_one_byte()) { |
| 152 return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), |
| 153 reinterpret_cast<const uint8_t*>(r), |
| 154 length) == 0; |
| 155 } else { |
| 156 return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), |
| 157 reinterpret_cast<const uint16_t*>(r), |
| 158 length) == 0; |
| 159 } |
| 160 } |
| 161 } |
| 132 | 162 |
| 133 void AstConsString::Internalize(Isolate* isolate) { | 163 void AstConsString::Internalize(Isolate* isolate) { |
| 134 // AstRawStrings are internalized before AstConsStrings so left and right are | 164 // AstRawStrings are internalized before AstConsStrings so left and right are |
| 135 // already internalized. | 165 // already internalized. |
| 136 set_string(isolate->factory() | 166 set_string(isolate->factory() |
| 137 ->NewConsString(left_->string(), right_->string()) | 167 ->NewConsString(left_->string(), right_->string()) |
| 138 .ToHandleChecked()); | 168 .ToHandleChecked()); |
| 139 } | 169 } |
| 140 | 170 |
| 141 bool AstValue::IsPropertyName() const { | 171 bool AstValue::IsPropertyName() const { |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 #undef GENERATE_VALUE_GETTER | 379 #undef GENERATE_VALUE_GETTER |
| 350 | 380 |
| 351 AstRawString* AstValueFactory::GetString(uint32_t hash, bool is_one_byte, | 381 AstRawString* AstValueFactory::GetString(uint32_t hash, bool is_one_byte, |
| 352 Vector<const byte> literal_bytes) { | 382 Vector<const byte> literal_bytes) { |
| 353 // literal_bytes here points to whatever the user passed, and this is OK | 383 // literal_bytes here points to whatever the user passed, and this is OK |
| 354 // because we use vector_compare (which checks the contents) to compare | 384 // because we use vector_compare (which checks the contents) to compare |
| 355 // against the AstRawStrings which are in the string_table_. We should not | 385 // against the AstRawStrings which are in the string_table_. We should not |
| 356 // return this AstRawString. | 386 // return this AstRawString. |
| 357 AstRawString key(is_one_byte, literal_bytes, hash); | 387 AstRawString key(is_one_byte, literal_bytes, hash); |
| 358 base::HashMap::Entry* entry = string_table_.LookupOrInsert(&key, hash); | 388 base::HashMap::Entry* entry = string_table_.LookupOrInsert(&key, hash); |
| 359 if (entry->value == NULL) { | 389 if (entry->value == nullptr) { |
| 360 // Copy literal contents for later comparison. | 390 // Copy literal contents for later comparison. |
| 361 int length = literal_bytes.length(); | 391 int length = literal_bytes.length(); |
| 362 byte* new_literal_bytes = zone_->NewArray<byte>(length); | 392 byte* new_literal_bytes = zone_->NewArray<byte>(length); |
| 363 memcpy(new_literal_bytes, literal_bytes.start(), length); | 393 memcpy(new_literal_bytes, literal_bytes.start(), length); |
| 364 AstRawString* new_string = new (zone_) AstRawString( | 394 AstRawString* new_string = new (zone_) AstRawString( |
| 365 is_one_byte, Vector<const byte>(new_literal_bytes, length), hash); | 395 is_one_byte, Vector<const byte>(new_literal_bytes, length), hash); |
| 366 CHECK_NOT_NULL(new_string); | 396 CHECK_NOT_NULL(new_string); |
| 367 AddString(new_string); | 397 AddString(new_string); |
| 368 entry->key = new_string; | 398 entry->key = new_string; |
| 369 entry->value = reinterpret_cast<void*>(1); | 399 entry->value = reinterpret_cast<void*>(1); |
| 370 } | 400 } |
| 371 return reinterpret_cast<AstRawString*>(entry->key); | 401 return reinterpret_cast<AstRawString*>(entry->key); |
| 372 } | 402 } |
| 373 | 403 |
| 374 | |
| 375 bool AstValueFactory::AstRawStringCompare(void* a, void* b) { | |
| 376 const AstRawString* lhs = static_cast<AstRawString*>(a); | |
| 377 const AstRawString* rhs = static_cast<AstRawString*>(b); | |
| 378 DCHECK_EQ(lhs->hash(), rhs->hash()); | |
| 379 if (lhs->length() != rhs->length()) return false; | |
| 380 const unsigned char* l = lhs->raw_data(); | |
| 381 const unsigned char* r = rhs->raw_data(); | |
| 382 size_t length = rhs->length(); | |
| 383 if (lhs->is_one_byte()) { | |
| 384 if (rhs->is_one_byte()) { | |
| 385 return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(l), | |
| 386 reinterpret_cast<const uint8_t*>(r), | |
| 387 length) == 0; | |
| 388 } else { | |
| 389 return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(l), | |
| 390 reinterpret_cast<const uint16_t*>(r), | |
| 391 length) == 0; | |
| 392 } | |
| 393 } else { | |
| 394 if (rhs->is_one_byte()) { | |
| 395 return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), | |
| 396 reinterpret_cast<const uint8_t*>(r), | |
| 397 length) == 0; | |
| 398 } else { | |
| 399 return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), | |
| 400 reinterpret_cast<const uint16_t*>(r), | |
| 401 length) == 0; | |
| 402 } | |
| 403 } | |
| 404 } | |
| 405 } // namespace internal | 404 } // namespace internal |
| 406 } // namespace v8 | 405 } // namespace v8 |
| OLD | NEW |