| 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 1512 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1523  |  1523  | 
|  1524   // There is no next page in this space.  Try free list allocation. |  1524   // There is no next page in this space.  Try free list allocation. | 
|  1525   int wasted_bytes; |  1525   int wasted_bytes; | 
|  1526   Object* result = free_list_.Allocate(size_in_bytes, &wasted_bytes); |  1526   Object* result = free_list_.Allocate(size_in_bytes, &wasted_bytes); | 
|  1527   accounting_stats_.WasteBytes(wasted_bytes); |  1527   accounting_stats_.WasteBytes(wasted_bytes); | 
|  1528   if (!result->IsFailure()) { |  1528   if (!result->IsFailure()) { | 
|  1529     accounting_stats_.AllocateBytes(size_in_bytes); |  1529     accounting_stats_.AllocateBytes(size_in_bytes); | 
|  1530     return HeapObject::cast(result); |  1530     return HeapObject::cast(result); | 
|  1531   } |  1531   } | 
|  1532  |  1532  | 
|  1533   // Free list allocation failed and there is no next page.  Try to expand |  1533   // Free list allocation failed and there is no next page.  Fail if we have | 
|  1534   // the space and allocate in the new next page. |  1534   // hit the old generation size limit that should cause a garbage | 
 |  1535   // collection. | 
 |  1536   if (Heap::OldGenerationAllocationLimitReached()) { | 
 |  1537     return NULL; | 
 |  1538   } | 
 |  1539  | 
 |  1540   // Try to expand the space and allocate in the new next page. | 
|  1535   ASSERT(!current_page->next_page()->is_valid()); |  1541   ASSERT(!current_page->next_page()->is_valid()); | 
|  1536   if (Expand(current_page)) { |  1542   if (Expand(current_page)) { | 
|  1537     return AllocateInNextPage(current_page, size_in_bytes); |  1543     return AllocateInNextPage(current_page, size_in_bytes); | 
|  1538   } |  1544   } | 
|  1539  |  1545  | 
|  1540   // Finally, fail. |  1546   // Finally, fail. | 
|  1541   return NULL; |  1547   return NULL; | 
|  1542 } |  1548 } | 
|  1543  |  1549  | 
|  1544  |  1550  | 
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2002   // map space free list implicitly assumes that all free blocks are map |  2008   // map space free list implicitly assumes that all free blocks are map | 
|  2003   // sized. |  2009   // sized. | 
|  2004   if (size_in_bytes == Map::kSize) { |  2010   if (size_in_bytes == Map::kSize) { | 
|  2005     Object* result = free_list_.Allocate(); |  2011     Object* result = free_list_.Allocate(); | 
|  2006     if (!result->IsFailure()) { |  2012     if (!result->IsFailure()) { | 
|  2007       accounting_stats_.AllocateBytes(size_in_bytes); |  2013       accounting_stats_.AllocateBytes(size_in_bytes); | 
|  2008       return HeapObject::cast(result); |  2014       return HeapObject::cast(result); | 
|  2009     } |  2015     } | 
|  2010   } |  2016   } | 
|  2011  |  2017  | 
|  2012   // Free list allocation failed and there is no next page.  Try to expand |  2018   // Free list allocation failed and there is no next page.  Fail if we have | 
|  2013   // the space and allocate in the new next page. |  2019   // hit the old generation size limit that should cause a garbage | 
 |  2020   // collection. | 
 |  2021   if (Heap::OldGenerationAllocationLimitReached()) { | 
 |  2022     return NULL; | 
 |  2023   } | 
 |  2024  | 
 |  2025   // Try to expand the space and allocate in the new next page. | 
|  2014   ASSERT(!current_page->next_page()->is_valid()); |  2026   ASSERT(!current_page->next_page()->is_valid()); | 
|  2015   if (Expand(current_page)) { |  2027   if (Expand(current_page)) { | 
|  2016     return AllocateInNextPage(current_page, size_in_bytes); |  2028     return AllocateInNextPage(current_page, size_in_bytes); | 
|  2017   } |  2029   } | 
|  2018  |  2030  | 
|  2019   // Finally, fail. |  2031   // Finally, fail. | 
|  2020   return NULL; |  2032   return NULL; | 
|  2021 } |  2033 } | 
|  2022  |  2034  | 
|  2023  |  2035  | 
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2229  |  2241  | 
|  2230   size_ = 0; |  2242   size_ = 0; | 
|  2231   page_count_ = 0; |  2243   page_count_ = 0; | 
|  2232 } |  2244 } | 
|  2233  |  2245  | 
|  2234  |  2246  | 
|  2235 Object* LargeObjectSpace::AllocateRawInternal(int requested_size, |  2247 Object* LargeObjectSpace::AllocateRawInternal(int requested_size, | 
|  2236                                               int object_size, |  2248                                               int object_size, | 
|  2237                                               Executability executable) { |  2249                                               Executability executable) { | 
|  2238   ASSERT(0 < object_size && object_size <= requested_size); |  2250   ASSERT(0 < object_size && object_size <= requested_size); | 
 |  2251  | 
 |  2252   // Check if we want to force a GC before growing the old space further. | 
 |  2253   // If so, fail the allocation. | 
 |  2254   if (Heap::OldGenerationAllocationLimitReached()) { | 
 |  2255     return Failure::RetryAfterGC(requested_size, identity()); | 
 |  2256   } | 
 |  2257  | 
|  2239   size_t chunk_size; |  2258   size_t chunk_size; | 
|  2240   LargeObjectChunk* chunk = |  2259   LargeObjectChunk* chunk = | 
|  2241       LargeObjectChunk::New(requested_size, &chunk_size, executable); |  2260       LargeObjectChunk::New(requested_size, &chunk_size, executable); | 
|  2242   if (chunk == NULL) { |  2261   if (chunk == NULL) { | 
|  2243     return Failure::RetryAfterGC(requested_size, identity()); |  2262     return Failure::RetryAfterGC(requested_size, identity()); | 
|  2244   } |  2263   } | 
|  2245  |  2264  | 
|  2246   size_ += chunk_size; |  2265   size_ += chunk_size; | 
|  2247   page_count_++; |  2266   page_count_++; | 
|  2248   chunk->set_next(first_chunk_); |  2267   chunk->set_next(first_chunk_); | 
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2518                      reinterpret_cast<Object**>(object->address() |  2537                      reinterpret_cast<Object**>(object->address() | 
|  2519                                                 + Page::kObjectAreaSize), |  2538                                                 + Page::kObjectAreaSize), | 
|  2520                      allocation_top); |  2539                      allocation_top); | 
|  2521       PrintF("\n"); |  2540       PrintF("\n"); | 
|  2522     } |  2541     } | 
|  2523   } |  2542   } | 
|  2524 } |  2543 } | 
|  2525 #endif  // DEBUG |  2544 #endif  // DEBUG | 
|  2526  |  2545  | 
|  2527 } }  // namespace v8::internal |  2546 } }  // namespace v8::internal | 
| OLD | NEW |