Index: src/heap-inl.h |
diff --git a/src/heap-inl.h b/src/heap-inl.h |
index 43d4a999cdb5a0b5b5c5d0c4c2643f7b7e28085f..ab1fdb4cfe6edec5f28ad39da55d44b9c2a73fcc 100644 |
--- a/src/heap-inl.h |
+++ b/src/heap-inl.h |
@@ -577,56 +577,67 @@ Isolate* Heap::isolate() { |
// Warning: Do not use the identifiers __object__, __maybe_object__ or |
// __scope__ in a call to this macro. |
-#define CALL_AND_RETRY(ISOLATE, FUNCTION_CALL, RETURN_VALUE, RETURN_EMPTY)\ |
- do { \ |
- GC_GREEDY_CHECK(); \ |
- MaybeObject* __maybe_object__ = FUNCTION_CALL; \ |
- Object* __object__ = NULL; \ |
- if (__maybe_object__->ToObject(&__object__)) RETURN_VALUE; \ |
- if (__maybe_object__->IsOutOfMemory()) { \ |
- v8::internal::V8::FatalProcessOutOfMemory("CALL_AND_RETRY_0", true);\ |
- } \ |
- if (!__maybe_object__->IsRetryAfterGC()) RETURN_EMPTY; \ |
- ISOLATE->heap()->CollectGarbage(Failure::cast(__maybe_object__)-> \ |
- allocation_space(), \ |
- "allocation failure"); \ |
- __maybe_object__ = FUNCTION_CALL; \ |
- if (__maybe_object__->ToObject(&__object__)) RETURN_VALUE; \ |
- if (__maybe_object__->IsOutOfMemory()) { \ |
- v8::internal::V8::FatalProcessOutOfMemory("CALL_AND_RETRY_1", true);\ |
- } \ |
- if (!__maybe_object__->IsRetryAfterGC()) RETURN_EMPTY; \ |
- ISOLATE->counters()->gc_last_resort_from_handles()->Increment(); \ |
- ISOLATE->heap()->CollectAllAvailableGarbage("last resort gc"); \ |
- { \ |
- AlwaysAllocateScope __scope__; \ |
- __maybe_object__ = FUNCTION_CALL; \ |
- } \ |
- if (__maybe_object__->ToObject(&__object__)) RETURN_VALUE; \ |
- if (__maybe_object__->IsOutOfMemory() || \ |
- __maybe_object__->IsRetryAfterGC()) { \ |
- /* TODO(1181417): Fix this. */ \ |
- v8::internal::V8::FatalProcessOutOfMemory("CALL_AND_RETRY_2", true);\ |
- } \ |
- RETURN_EMPTY; \ |
+#define CALL_AND_RETRY(ISOLATE, FUNCTION_CALL, RETURN_VALUE, RETURN_EMPTY, OOM)\ |
+ do { \ |
+ GC_GREEDY_CHECK(); \ |
+ MaybeObject* __maybe_object__ = FUNCTION_CALL; \ |
+ Object* __object__ = NULL; \ |
+ if (__maybe_object__->ToObject(&__object__)) RETURN_VALUE; \ |
+ if (__maybe_object__->IsOutOfMemory()) { \ |
+ OOM; \ |
+ } \ |
+ if (!__maybe_object__->IsRetryAfterGC()) RETURN_EMPTY; \ |
+ ISOLATE->heap()->CollectGarbage(Failure::cast(__maybe_object__)-> \ |
+ allocation_space(), \ |
+ "allocation failure"); \ |
+ __maybe_object__ = FUNCTION_CALL; \ |
+ if (__maybe_object__->ToObject(&__object__)) RETURN_VALUE; \ |
+ if (__maybe_object__->IsOutOfMemory()) { \ |
+ OOM; \ |
+ } \ |
+ if (!__maybe_object__->IsRetryAfterGC()) RETURN_EMPTY; \ |
+ ISOLATE->counters()->gc_last_resort_from_handles()->Increment(); \ |
+ ISOLATE->heap()->CollectAllAvailableGarbage("last resort gc"); \ |
+ { \ |
+ AlwaysAllocateScope __scope__; \ |
+ __maybe_object__ = FUNCTION_CALL; \ |
+ } \ |
+ if (__maybe_object__->ToObject(&__object__)) RETURN_VALUE; \ |
+ if (__maybe_object__->IsOutOfMemory()) { \ |
+ OOM; \ |
+ } \ |
+ if (__maybe_object__->IsRetryAfterGC()) { \ |
+ /* TODO(1181417): Fix this. */ \ |
+ v8::internal::V8::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); \ |
+ } \ |
+ RETURN_EMPTY; \ |
} while (false) |
+#define CALL_AND_RETRY_OR_DIE( \ |
+ ISOLATE, FUNCTION_CALL, RETURN_VALUE, RETURN_EMPTY) \ |
+ CALL_AND_RETRY( \ |
+ ISOLATE, \ |
+ FUNCTION_CALL, \ |
+ RETURN_VALUE, \ |
+ RETURN_EMPTY, \ |
+ v8::internal::V8::FatalProcessOutOfMemory("CALL_AND_RETRY", true)) |
-#define CALL_HEAP_FUNCTION(ISOLATE, FUNCTION_CALL, TYPE) \ |
- CALL_AND_RETRY(ISOLATE, \ |
- FUNCTION_CALL, \ |
- return Handle<TYPE>(TYPE::cast(__object__), ISOLATE), \ |
- return Handle<TYPE>()) |
+#define CALL_HEAP_FUNCTION(ISOLATE, FUNCTION_CALL, TYPE) \ |
+ CALL_AND_RETRY_OR_DIE(ISOLATE, \ |
+ FUNCTION_CALL, \ |
+ return Handle<TYPE>(TYPE::cast(__object__), ISOLATE), \ |
+ return Handle<TYPE>()) \ |
-#define CALL_HEAP_FUNCTION_VOID(ISOLATE, FUNCTION_CALL) \ |
- CALL_AND_RETRY(ISOLATE, FUNCTION_CALL, return, return) |
+#define CALL_HEAP_FUNCTION_VOID(ISOLATE, FUNCTION_CALL) \ |
+ CALL_AND_RETRY_OR_DIE(ISOLATE, FUNCTION_CALL, return, return) |
#define CALL_HEAP_FUNCTION_PASS_EXCEPTION(ISOLATE, FUNCTION_CALL) \ |
CALL_AND_RETRY(ISOLATE, \ |
FUNCTION_CALL, \ |
return __object__, \ |
+ return __maybe_object__, \ |
return __maybe_object__) |