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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 } | 90 } |
91 | 91 |
92 void AstString::Internalize(Isolate* isolate) { | 92 void AstString::Internalize(Isolate* isolate) { |
93 if (IsRawStringBits::decode(bit_field_)) { | 93 if (IsRawStringBits::decode(bit_field_)) { |
94 return reinterpret_cast<AstRawString*>(this)->Internalize(isolate); | 94 return reinterpret_cast<AstRawString*>(this)->Internalize(isolate); |
95 } | 95 } |
96 return reinterpret_cast<AstConsString*>(this)->Internalize(isolate); | 96 return reinterpret_cast<AstConsString*>(this)->Internalize(isolate); |
97 } | 97 } |
98 | 98 |
99 void AstRawString::Internalize(Isolate* isolate) { | 99 void AstRawString::Internalize(Isolate* isolate) { |
| 100 // Skip over already internalized strings. |
| 101 if (!string_.is_null()) return; |
100 if (literal_bytes_.length() == 0) { | 102 if (literal_bytes_.length() == 0) { |
101 string_ = isolate->factory()->empty_string(); | 103 string_ = isolate->factory()->empty_string(); |
102 } else { | 104 } else { |
103 AstRawStringInternalizationKey key(this); | 105 AstRawStringInternalizationKey key(this); |
104 string_ = StringTable::LookupKey(isolate, &key); | 106 string_ = StringTable::LookupKey(isolate, &key); |
105 } | 107 } |
106 } | 108 } |
107 | 109 |
108 bool AstRawString::AsArrayIndex(uint32_t* index) const { | 110 bool AstRawString::AsArrayIndex(uint32_t* index) const { |
109 // The StringHasher will set up the hash in such a way that we can use it to | 111 // The StringHasher will set up the hash in such a way that we can use it to |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 return result; | 251 return result; |
250 } | 252 } |
251 | 253 |
252 | 254 |
253 const AstConsString* AstValueFactory::NewConsString( | 255 const AstConsString* AstValueFactory::NewConsString( |
254 const AstString* left, const AstString* right) { | 256 const AstString* left, const AstString* right) { |
255 // This Vector will be valid as long as the Collector is alive (meaning that | 257 // This Vector will be valid as long as the Collector is alive (meaning that |
256 // the AstRawString will not be moved). | 258 // the AstRawString will not be moved). |
257 AstConsString* new_string = new (zone_) AstConsString(left, right); | 259 AstConsString* new_string = new (zone_) AstConsString(left, right); |
258 CHECK(new_string != nullptr); | 260 CHECK(new_string != nullptr); |
259 AddString(new_string); | 261 AddConsString(new_string); |
260 return new_string; | 262 return new_string; |
261 } | 263 } |
262 | 264 |
263 const AstRawString* AstValueFactory::ConcatStrings(const AstRawString* left, | 265 const AstRawString* AstValueFactory::ConcatStrings(const AstRawString* left, |
264 const AstRawString* right) { | 266 const AstRawString* right) { |
265 int left_length = left->length(); | 267 int left_length = left->length(); |
266 int right_length = right->length(); | 268 int right_length = right->length(); |
267 const unsigned char* left_data = left->raw_data(); | 269 const unsigned char* left_data = left->raw_data(); |
268 const unsigned char* right_data = right->raw_data(); | 270 const unsigned char* right_data = right->raw_data(); |
269 if (left->is_one_byte() && right->is_one_byte()) { | 271 if (left->is_one_byte() && right->is_one_byte()) { |
(...skipping 18 matching lines...) Expand all Loading... |
288 } else { | 290 } else { |
289 memcpy(buffer + left_length, right_data, 2 * right_length); | 291 memcpy(buffer + left_length, right_data, 2 * right_length); |
290 } | 292 } |
291 Vector<const uint16_t> literal(buffer, left_length + right_length); | 293 Vector<const uint16_t> literal(buffer, left_length + right_length); |
292 return GetTwoByteStringInternal(literal); | 294 return GetTwoByteStringInternal(literal); |
293 } | 295 } |
294 } | 296 } |
295 | 297 |
296 void AstValueFactory::Internalize(Isolate* isolate) { | 298 void AstValueFactory::Internalize(Isolate* isolate) { |
297 // Strings need to be internalized before values, because values refer to | 299 // Strings need to be internalized before values, because values refer to |
298 // strings. | 300 // strings. Internalize flat strings before cons strings since cons strings |
299 for (AstString* current = strings_; current != nullptr;) { | 301 // may point to flat strings. |
300 AstString* next = current->next(); | 302 for (base::CustomMatcherHashMap::Entry* entry = string_table_.Start(); |
| 303 entry != nullptr; entry = string_table_.Next(entry)) { |
| 304 reinterpret_cast<AstRawString*>(entry->key)->Internalize(isolate); |
| 305 } |
| 306 |
| 307 for (AstConsString* current = cons_strings_; current != nullptr;) { |
| 308 AstConsString* next = current->next(); |
301 current->Internalize(isolate); | 309 current->Internalize(isolate); |
302 current = next; | 310 current = next; |
303 } | 311 } |
| 312 |
304 for (AstValue* current = values_; current != nullptr;) { | 313 for (AstValue* current = values_; current != nullptr;) { |
305 AstValue* next = current->next(); | 314 AstValue* next = current->next(); |
306 current->Internalize(isolate); | 315 current->Internalize(isolate); |
307 current = next; | 316 current = next; |
308 } | 317 } |
309 ResetStrings(); | 318 ResetConsStrings(); |
310 values_ = nullptr; | 319 values_ = nullptr; |
311 } | 320 } |
312 | 321 |
313 | 322 |
314 const AstValue* AstValueFactory::NewString(const AstRawString* string) { | 323 const AstValue* AstValueFactory::NewString(const AstRawString* string) { |
315 AstValue* value = new (zone_) AstValue(string); | 324 AstValue* value = new (zone_) AstValue(string); |
316 CHECK(string != nullptr); | 325 CHECK(string != nullptr); |
317 return AddValue(value); | 326 return AddValue(value); |
318 } | 327 } |
319 | 328 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 base::HashMap::Entry* entry = string_table_.LookupOrInsert(&key, hash); | 387 base::HashMap::Entry* entry = string_table_.LookupOrInsert(&key, hash); |
379 if (entry->value == NULL) { | 388 if (entry->value == NULL) { |
380 // Copy literal contents for later comparison. | 389 // Copy literal contents for later comparison. |
381 int length = literal_bytes.length(); | 390 int length = literal_bytes.length(); |
382 byte* new_literal_bytes = zone_->NewArray<byte>(length); | 391 byte* new_literal_bytes = zone_->NewArray<byte>(length); |
383 memcpy(new_literal_bytes, literal_bytes.start(), length); | 392 memcpy(new_literal_bytes, literal_bytes.start(), length); |
384 AstRawString* new_string = new (zone_) AstRawString( | 393 AstRawString* new_string = new (zone_) AstRawString( |
385 is_one_byte, Vector<const byte>(new_literal_bytes, length), hash); | 394 is_one_byte, Vector<const byte>(new_literal_bytes, length), hash); |
386 CHECK(new_string != nullptr); | 395 CHECK(new_string != nullptr); |
387 entry->key = new_string; | 396 entry->key = new_string; |
388 AddString(new_string); | |
389 entry->value = reinterpret_cast<void*>(1); | 397 entry->value = reinterpret_cast<void*>(1); |
390 } | 398 } |
391 return reinterpret_cast<AstRawString*>(entry->key); | 399 return reinterpret_cast<AstRawString*>(entry->key); |
392 } | 400 } |
393 | 401 |
394 | 402 |
395 bool AstValueFactory::AstRawStringCompare(void* a, void* b) { | 403 bool AstValueFactory::AstRawStringCompare(void* a, void* b) { |
396 const AstRawString* lhs = static_cast<AstRawString*>(a); | 404 const AstRawString* lhs = static_cast<AstRawString*>(a); |
397 const AstRawString* rhs = static_cast<AstRawString*>(b); | 405 const AstRawString* rhs = static_cast<AstRawString*>(b); |
398 DCHECK_EQ(lhs->hash(), rhs->hash()); | 406 DCHECK_EQ(lhs->hash(), rhs->hash()); |
(...skipping 18 matching lines...) Expand all Loading... |
417 length) == 0; | 425 length) == 0; |
418 } else { | 426 } else { |
419 return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), | 427 return CompareCharsUnsigned(reinterpret_cast<const uint16_t*>(l), |
420 reinterpret_cast<const uint16_t*>(r), | 428 reinterpret_cast<const uint16_t*>(r), |
421 length) == 0; | 429 length) == 0; |
422 } | 430 } |
423 } | 431 } |
424 } | 432 } |
425 } // namespace internal | 433 } // namespace internal |
426 } // namespace v8 | 434 } // namespace v8 |
OLD | NEW |