| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 1405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1416 share->set_inferred_name(empty_string()); | 1416 share->set_inferred_name(empty_string()); |
| 1417 return result; | 1417 return result; |
| 1418 } | 1418 } |
| 1419 | 1419 |
| 1420 | 1420 |
| 1421 Object* Heap::AllocateConsString(String* first, | 1421 Object* Heap::AllocateConsString(String* first, |
| 1422 String* second) { | 1422 String* second) { |
| 1423 int first_length = first->length(); | 1423 int first_length = first->length(); |
| 1424 int second_length = second->length(); | 1424 int second_length = second->length(); |
| 1425 int length = first_length + second_length; | 1425 int length = first_length + second_length; |
| 1426 bool is_ascii = StringShape(first).IsAsciiRepresentation() | 1426 bool is_ascii = first->IsAsciiRepresentation() |
| 1427 && StringShape(second).IsAsciiRepresentation(); | 1427 && second->IsAsciiRepresentation(); |
| 1428 | 1428 |
| 1429 // If the resulting string is small make a flat string. | 1429 // If the resulting string is small make a flat string. |
| 1430 if (length < String::kMinNonFlatLength) { | 1430 if (length < String::kMinNonFlatLength) { |
| 1431 ASSERT(first->IsFlat()); | 1431 ASSERT(first->IsFlat()); |
| 1432 ASSERT(second->IsFlat()); | 1432 ASSERT(second->IsFlat()); |
| 1433 if (is_ascii) { | 1433 if (is_ascii) { |
| 1434 Object* result = AllocateRawAsciiString(length); | 1434 Object* result = AllocateRawAsciiString(length); |
| 1435 if (result->IsFailure()) return result; | 1435 if (result->IsFailure()) return result; |
| 1436 // Copy the characters into the new object. | 1436 // Copy the characters into the new object. |
| 1437 char* dest = SeqAsciiString::cast(result)->GetChars(); | 1437 char* dest = SeqAsciiString::cast(result)->GetChars(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1477 int end) { | 1477 int end) { |
| 1478 int length = end - start; | 1478 int length = end - start; |
| 1479 | 1479 |
| 1480 // If the resulting string is small make a sub string. | 1480 // If the resulting string is small make a sub string. |
| 1481 if (end - start <= String::kMinNonFlatLength) { | 1481 if (end - start <= String::kMinNonFlatLength) { |
| 1482 return Heap::AllocateSubString(buffer, start, end); | 1482 return Heap::AllocateSubString(buffer, start, end); |
| 1483 } | 1483 } |
| 1484 | 1484 |
| 1485 Map* map; | 1485 Map* map; |
| 1486 if (length <= String::kMaxShortStringSize) { | 1486 if (length <= String::kMaxShortStringSize) { |
| 1487 map = StringShape(buffer).IsAsciiRepresentation() ? | 1487 map = buffer->IsAsciiRepresentation() ? |
| 1488 short_sliced_ascii_string_map() : | 1488 short_sliced_ascii_string_map() : |
| 1489 short_sliced_string_map(); | 1489 short_sliced_string_map(); |
| 1490 } else if (length <= String::kMaxMediumStringSize) { | 1490 } else if (length <= String::kMaxMediumStringSize) { |
| 1491 map = StringShape(buffer).IsAsciiRepresentation() ? | 1491 map = buffer->IsAsciiRepresentation() ? |
| 1492 medium_sliced_ascii_string_map() : | 1492 medium_sliced_ascii_string_map() : |
| 1493 medium_sliced_string_map(); | 1493 medium_sliced_string_map(); |
| 1494 } else { | 1494 } else { |
| 1495 map = StringShape(buffer).IsAsciiRepresentation() ? | 1495 map = buffer->IsAsciiRepresentation() ? |
| 1496 long_sliced_ascii_string_map() : | 1496 long_sliced_ascii_string_map() : |
| 1497 long_sliced_string_map(); | 1497 long_sliced_string_map(); |
| 1498 } | 1498 } |
| 1499 | 1499 |
| 1500 Object* result = Allocate(map, NEW_SPACE); | 1500 Object* result = Allocate(map, NEW_SPACE); |
| 1501 if (result->IsFailure()) return result; | 1501 if (result->IsFailure()) return result; |
| 1502 | 1502 |
| 1503 SlicedString* sliced_string = SlicedString::cast(result); | 1503 SlicedString* sliced_string = SlicedString::cast(result); |
| 1504 sliced_string->set_buffer(buffer); | 1504 sliced_string->set_buffer(buffer); |
| 1505 sliced_string->set_start(start); | 1505 sliced_string->set_start(start); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1517 if (length == 1) { | 1517 if (length == 1) { |
| 1518 return Heap::LookupSingleCharacterStringFromCode( | 1518 return Heap::LookupSingleCharacterStringFromCode( |
| 1519 buffer->Get(start)); | 1519 buffer->Get(start)); |
| 1520 } | 1520 } |
| 1521 | 1521 |
| 1522 // Make an attempt to flatten the buffer to reduce access time. | 1522 // Make an attempt to flatten the buffer to reduce access time. |
| 1523 if (!buffer->IsFlat()) { | 1523 if (!buffer->IsFlat()) { |
| 1524 buffer->TryFlatten(); | 1524 buffer->TryFlatten(); |
| 1525 } | 1525 } |
| 1526 | 1526 |
| 1527 Object* result = StringShape(buffer).IsAsciiRepresentation() | 1527 Object* result = buffer->IsAsciiRepresentation() |
| 1528 ? AllocateRawAsciiString(length) | 1528 ? AllocateRawAsciiString(length) |
| 1529 : AllocateRawTwoByteString(length); | 1529 : AllocateRawTwoByteString(length); |
| 1530 if (result->IsFailure()) return result; | 1530 if (result->IsFailure()) return result; |
| 1531 | 1531 |
| 1532 // Copy the characters into the new object. | 1532 // Copy the characters into the new object. |
| 1533 String* string_result = String::cast(result); | 1533 String* string_result = String::cast(result); |
| 1534 StringHasher hasher(length); | 1534 StringHasher hasher(length); |
| 1535 int i = 0; | 1535 int i = 0; |
| 1536 for (; i < length && hasher.is_array_index(); i++) { | 1536 for (; i < length && hasher.is_array_index(); i++) { |
| 1537 uc32 c = buffer->Get(start + i); | 1537 uc32 c = buffer->Get(start + i); |
| (...skipping 1849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3387 #ifdef DEBUG | 3387 #ifdef DEBUG |
| 3388 bool Heap::GarbageCollectionGreedyCheck() { | 3388 bool Heap::GarbageCollectionGreedyCheck() { |
| 3389 ASSERT(FLAG_gc_greedy); | 3389 ASSERT(FLAG_gc_greedy); |
| 3390 if (Bootstrapper::IsActive()) return true; | 3390 if (Bootstrapper::IsActive()) return true; |
| 3391 if (disallow_allocation_failure()) return true; | 3391 if (disallow_allocation_failure()) return true; |
| 3392 return CollectGarbage(0, NEW_SPACE); | 3392 return CollectGarbage(0, NEW_SPACE); |
| 3393 } | 3393 } |
| 3394 #endif | 3394 #endif |
| 3395 | 3395 |
| 3396 } } // namespace v8::internal | 3396 } } // namespace v8::internal |
| OLD | NEW |