Index: Source/bindings/v8/custom/V8PromiseCustom.cpp |
diff --git a/Source/bindings/v8/custom/V8PromiseCustom.cpp b/Source/bindings/v8/custom/V8PromiseCustom.cpp |
index 14200e2541949968394eeac583b2fa28360c0c6f..4e57af31f5ed3b9260bc0aa7f230e3aa912a8cea 100644 |
--- a/Source/bindings/v8/custom/V8PromiseCustom.cpp |
+++ b/Source/bindings/v8/custom/V8PromiseCustom.cpp |
@@ -31,7 +31,6 @@ |
#include "config.h" |
#include "bindings/v8/custom/V8PromiseCustom.h" |
-#include <v8.h> |
#include "V8Promise.h" |
#include "bindings/v8/DOMRequestState.h" |
#include "bindings/v8/ScopedPersistent.h" |
@@ -52,6 +51,12 @@ |
#include "wtf/Functional.h" |
#include "wtf/Noncopyable.h" |
#include "wtf/PassOwnPtr.h" |
+#include <v8.h> |
+ |
+#define RETURN_IF_EMPTY(handle, result) \ |
haraken
2014/02/21 04:19:21
I don't know if this macro is worth adding. We nor
yhirano
2014/02/21 07:32:51
Done.
|
+ if ((handle).IsEmpty()) { \ |
+ return (result); \ |
+ } |
namespace WebCore { |
@@ -141,6 +146,7 @@ v8::Local<v8::Object> promiseAllEnvironment(v8::Handle<v8::Object> promise, v8:: |
{ |
v8::Local<v8::ObjectTemplate> objectTemplate = promiseAllEnvironmentObjectTemplate(isolate); |
v8::Local<v8::Object> environment = objectTemplate->NewInstance(); |
+ RETURN_IF_EMPTY(environment, v8::Local<v8::Object>()); |
environment->SetInternalField(V8PromiseCustom::PromiseAllEnvironmentPromiseIndex, promise); |
environment->SetInternalField(V8PromiseCustom::PromiseAllEnvironmentCountdownIndex, countdownWrapper); |
@@ -491,11 +497,10 @@ void V8Promise::constructorCustom(const v8::FunctionCallbackInfo<v8::Value>& inf |
return; |
} |
v8::Local<v8::Function> init = info[0].As<v8::Function>(); |
- v8::Local<v8::Object> promise = V8PromiseCustom::createPromise(info.Holder(), isolate); |
- v8::Handle<v8::Value> argv[] = { |
- createClosure(promiseResolveCallback, promise, isolate), |
- createClosure(promiseRejectCallback, promise, isolate) |
- }; |
+ V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromise(info.Holder(), isolate)); |
+ V8TRYCATCH_VOID(v8::Handle<v8::Value>, resolve, createClosure(promiseResolveCallback, promise, isolate)); |
+ V8TRYCATCH_VOID(v8::Handle<v8::Value>, reject, createClosure(promiseRejectCallback, promise, isolate)); |
+ v8::Handle<v8::Value> argv[] = { resolve, reject }; |
v8::TryCatch trycatch; |
if (V8ScriptRunner::callFunction(init, currentExecutionContext(isolate), v8::Undefined(isolate), WTF_ARRAY_LENGTH(argv), argv, isolate).IsEmpty()) { |
// An exception is thrown. Reject the promise if its resolved flag is unset. |
@@ -552,7 +557,7 @@ void V8Promise::resolveMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& i |
if (info.Length() > 0) |
result = info[0]; |
- v8::Local<v8::Object> promise = V8PromiseCustom::createPromise(info.Holder(), isolate); |
+ V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromise(info.Holder(), isolate)); |
V8PromiseCustom::resolve(promise, result, isolate); |
v8SetReturnValue(info, promise); |
} |
@@ -566,7 +571,7 @@ void V8Promise::rejectMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& in |
if (info.Length() > 0) |
result = info[0]; |
- v8::Local<v8::Object> promise = V8PromiseCustom::createPromise(info.Holder(), isolate); |
+ V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromise(info.Holder(), isolate)); |
V8PromiseCustom::reject(promise, result, isolate); |
v8SetReturnValue(info, promise); |
} |
@@ -574,7 +579,7 @@ void V8Promise::rejectMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& in |
void V8Promise::raceMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) |
{ |
v8::Isolate* isolate = info.GetIsolate(); |
- v8::Local<v8::Object> promise = V8PromiseCustom::createPromise(info.Holder(), isolate); |
+ V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromise(info.Holder(), isolate)); |
if (!info.Length() || !info[0]->IsArray()) { |
v8SetReturnValue(info, promise); |
@@ -583,8 +588,8 @@ void V8Promise::raceMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info |
// FIXME: Now we limit the iterable type to the Array type. |
v8::Local<v8::Array> iterable = info[0].As<v8::Array>(); |
- v8::Local<v8::Function> onFulfilled = createClosure(promiseResolveCallback, promise, isolate); |
- v8::Local<v8::Function> onRejected = createClosure(promiseRejectCallback, promise, isolate); |
+ V8TRYCATCH_VOID(v8::Local<v8::Function>, onFulfilled, createClosure(promiseResolveCallback, promise, isolate)); |
+ V8TRYCATCH_VOID(v8::Local<v8::Function>, onRejected, createClosure(promiseRejectCallback, promise, isolate)); |
for (unsigned i = 0, length = iterable->Length(); i < length; ++i) { |
// Array-holes should not be skipped by for-of iteration semantics. |
@@ -598,7 +603,7 @@ void V8Promise::raceMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info |
void V8Promise::allMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) |
{ |
v8::Isolate* isolate = info.GetIsolate(); |
- v8::Local<v8::Object> promise = V8PromiseCustom::createPromise(info.Holder(), isolate); |
+ V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromise(info.Holder(), isolate)); |
v8::Local<v8::Array> results = v8::Array::New(info.GetIsolate()); |
if (!info.Length() || !info[0]->IsArray()) { |
@@ -617,14 +622,14 @@ void V8Promise::allMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) |
} |
v8::Local<v8::ObjectTemplate> objectTemplate = primitiveWrapperObjectTemplate(isolate); |
- v8::Local<v8::Object> countdownWrapper = objectTemplate->NewInstance(); |
+ V8TRYCATCH_VOID(v8::Local<v8::Object>, countdownWrapper, objectTemplate->NewInstance()); |
countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiveIndex, v8::Integer::New(isolate, iterable->Length())); |
- v8::Local<v8::Function> onRejected = createClosure(promiseRejectCallback, promise, isolate); |
+ V8TRYCATCH_VOID(v8::Local<v8::Function>, onRejected, createClosure(promiseRejectCallback, promise, isolate)); |
for (unsigned i = 0, length = iterable->Length(); i < length; ++i) { |
// Array-holes should not be skipped by for-of iteration semantics. |
- v8::Local<v8::Object> environment = promiseAllEnvironment(promise, countdownWrapper, i, results, isolate); |
- v8::Local<v8::Function> onFulfilled = createClosure(promiseAllFulfillCallback, environment, isolate); |
+ V8TRYCATCH_VOID(v8::Local<v8::Object>, environment, promiseAllEnvironment(promise, countdownWrapper, i, results, isolate)); |
+ V8TRYCATCH_VOID(v8::Local<v8::Function>, onFulfilled, createClosure(promiseAllFulfillCallback, environment, isolate)); |
V8TRYCATCH_VOID(v8::Local<v8::Value>, nextValue, iterable->Get(i)); |
v8::Local<v8::Object> nextPromise = V8PromiseCustom::toPromise(nextValue, isolate); |
V8PromiseCustom::then(nextPromise, onFulfilled, onRejected, isolate); |
@@ -638,6 +643,7 @@ v8::Local<v8::Object> V8PromiseCustom::createPromise(v8::Handle<v8::Object> crea |
{ |
v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isolate); |
v8::Local<v8::Object> internal = internalTemplate->NewInstance(); |
+ RETURN_IF_EMPTY(internal, v8::Local<v8::Object>()); |
v8::Local<v8::Object> promise = V8DOMWrapper::createWrapper(creationContext, &V8Promise::wrapperTypeInfo, 0, isolate); |
clearDerived(internal, isolate); |
@@ -799,10 +805,12 @@ v8::Local<v8::Object> V8PromiseCustom::coerceThenable(v8::Handle<v8::Object> the |
ASSERT(!thenable.IsEmpty()); |
ASSERT(!then.IsEmpty()); |
v8::Local<v8::Object> promise = createPromise(v8::Handle<v8::Object>(), isolate); |
- v8::Handle<v8::Value> argv[] = { |
- createClosure(promiseResolveCallback, promise, isolate), |
- createClosure(promiseRejectCallback, promise, isolate) |
- }; |
+ v8::Handle<v8::Value> onFulfilled = createClosure(promiseResolveCallback, promise, isolate); |
+ RETURN_IF_EMPTY(onFulfilled, v8::Local<v8::Object>()); |
+ v8::Handle<v8::Value> onRejected = createClosure(promiseRejectCallback, promise, isolate); |
+ RETURN_IF_EMPTY(onRejected, v8::Local<v8::Object>()); |
+ v8::Handle<v8::Value> argv[] = { onFulfilled, onRejected }; |
+ |
v8::TryCatch trycatch; |
if (V8ScriptRunner::callFunction(then, currentExecutionContext(isolate), thenable, WTF_ARRAY_LENGTH(argv), argv, isolate).IsEmpty()) { |
reject(promise, trycatch.Exception(), isolate); |