Revision: 14358
Author: [email protected]
Date: Fri Apr 19 08:55:34 2013
Log: Propagate OOM exception instead of crashing in
CALL_HEAP_FUNCTION_PASS_EXCEPTION macro.
[email protected]
BUG=webkit/fast/js/concat-large-strings-crash.html
Review URL: https://chromiumcodereview.appspot.com/14365017
http://code.google.com/p/v8/source/detail?r=14358
Modified:
/branches/bleeding_edge/src/heap-inl.h
/branches/bleeding_edge/src/objects.cc
=======================================
--- /branches/bleeding_edge/src/heap-inl.h Thu Apr 18 01:14:59 2013
+++ /branches/bleeding_edge/src/heap-inl.h Fri Apr 19 08:55:34 2013
@@ -577,56 +577,67 @@
// 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__)
=======================================
--- /branches/bleeding_edge/src/objects.cc Fri Apr 19 06:26:47 2013
+++ /branches/bleeding_edge/src/objects.cc Fri Apr 19 08:55:34 2013
@@ -4027,10 +4027,10 @@
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.