AllocationResult __allocation__ = FUNCTION_CALL; \
Object* __object__ = NULL; \
RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \
- (ISOLATE)->heap()->CollectGarbage(__allocation__.RetrySpace(), \
- "allocation failure"); \
- __allocation__ = FUNCTION_CALL; \
- RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \
+ /* Two GCs before panicking. In newspace will almost always succeed. */ \
+ for (int __i__ = 0; __i__ < 2; __i__++) { \
+ (ISOLATE)->heap()->CollectGarbage(__allocation__.RetrySpace(), \
+ "allocation failure"); \
+ __allocation__ = FUNCTION_CALL; \
+ RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \
+ } \
(ISOLATE)->counters()->gc_last_resort_from_handles()->Increment(); \
(ISOLATE)->heap()->CollectAllAvailableGarbage("last resort gc"); \
{ \
static AllocationResult AllocateAfterFailures() {
static int attempts = 0;
- if (++attempts < 3) return AllocationResult::Retry();
+ // The first 4 times we simulate a full heap, by returning retry.
+ if (++attempts < 4) return AllocationResult::Retry();
+
+ // Expose some private stuff on Heap.
TestHeap* heap = CcTest::test_heap();
+ // Now that we have returned 'retry' 4 times, we are in a last-chance
+ // scenario, with always_allocate. See CALL_AND_RETRY. Test that all
+ // allocations succeed.
+
// New space.
SimulateFullSpace(heap->new_space());
heap->AllocateByteArray(100).ToObjectChecked();