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

Unified Diff: src/api.cc

Issue 2589113002: [api] add API for Promise status and result. (Closed)
Patch Set: Created 4 years 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
« include/v8.h ('K') | « include/v8.h ('k') | src/counters.h » ('j') | 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 04e7c894d4584e3d4cce1ad50b73b22885acfff4..20108439e985d26e6f2c9d1484f49916198a4fd6 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -7289,6 +7289,32 @@ bool Promise::HasHandler() {
return false;
}
+MaybeLocal<Value> Promise::Result() {
+ i::Handle<i::JSReceiver> promise = Utils::OpenHandle(this);
+ i::Isolate* isolate = promise->GetIsolate();
+ LOG_API(isolate, Promise, Result);
+ ENTER_V8(isolate);
jochen (gone - plz use gerrit) 2016/12/20 07:49:52 this method (and Status) don't execute script, so
Yang 2016/12/20 11:38:27 Done.
+ Utils::ApiCheck(promise->IsJSPromise(), "v8_Promise_Result", "Not a Promise");
jochen (gone - plz use gerrit) 2016/12/20 07:49:52 that check should never trigger, so I'd suggest to
Yang 2016/12/20 11:38:27 Done.
+ i::Handle<i::JSPromise> js_promise = i::Handle<i::JSPromise>::cast(promise);
+ if (js_promise->status() != i::kPromisePending) {
+ i::Handle<i::Object> result(js_promise->result(), isolate);
+ return Utils::ToLocal(result);
+ }
+ return MaybeLocal<Value>();
jochen (gone - plz use gerrit) 2016/12/20 07:49:52 APIs should return empty handles iff an exception
Yang 2016/12/20 11:38:27 Done. Now requiring status not to be pending guard
+}
+
+Promise::PromiseStatus Promise::Status() {
+ i::Handle<i::JSReceiver> promise = Utils::OpenHandle(this);
+ i::Isolate* isolate = promise->GetIsolate();
+ LOG_API(isolate, Promise, Status);
+ ENTER_V8(isolate);
+ Utils::ApiCheck(promise->IsJSPromise(), "v8_Promise_Status", "Not a Promise");
+ i::Handle<i::JSPromise> js_promise = i::Handle<i::JSPromise>::cast(promise);
+ STATIC_ASSERT(static_cast<int>(i::kPromisePending) == kPending);
jochen (gone - plz use gerrit) 2016/12/20 07:49:52 an alternative approach was to use the external en
Yang 2016/12/20 11:38:27 Done.
+ STATIC_ASSERT(static_cast<int>(i::kPromiseFulfilled) == kFulfilled);
+ STATIC_ASSERT(static_cast<int>(i::kPromiseRejected) == kRejected);
+ return static_cast<PromiseStatus>(js_promise->status());
+}
Local<Object> Proxy::GetTarget() {
i::Handle<i::JSProxy> self = Utils::OpenHandle(this);
« include/v8.h ('K') | « include/v8.h ('k') | src/counters.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698