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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 #elif defined(DEBUG) | 223 #elif defined(DEBUG) |
224 if (FLAG_heap_stats) ReportHeapStatistics("After GC"); | 224 if (FLAG_heap_stats) ReportHeapStatistics("After GC"); |
225 #elif defined(ENABLE_LOGGING_AND_PROFILING) | 225 #elif defined(ENABLE_LOGGING_AND_PROFILING) |
226 if (FLAG_log_gc) new_space_.ReportStatistics(); | 226 if (FLAG_log_gc) new_space_.ReportStatistics(); |
227 #endif | 227 #endif |
228 } | 228 } |
229 #endif // defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) | 229 #endif // defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) |
230 | 230 |
231 | 231 |
232 void Heap::GarbageCollectionPrologue() { | 232 void Heap::GarbageCollectionPrologue() { |
233 RegExpImpl::NewSpaceCollectionPrologue(); | |
234 gc_count_++; | 233 gc_count_++; |
235 #ifdef DEBUG | 234 #ifdef DEBUG |
236 ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC); | 235 ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC); |
237 allow_allocation(false); | 236 allow_allocation(false); |
238 | 237 |
239 if (FLAG_verify_heap) { | 238 if (FLAG_verify_heap) { |
240 Verify(); | 239 Verify(); |
241 } | 240 } |
242 | 241 |
243 if (FLAG_gc_verbose) Print(); | 242 if (FLAG_gc_verbose) Print(); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 context_disposed_pending_ = false; | 467 context_disposed_pending_ = false; |
469 } | 468 } |
470 | 469 |
471 | 470 |
472 void Heap::MarkCompactPrologue(bool is_compacting) { | 471 void Heap::MarkCompactPrologue(bool is_compacting) { |
473 // At any old GC clear the keyed lookup cache to enable collection of unused | 472 // At any old GC clear the keyed lookup cache to enable collection of unused |
474 // maps. | 473 // maps. |
475 ClearKeyedLookupCache(); | 474 ClearKeyedLookupCache(); |
476 | 475 |
477 CompilationCache::MarkCompactPrologue(); | 476 CompilationCache::MarkCompactPrologue(); |
478 RegExpImpl::OldSpaceCollectionPrologue(); | |
479 | 477 |
480 Top::MarkCompactPrologue(is_compacting); | 478 Top::MarkCompactPrologue(is_compacting); |
481 ThreadManager::MarkCompactPrologue(is_compacting); | 479 ThreadManager::MarkCompactPrologue(is_compacting); |
482 } | 480 } |
483 | 481 |
484 | 482 |
485 void Heap::MarkCompactEpilogue(bool is_compacting) { | 483 void Heap::MarkCompactEpilogue(bool is_compacting) { |
486 Top::MarkCompactEpilogue(is_compacting); | 484 Top::MarkCompactEpilogue(is_compacting); |
487 ThreadManager::MarkCompactEpilogue(is_compacting); | 485 ThreadManager::MarkCompactEpilogue(is_compacting); |
488 Heap::has_store_ics_ = false; | 486 Heap::has_store_ics_ = false; |
(...skipping 896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1385 share->set_lazy_load_data(undefined_value()); | 1383 share->set_lazy_load_data(undefined_value()); |
1386 share->set_script(undefined_value()); | 1384 share->set_script(undefined_value()); |
1387 share->set_start_position_and_type(0); | 1385 share->set_start_position_and_type(0); |
1388 share->set_debug_info(undefined_value()); | 1386 share->set_debug_info(undefined_value()); |
1389 return result; | 1387 return result; |
1390 } | 1388 } |
1391 | 1389 |
1392 | 1390 |
1393 Object* Heap::AllocateConsString(String* first, | 1391 Object* Heap::AllocateConsString(String* first, |
1394 String* second) { | 1392 String* second) { |
1395 StringShape first_shape(first); | 1393 int first_length = first->length(); |
1396 StringShape second_shape(second); | 1394 int second_length = second->length(); |
1397 int first_length = first->length(first_shape); | |
1398 int second_length = second->length(second_shape); | |
1399 int length = first_length + second_length; | 1395 int length = first_length + second_length; |
1400 bool is_ascii = first_shape.IsAsciiRepresentation() | 1396 bool is_ascii = StringShape(first).IsAsciiRepresentation() |
1401 && second_shape.IsAsciiRepresentation(); | 1397 && StringShape(second).IsAsciiRepresentation(); |
1402 | 1398 |
1403 // If the resulting string is small make a flat string. | 1399 // If the resulting string is small make a flat string. |
1404 if (length < String::kMinNonFlatLength) { | 1400 if (length < String::kMinNonFlatLength) { |
1405 ASSERT(first->IsFlat(first_shape)); | 1401 ASSERT(first->IsFlat()); |
1406 ASSERT(second->IsFlat(second_shape)); | 1402 ASSERT(second->IsFlat()); |
1407 if (is_ascii) { | 1403 if (is_ascii) { |
1408 Object* result = AllocateRawAsciiString(length); | 1404 Object* result = AllocateRawAsciiString(length); |
1409 if (result->IsFailure()) return result; | 1405 if (result->IsFailure()) return result; |
1410 // Copy the characters into the new object. | 1406 // Copy the characters into the new object. |
1411 char* dest = SeqAsciiString::cast(result)->GetChars(); | 1407 char* dest = SeqAsciiString::cast(result)->GetChars(); |
1412 String::WriteToFlat(first, first_shape, dest, 0, first_length); | 1408 String::WriteToFlat(first, dest, 0, first_length); |
1413 String::WriteToFlat(second, | 1409 String::WriteToFlat(second, dest + first_length, 0, second_length); |
1414 second_shape, | |
1415 dest + first_length, | |
1416 0, | |
1417 second_length); | |
1418 return result; | 1410 return result; |
1419 } else { | 1411 } else { |
1420 Object* result = AllocateRawTwoByteString(length); | 1412 Object* result = AllocateRawTwoByteString(length); |
1421 if (result->IsFailure()) return result; | 1413 if (result->IsFailure()) return result; |
1422 // Copy the characters into the new object. | 1414 // Copy the characters into the new object. |
1423 uc16* dest = SeqTwoByteString::cast(result)->GetChars(); | 1415 uc16* dest = SeqTwoByteString::cast(result)->GetChars(); |
1424 String::WriteToFlat(first, first_shape, dest, 0, first_length); | 1416 String::WriteToFlat(first, dest, 0, first_length); |
1425 String::WriteToFlat(second, | 1417 String::WriteToFlat(second, dest + first_length, 0, second_length); |
1426 second_shape, | |
1427 dest + first_length, | |
1428 0, | |
1429 second_length); | |
1430 return result; | 1418 return result; |
1431 } | 1419 } |
1432 } | 1420 } |
1433 | 1421 |
1434 Map* map; | 1422 Map* map; |
1435 if (length <= String::kMaxShortStringSize) { | 1423 if (length <= String::kMaxShortStringSize) { |
1436 map = is_ascii ? short_cons_ascii_string_map() | 1424 map = is_ascii ? short_cons_ascii_string_map() |
1437 : short_cons_string_map(); | 1425 : short_cons_string_map(); |
1438 } else if (length <= String::kMaxMediumStringSize) { | 1426 } else if (length <= String::kMaxMediumStringSize) { |
1439 map = is_ascii ? medium_cons_ascii_string_map() | 1427 map = is_ascii ? medium_cons_ascii_string_map() |
(...skipping 10 matching lines...) Expand all Loading... |
1450 cons_string->set_first(first, SKIP_WRITE_BARRIER); | 1438 cons_string->set_first(first, SKIP_WRITE_BARRIER); |
1451 cons_string->set_second(second, SKIP_WRITE_BARRIER); | 1439 cons_string->set_second(second, SKIP_WRITE_BARRIER); |
1452 cons_string->set_length(length); | 1440 cons_string->set_length(length); |
1453 return result; | 1441 return result; |
1454 } | 1442 } |
1455 | 1443 |
1456 | 1444 |
1457 Object* Heap::AllocateSlicedString(String* buffer, | 1445 Object* Heap::AllocateSlicedString(String* buffer, |
1458 int start, | 1446 int start, |
1459 int end) { | 1447 int end) { |
1460 StringShape buffer_shape(buffer); | |
1461 int length = end - start; | 1448 int length = end - start; |
1462 | 1449 |
1463 // If the resulting string is small make a sub string. | 1450 // If the resulting string is small make a sub string. |
1464 if (end - start <= String::kMinNonFlatLength) { | 1451 if (end - start <= String::kMinNonFlatLength) { |
1465 return Heap::AllocateSubString(buffer, buffer_shape, start, end); | 1452 return Heap::AllocateSubString(buffer, start, end); |
1466 } | 1453 } |
1467 | 1454 |
1468 Map* map; | 1455 Map* map; |
1469 if (length <= String::kMaxShortStringSize) { | 1456 if (length <= String::kMaxShortStringSize) { |
1470 map = buffer_shape.IsAsciiRepresentation() ? | 1457 map = StringShape(buffer).IsAsciiRepresentation() ? |
1471 short_sliced_ascii_string_map() : | 1458 short_sliced_ascii_string_map() : |
1472 short_sliced_string_map(); | 1459 short_sliced_string_map(); |
1473 } else if (length <= String::kMaxMediumStringSize) { | 1460 } else if (length <= String::kMaxMediumStringSize) { |
1474 map = buffer_shape.IsAsciiRepresentation() ? | 1461 map = StringShape(buffer).IsAsciiRepresentation() ? |
1475 medium_sliced_ascii_string_map() : | 1462 medium_sliced_ascii_string_map() : |
1476 medium_sliced_string_map(); | 1463 medium_sliced_string_map(); |
1477 } else { | 1464 } else { |
1478 map = buffer_shape.IsAsciiRepresentation() ? | 1465 map = StringShape(buffer).IsAsciiRepresentation() ? |
1479 long_sliced_ascii_string_map() : | 1466 long_sliced_ascii_string_map() : |
1480 long_sliced_string_map(); | 1467 long_sliced_string_map(); |
1481 } | 1468 } |
1482 | 1469 |
1483 Object* result = Allocate(map, NEW_SPACE); | 1470 Object* result = Allocate(map, NEW_SPACE); |
1484 if (result->IsFailure()) return result; | 1471 if (result->IsFailure()) return result; |
1485 | 1472 |
1486 SlicedString* sliced_string = SlicedString::cast(result); | 1473 SlicedString* sliced_string = SlicedString::cast(result); |
1487 sliced_string->set_buffer(buffer); | 1474 sliced_string->set_buffer(buffer); |
1488 sliced_string->set_start(start); | 1475 sliced_string->set_start(start); |
1489 sliced_string->set_length(length); | 1476 sliced_string->set_length(length); |
1490 | 1477 |
1491 return result; | 1478 return result; |
1492 } | 1479 } |
1493 | 1480 |
1494 | 1481 |
1495 Object* Heap::AllocateSubString(String* buffer, | 1482 Object* Heap::AllocateSubString(String* buffer, |
1496 StringShape buffer_shape, | |
1497 int start, | 1483 int start, |
1498 int end) { | 1484 int end) { |
1499 int length = end - start; | 1485 int length = end - start; |
1500 | 1486 |
1501 if (length == 1) { | 1487 if (length == 1) { |
1502 return Heap::LookupSingleCharacterStringFromCode( | 1488 return Heap::LookupSingleCharacterStringFromCode( |
1503 buffer->Get(buffer_shape, start)); | 1489 buffer->Get(start)); |
1504 } | 1490 } |
1505 | 1491 |
1506 // Make an attempt to flatten the buffer to reduce access time. | 1492 // Make an attempt to flatten the buffer to reduce access time. |
1507 if (!buffer->IsFlat(buffer_shape)) { | 1493 if (!buffer->IsFlat()) { |
1508 buffer->TryFlatten(buffer_shape); | 1494 buffer->TryFlatten(); |
1509 buffer_shape = StringShape(buffer); | |
1510 } | 1495 } |
1511 | 1496 |
1512 Object* result = buffer_shape.IsAsciiRepresentation() | 1497 Object* result = StringShape(buffer).IsAsciiRepresentation() |
1513 ? AllocateRawAsciiString(length) | 1498 ? AllocateRawAsciiString(length) |
1514 : AllocateRawTwoByteString(length); | 1499 : AllocateRawTwoByteString(length); |
1515 if (result->IsFailure()) return result; | 1500 if (result->IsFailure()) return result; |
1516 | 1501 |
1517 // Copy the characters into the new object. | 1502 // Copy the characters into the new object. |
1518 String* string_result = String::cast(result); | 1503 String* string_result = String::cast(result); |
1519 StringShape result_shape(string_result); | |
1520 StringHasher hasher(length); | 1504 StringHasher hasher(length); |
1521 int i = 0; | 1505 int i = 0; |
1522 for (; i < length && hasher.is_array_index(); i++) { | 1506 for (; i < length && hasher.is_array_index(); i++) { |
1523 uc32 c = buffer->Get(buffer_shape, start + i); | 1507 uc32 c = buffer->Get(start + i); |
1524 hasher.AddCharacter(c); | 1508 hasher.AddCharacter(c); |
1525 string_result->Set(result_shape, i, c); | 1509 string_result->Set(i, c); |
1526 } | 1510 } |
1527 for (; i < length; i++) { | 1511 for (; i < length; i++) { |
1528 uc32 c = buffer->Get(buffer_shape, start + i); | 1512 uc32 c = buffer->Get(start + i); |
1529 hasher.AddCharacterNoIndex(c); | 1513 hasher.AddCharacterNoIndex(c); |
1530 string_result->Set(result_shape, i, c); | 1514 string_result->Set(i, c); |
1531 } | 1515 } |
1532 string_result->set_length_field(hasher.GetHashField()); | 1516 string_result->set_length_field(hasher.GetHashField()); |
1533 return result; | 1517 return result; |
1534 } | 1518 } |
1535 | 1519 |
1536 | 1520 |
1537 Object* Heap::AllocateExternalStringFromAscii( | 1521 Object* Heap::AllocateExternalStringFromAscii( |
1538 ExternalAsciiString::Resource* resource) { | 1522 ExternalAsciiString::Resource* resource) { |
1539 Map* map; | 1523 Map* map; |
1540 int length = resource->length(); | 1524 int length = resource->length(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1583 Object* result = LookupSymbol(Vector<const char>(buffer, 1)); | 1567 Object* result = LookupSymbol(Vector<const char>(buffer, 1)); |
1584 | 1568 |
1585 if (result->IsFailure()) return result; | 1569 if (result->IsFailure()) return result; |
1586 Heap::single_character_string_cache()->set(code, result); | 1570 Heap::single_character_string_cache()->set(code, result); |
1587 return result; | 1571 return result; |
1588 } | 1572 } |
1589 | 1573 |
1590 Object* result = Heap::AllocateRawTwoByteString(1); | 1574 Object* result = Heap::AllocateRawTwoByteString(1); |
1591 if (result->IsFailure()) return result; | 1575 if (result->IsFailure()) return result; |
1592 String* answer = String::cast(result); | 1576 String* answer = String::cast(result); |
1593 answer->Set(StringShape(answer), 0, code); | 1577 answer->Set(0, code); |
1594 return answer; | 1578 return answer; |
1595 } | 1579 } |
1596 | 1580 |
1597 | 1581 |
1598 Object* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { | 1582 Object* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
1599 if (pretenure == NOT_TENURED) { | 1583 if (pretenure == NOT_TENURED) { |
1600 return AllocateByteArray(length); | 1584 return AllocateByteArray(length); |
1601 } | 1585 } |
1602 int size = ByteArray::SizeFor(length); | 1586 int size = ByteArray::SizeFor(length); |
1603 AllocationSpace space = | 1587 AllocationSpace space = |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2009 // If the string is ascii, we do not need to convert the characters | 1993 // If the string is ascii, we do not need to convert the characters |
2010 // since UTF8 is backwards compatible with ascii. | 1994 // since UTF8 is backwards compatible with ascii. |
2011 if (is_ascii) return AllocateStringFromAscii(string, pretenure); | 1995 if (is_ascii) return AllocateStringFromAscii(string, pretenure); |
2012 | 1996 |
2013 Object* result = AllocateRawTwoByteString(chars, pretenure); | 1997 Object* result = AllocateRawTwoByteString(chars, pretenure); |
2014 if (result->IsFailure()) return result; | 1998 if (result->IsFailure()) return result; |
2015 | 1999 |
2016 // Convert and copy the characters into the new object. | 2000 // Convert and copy the characters into the new object. |
2017 String* string_result = String::cast(result); | 2001 String* string_result = String::cast(result); |
2018 decoder->Reset(string.start(), string.length()); | 2002 decoder->Reset(string.start(), string.length()); |
2019 StringShape result_shape(string_result); | |
2020 for (int i = 0; i < chars; i++) { | 2003 for (int i = 0; i < chars; i++) { |
2021 uc32 r = decoder->GetNext(); | 2004 uc32 r = decoder->GetNext(); |
2022 string_result->Set(result_shape, i, r); | 2005 string_result->Set(i, r); |
2023 } | 2006 } |
2024 return result; | 2007 return result; |
2025 } | 2008 } |
2026 | 2009 |
2027 | 2010 |
2028 Object* Heap::AllocateStringFromTwoByte(Vector<const uc16> string, | 2011 Object* Heap::AllocateStringFromTwoByte(Vector<const uc16> string, |
2029 PretenureFlag pretenure) { | 2012 PretenureFlag pretenure) { |
2030 // Check if the string is an ASCII string. | 2013 // Check if the string is an ASCII string. |
2031 int i = 0; | 2014 int i = 0; |
2032 while (i < string.length() && string[i] <= String::kMaxAsciiCharCode) i++; | 2015 while (i < string.length() && string[i] <= String::kMaxAsciiCharCode) i++; |
2033 | 2016 |
2034 Object* result; | 2017 Object* result; |
2035 if (i == string.length()) { // It's an ASCII string. | 2018 if (i == string.length()) { // It's an ASCII string. |
2036 result = AllocateRawAsciiString(string.length(), pretenure); | 2019 result = AllocateRawAsciiString(string.length(), pretenure); |
2037 } else { // It's not an ASCII string. | 2020 } else { // It's not an ASCII string. |
2038 result = AllocateRawTwoByteString(string.length(), pretenure); | 2021 result = AllocateRawTwoByteString(string.length(), pretenure); |
2039 } | 2022 } |
2040 if (result->IsFailure()) return result; | 2023 if (result->IsFailure()) return result; |
2041 | 2024 |
2042 // Copy the characters into the new object, which may be either ASCII or | 2025 // Copy the characters into the new object, which may be either ASCII or |
2043 // UTF-16. | 2026 // UTF-16. |
2044 String* string_result = String::cast(result); | 2027 String* string_result = String::cast(result); |
2045 StringShape result_shape(string_result); | |
2046 for (int i = 0; i < string.length(); i++) { | 2028 for (int i = 0; i < string.length(); i++) { |
2047 string_result->Set(result_shape, i, string[i]); | 2029 string_result->Set(i, string[i]); |
2048 } | 2030 } |
2049 return result; | 2031 return result; |
2050 } | 2032 } |
2051 | 2033 |
2052 | 2034 |
2053 Map* Heap::SymbolMapForString(String* string) { | 2035 Map* Heap::SymbolMapForString(String* string) { |
2054 // If the string is in new space it cannot be used as a symbol. | 2036 // If the string is in new space it cannot be used as a symbol. |
2055 if (InNewSpace(string)) return NULL; | 2037 if (InNewSpace(string)) return NULL; |
2056 | 2038 |
2057 // Find the corresponding symbol map for strings. | 2039 // Find the corresponding symbol map for strings. |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2156 | 2138 |
2157 // Allocate string. | 2139 // Allocate string. |
2158 AllocationSpace space = | 2140 AllocationSpace space = |
2159 (size > MaxHeapObjectSize()) ? LO_SPACE : OLD_DATA_SPACE; | 2141 (size > MaxHeapObjectSize()) ? LO_SPACE : OLD_DATA_SPACE; |
2160 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2142 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); |
2161 if (result->IsFailure()) return result; | 2143 if (result->IsFailure()) return result; |
2162 | 2144 |
2163 reinterpret_cast<HeapObject*>(result)->set_map(map); | 2145 reinterpret_cast<HeapObject*>(result)->set_map(map); |
2164 // The hash value contains the length of the string. | 2146 // The hash value contains the length of the string. |
2165 String* answer = String::cast(result); | 2147 String* answer = String::cast(result); |
2166 StringShape answer_shape(answer); | |
2167 answer->set_length_field(length_field); | 2148 answer->set_length_field(length_field); |
2168 | 2149 |
2169 ASSERT_EQ(size, answer->Size()); | 2150 ASSERT_EQ(size, answer->Size()); |
2170 | 2151 |
2171 // Fill in the characters. | 2152 // Fill in the characters. |
2172 for (int i = 0; i < chars; i++) { | 2153 for (int i = 0; i < chars; i++) { |
2173 answer->Set(answer_shape, i, buffer->GetNext()); | 2154 answer->Set(i, buffer->GetNext()); |
2174 } | 2155 } |
2175 return answer; | 2156 return answer; |
2176 } | 2157 } |
2177 | 2158 |
2178 | 2159 |
2179 Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { | 2160 Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { |
2180 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 2161 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
2181 int size = SeqAsciiString::SizeFor(length); | 2162 int size = SeqAsciiString::SizeFor(length); |
2182 if (size > MaxHeapObjectSize()) { | 2163 if (size > MaxHeapObjectSize()) { |
2183 space = LO_SPACE; | 2164 space = LO_SPACE; |
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3344 #ifdef DEBUG | 3325 #ifdef DEBUG |
3345 bool Heap::GarbageCollectionGreedyCheck() { | 3326 bool Heap::GarbageCollectionGreedyCheck() { |
3346 ASSERT(FLAG_gc_greedy); | 3327 ASSERT(FLAG_gc_greedy); |
3347 if (Bootstrapper::IsActive()) return true; | 3328 if (Bootstrapper::IsActive()) return true; |
3348 if (disallow_allocation_failure()) return true; | 3329 if (disallow_allocation_failure()) return true; |
3349 return CollectGarbage(0, NEW_SPACE); | 3330 return CollectGarbage(0, NEW_SPACE); |
3350 } | 3331 } |
3351 #endif | 3332 #endif |
3352 | 3333 |
3353 } } // namespace v8::internal | 3334 } } // namespace v8::internal |
OLD | NEW |