| 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__)
|
|
|
|
|
|
|