Chromium Code Reviews| Index: src/spaces.cc |
| =================================================================== |
| --- src/spaces.cc (revision 9609) |
| +++ src/spaces.cc (working copy) |
| @@ -1909,11 +1909,24 @@ |
| bool NewSpace::ReserveSpace(int bytes) { |
| // We can't reliably unpack a partial snapshot that needs more new space |
| - // space than the minimum NewSpace size. |
| + // space than the minimum NewSpace size. The limit can be set lower than |
| + // the end of new space either because there is more space on the next page |
| + // or because we have lowered the limit in order to get periodic incremental |
| + // marking. The most reliable way to ensure that there is linear space is |
| + // to do the allocation, then rewind the limit. |
| ASSERT(bytes <= InitialCapacity()); |
| - Address limit = allocation_info_.limit; |
| + MaybeObject* maybe = AllocateRawInternal(bytes); |
| + Object* object = NULL; |
| + if (!maybe->ToObject(&object)) return false; |
| + HeapObject* allocation = HeapObject::cast(object); |
| Address top = allocation_info_.top; |
| - return limit - top >= bytes; |
| + if (top - bytes == allocation->address()) { |
|
Vyacheslav Egorov (Chromium)
2011/10/14 10:47:39
I like to have parens around top - bytes.
|
| + allocation_info_.top = allocation->address(); |
| + return true; |
| + } |
| + // There may be a borderline case here where the allocation succeeded, but |
| + // the limit and top have moved on to a new page. In that case we try again. |
| + return ReserveSpace(bytes); |
| } |