Reviewers: Jakob,
Message:
PTAL
Description:
Propogate OOM exception instead of crashing in
CALL_HEAP_FUNCTION_PASS_EXCEPTION
macro.
[email protected]
BUG=webkit/fast/js/concat-large-strings-crash.html
Please review this at https://chromiumcodereview.appspot.com/14365017/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/heap-inl.h
M src/objects.cc
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__)
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
1da76c685c210a972334881fa70128f45a241c3b..17c648a536011dd9bdd507947ddd1e6eed220a78
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -4027,10 +4027,10 @@ MaybeObject* JSObject::SetIdentityHash(Smi* hash,
CreationFlag flag) {
int JSObject::GetIdentityHash(Handle<JSObject> obj) {
- CALL_AND_RETRY(obj->GetIsolate(),
- obj->GetIdentityHash(ALLOW_CREATION),
- return Smi::cast(__object__)->value(),
- return 0);
+ CALL_AND_RETRY_OR_DIE(obj->GetIsolate(),
+ obj->GetIdentityHash(ALLOW_CREATION),
+ return Smi::cast(__object__)->value(),
+ return 0);
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.