| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index f0c105cffc9817c8e302b9b06f92b771eec3246d..c8e70931c73171d3f53cfc54a40619ee9c15277a 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -72,30 +72,19 @@ namespace v8 {
|
| bool has_pending_exception = false
|
|
|
|
|
| -#define EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, do_callback) \
|
| - do { \
|
| - i::HandleScopeImplementer* handle_scope_implementer = \
|
| - (isolate)->handle_scope_implementer(); \
|
| - handle_scope_implementer->DecrementCallDepth(); \
|
| - if (has_pending_exception) { \
|
| - bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \
|
| - (isolate)->OptionalRescheduleException(call_depth_is_zero); \
|
| - do_callback \
|
| - return value; \
|
| - } \
|
| - do_callback \
|
| +#define EXCEPTION_BAILOUT_CHECK(isolate, value) \
|
| + do { \
|
| + i::HandleScopeImplementer* handle_scope_implementer = \
|
| + (isolate)->handle_scope_implementer(); \
|
| + handle_scope_implementer->DecrementCallDepth(); \
|
| + if (has_pending_exception) { \
|
| + bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \
|
| + (isolate)->OptionalRescheduleException(call_depth_is_zero); \
|
| + return value; \
|
| + } \
|
| } while (false)
|
|
|
|
|
| -#define EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, value) \
|
| - EXCEPTION_BAILOUT_CHECK_GENERIC( \
|
| - isolate, value, isolate->FireCallCompletedCallback();)
|
| -
|
| -
|
| -#define EXCEPTION_BAILOUT_CHECK(isolate, value) \
|
| - EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, ;)
|
| -
|
| -
|
| #define PREPARE_FOR_EXECUTION_GENERIC(isolate, context, function_name, \
|
| bailout_value, HandleScopeClass, \
|
| do_callback) \
|
| @@ -4389,52 +4378,56 @@ Local<v8::Object> Function::NewInstance() const {
|
| }
|
|
|
|
|
| -Local<v8::Object> Function::NewInstance(int argc,
|
| - v8::Handle<v8::Value> argv[]) const {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| - ON_BAILOUT(isolate, "v8::Function::NewInstance()",
|
| - return Local<v8::Object>());
|
| - LOG_API(isolate, "Function::NewInstance");
|
| - ENTER_V8(isolate);
|
| +MaybeLocal<Object> Function::NewInstance(Local<Context> context, int argc,
|
| + v8::Handle<v8::Value> argv[]) const {
|
| + PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::NewInstance()",
|
| + Object);
|
| i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
|
| - EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate));
|
| - i::Handle<i::JSFunction> function = Utils::OpenHandle(this);
|
| + auto self = Utils::OpenHandle(this);
|
| STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
|
| i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
|
| - EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> returned;
|
| - has_pending_exception = !i::Execution::New(
|
| - function, argc, args).ToHandle(&returned);
|
| - EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>());
|
| - return scope.Escape(Utils::ToLocal(i::Handle<i::JSObject>::cast(returned)));
|
| + Local<Object> result;
|
| + has_pending_exception =
|
| + !ToLocal<Object>(i::Execution::New(self, argc, args), &result);
|
| + RETURN_ON_FAILED_EXECUTION(Object);
|
| + RETURN_ESCAPED(result);
|
| }
|
|
|
|
|
| -Local<v8::Value> Function::Call(v8::Handle<v8::Value> recv, int argc,
|
| - v8::Handle<v8::Value> argv[]) {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| - ON_BAILOUT(isolate, "v8::Function::Call()", return Local<v8::Value>());
|
| - LOG_API(isolate, "Function::Call");
|
| - ENTER_V8(isolate);
|
| +Local<v8::Object> Function::NewInstance(int argc,
|
| + v8::Handle<v8::Value> argv[]) const {
|
| + auto context = ContextFromHeapObject(Utils::OpenHandle(this));
|
| + RETURN_TO_LOCAL_UNCHECKED(NewInstance(context, argc, argv), Object);
|
| +}
|
| +
|
| +
|
| +MaybeLocal<v8::Value> Function::Call(Local<Context> context,
|
| + v8::Handle<v8::Value> recv, int argc,
|
| + v8::Handle<v8::Value> argv[]) {
|
| + PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::Call()", Value);
|
| i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
|
| - i::HandleScope scope(isolate);
|
| - i::Handle<i::JSFunction> fun = Utils::OpenHandle(this);
|
| + auto self = Utils::OpenHandle(this);
|
| i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv);
|
| STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
|
| i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
|
| - EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> returned;
|
| - has_pending_exception = !i::Execution::Call(
|
| - isolate, fun, recv_obj, argc, args, true).ToHandle(&returned);
|
| - EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Object>());
|
| - return Utils::ToLocal(scope.CloseAndEscape(returned));
|
| + Local<Value> result;
|
| + has_pending_exception =
|
| + !ToLocal<Value>(
|
| + i::Execution::Call(isolate, self, recv_obj, argc, args, true),
|
| + &result);
|
| + RETURN_ON_FAILED_EXECUTION(Value);
|
| + RETURN_ESCAPED(result);
|
| +}
|
| +
|
| +
|
| +Local<v8::Value> Function::Call(v8::Handle<v8::Value> recv, int argc,
|
| + v8::Handle<v8::Value> argv[]) {
|
| + auto context = ContextFromHeapObject(Utils::OpenHandle(this));
|
| + RETURN_TO_LOCAL_UNCHECKED(Call(context, recv, argc, argv), Value);
|
| }
|
|
|
|
|
| void Function::SetName(v8::Handle<v8::String> name) {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| - ENTER_V8(isolate);
|
| - USE(isolate);
|
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
|
| func->shared()->set_name(*Utils::OpenHandle(*name));
|
| }
|
| @@ -4456,22 +4449,16 @@ Handle<Value> Function::GetInferredName() const {
|
|
|
| Handle<Value> Function::GetDisplayName() const {
|
| i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| - ON_BAILOUT(isolate, "v8::Function::GetDisplayName()",
|
| - return ToApiHandle<Primitive>(
|
| - isolate->factory()->undefined_value()));
|
| ENTER_V8(isolate);
|
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
|
| i::Handle<i::String> property_name =
|
| - isolate->factory()->InternalizeOneByteString(
|
| - STATIC_CHAR_VECTOR("displayName"));
|
| -
|
| + isolate->factory()->NewStringFromStaticChars("displayName");
|
| i::Handle<i::Object> value =
|
| i::JSObject::GetDataProperty(func, property_name);
|
| if (value->IsString()) {
|
| i::Handle<i::String> name = i::Handle<i::String>::cast(value);
|
| if (name->length() > 0) return Utils::ToLocal(name);
|
| }
|
| -
|
| return ToApiHandle<Primitive>(isolate->factory()->undefined_value());
|
| }
|
|
|
| @@ -6147,11 +6134,8 @@ bool Value::IsPromise() const {
|
| }
|
|
|
|
|
| -Local<Promise::Resolver> Promise::Resolver::New(Isolate* v8_isolate) {
|
| - i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
|
| - LOG_API(isolate, "Promise::Resolver::New");
|
| - ENTER_V8(isolate);
|
| - EXCEPTION_PREAMBLE(isolate);
|
| +MaybeLocal<Promise::Resolver> Promise::Resolver::New(Local<Context> context) {
|
| + PREPARE_FOR_EXECUTION(context, "Promise::Resolver::New", Resolver);
|
| i::Handle<i::Object> result;
|
| has_pending_exception = !i::Execution::Call(
|
| isolate,
|
| @@ -6159,8 +6143,14 @@ Local<Promise::Resolver> Promise::Resolver::New(Isolate* v8_isolate) {
|
| isolate->factory()->undefined_value(),
|
| 0, NULL,
|
| false).ToHandle(&result);
|
| - EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise::Resolver>());
|
| - return Local<Promise::Resolver>::Cast(Utils::ToLocal(result));
|
| + RETURN_ON_FAILED_EXECUTION(Promise::Resolver);
|
| + RETURN_ESCAPED(Local<Promise::Resolver>::Cast(Utils::ToLocal(result)));
|
| +}
|
| +
|
| +
|
| +Local<Promise::Resolver> Promise::Resolver::New(Isolate* isolate) {
|
| + RETURN_TO_LOCAL_UNCHECKED(New(isolate->GetCurrentContext()),
|
| + Promise::Resolver);
|
| }
|
|
|
|
|
| @@ -6170,94 +6160,107 @@ Local<Promise> Promise::Resolver::GetPromise() {
|
| }
|
|
|
|
|
| -void Promise::Resolver::Resolve(Handle<Value> value) {
|
| - i::Handle<i::JSObject> promise = Utils::OpenHandle(this);
|
| - i::Isolate* isolate = promise->GetIsolate();
|
| - LOG_API(isolate, "Promise::Resolver::Resolve");
|
| - ENTER_V8(isolate);
|
| - EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) };
|
| +Maybe<bool> Promise::Resolver::Resolve(Local<Context> context,
|
| + Handle<Value> value) {
|
| + PREPARE_FOR_EXECUTION_PRIMITIVE(context, "Promise::Resolver::Resolve", bool);
|
| + auto self = Utils::OpenHandle(this);
|
| + i::Handle<i::Object> argv[] = {self, Utils::OpenHandle(*value)};
|
| has_pending_exception = i::Execution::Call(
|
| isolate,
|
| isolate->promise_resolve(),
|
| isolate->factory()->undefined_value(),
|
| arraysize(argv), argv,
|
| false).is_null();
|
| - EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;);
|
| + RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
|
| + return Just(true);
|
| }
|
|
|
|
|
| -void Promise::Resolver::Reject(Handle<Value> value) {
|
| - i::Handle<i::JSObject> promise = Utils::OpenHandle(this);
|
| - i::Isolate* isolate = promise->GetIsolate();
|
| - LOG_API(isolate, "Promise::Resolver::Reject");
|
| - ENTER_V8(isolate);
|
| - EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) };
|
| +void Promise::Resolver::Resolve(Handle<Value> value) {
|
| + auto context = ContextFromHeapObject(Utils::OpenHandle(this));
|
| + Resolve(context, value);
|
| +}
|
| +
|
| +
|
| +Maybe<bool> Promise::Resolver::Reject(Local<Context> context,
|
| + Handle<Value> value) {
|
| + PREPARE_FOR_EXECUTION_PRIMITIVE(context, "Promise::Resolver::Resolve", bool);
|
| + auto self = Utils::OpenHandle(this);
|
| + i::Handle<i::Object> argv[] = {self, Utils::OpenHandle(*value)};
|
| has_pending_exception = i::Execution::Call(
|
| isolate,
|
| isolate->promise_reject(),
|
| isolate->factory()->undefined_value(),
|
| arraysize(argv), argv,
|
| false).is_null();
|
| - EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;);
|
| + RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
|
| + return Just(true);
|
| +}
|
| +
|
| +
|
| +void Promise::Resolver::Reject(Handle<Value> value) {
|
| + auto context = ContextFromHeapObject(Utils::OpenHandle(this));
|
| + Reject(context, value);
|
| +}
|
| +
|
| +
|
| +MaybeLocal<Promise> Promise::Chain(Local<Context> context,
|
| + Handle<Function> handler) {
|
| + PREPARE_FOR_EXECUTION(context, "Promise::Chain", Promise);
|
| + auto self = Utils::OpenHandle(this);
|
| + i::Handle<i::Object> argv[] = {Utils::OpenHandle(*handler)};
|
| + i::Handle<i::Object> result;
|
| + has_pending_exception =
|
| + !i::Execution::Call(isolate, isolate->promise_chain(), self,
|
| + arraysize(argv), argv, false).ToHandle(&result);
|
| + RETURN_ON_FAILED_EXECUTION(Promise);
|
| + RETURN_ESCAPED(Local<Promise>::Cast(Utils::ToLocal(result)));
|
| }
|
|
|
|
|
| Local<Promise> Promise::Chain(Handle<Function> handler) {
|
| - i::Handle<i::JSObject> promise = Utils::OpenHandle(this);
|
| - i::Isolate* isolate = promise->GetIsolate();
|
| - LOG_API(isolate, "Promise::Chain");
|
| - ENTER_V8(isolate);
|
| - EXCEPTION_PREAMBLE(isolate);
|
| + auto context = ContextFromHeapObject(Utils::OpenHandle(this));
|
| + RETURN_TO_LOCAL_UNCHECKED(Chain(context, handler), Promise);
|
| +}
|
| +
|
| +
|
| +MaybeLocal<Promise> Promise::Catch(Local<Context> context,
|
| + Handle<Function> handler) {
|
| + PREPARE_FOR_EXECUTION(context, "Promise::Catch", Promise);
|
| + auto self = Utils::OpenHandle(this);
|
| i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) };
|
| i::Handle<i::Object> result;
|
| - has_pending_exception = !i::Execution::Call(
|
| - isolate,
|
| - isolate->promise_chain(),
|
| - promise,
|
| - arraysize(argv), argv,
|
| - false).ToHandle(&result);
|
| - EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>());
|
| - return Local<Promise>::Cast(Utils::ToLocal(result));
|
| + has_pending_exception =
|
| + !i::Execution::Call(isolate, isolate->promise_catch(), self,
|
| + arraysize(argv), argv, false).ToHandle(&result);
|
| + RETURN_ON_FAILED_EXECUTION(Promise);
|
| + RETURN_ESCAPED(Local<Promise>::Cast(Utils::ToLocal(result)));
|
| }
|
|
|
|
|
| Local<Promise> Promise::Catch(Handle<Function> handler) {
|
| - i::Handle<i::JSObject> promise = Utils::OpenHandle(this);
|
| - i::Isolate* isolate = promise->GetIsolate();
|
| - LOG_API(isolate, "Promise::Catch");
|
| - ENTER_V8(isolate);
|
| - EXCEPTION_PREAMBLE(isolate);
|
| + auto context = ContextFromHeapObject(Utils::OpenHandle(this));
|
| + RETURN_TO_LOCAL_UNCHECKED(Catch(context, handler), Promise);
|
| +}
|
| +
|
| +
|
| +MaybeLocal<Promise> Promise::Then(Local<Context> context,
|
| + Handle<Function> handler) {
|
| + PREPARE_FOR_EXECUTION(context, "Promise::Then", Promise);
|
| + auto self = Utils::OpenHandle(this);
|
| i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) };
|
| i::Handle<i::Object> result;
|
| - has_pending_exception = !i::Execution::Call(
|
| - isolate,
|
| - isolate->promise_catch(),
|
| - promise,
|
| - arraysize(argv), argv,
|
| - false).ToHandle(&result);
|
| - EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>());
|
| - return Local<Promise>::Cast(Utils::ToLocal(result));
|
| + has_pending_exception =
|
| + !i::Execution::Call(isolate, isolate->promise_then(), self,
|
| + arraysize(argv), argv, false).ToHandle(&result);
|
| + RETURN_ON_FAILED_EXECUTION(Promise);
|
| + RETURN_ESCAPED(Local<Promise>::Cast(Utils::ToLocal(result)));
|
| }
|
|
|
|
|
| Local<Promise> Promise::Then(Handle<Function> handler) {
|
| - i::Handle<i::JSObject> promise = Utils::OpenHandle(this);
|
| - i::Isolate* isolate = promise->GetIsolate();
|
| - LOG_API(isolate, "Promise::Then");
|
| - ENTER_V8(isolate);
|
| - EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) };
|
| - i::Handle<i::Object> result;
|
| - has_pending_exception = !i::Execution::Call(
|
| - isolate,
|
| - isolate->promise_then(),
|
| - promise,
|
| - arraysize(argv), argv,
|
| - false).ToHandle(&result);
|
| - EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>());
|
| - return Local<Promise>::Cast(Utils::ToLocal(result));
|
| + auto context = ContextFromHeapObject(Utils::OpenHandle(this));
|
| + RETURN_TO_LOCAL_UNCHECKED(Then(context, handler), Promise);
|
| }
|
|
|
|
|
|
|