Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(876)

Unified Diff: src/api.cc

Issue 993883002: convert Function and Promise to maybe (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698