diff options
author | Michaël Zasso <targos@protonmail.com> | 2017-05-02 10:50:00 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2017-05-06 20:02:35 +0200 |
commit | 60d1aac8d225e844e68ae48e8f3d58802e635fbe (patch) | |
tree | 922f347dd054db18d88666fad7181e5a777f4022 /deps/v8/src/runtime/runtime-promise.cc | |
parent | 73d9c0f903ae371cd5011af64c3a6f69a1bda978 (diff) | |
download | android-node-v8-60d1aac8d225e844e68ae48e8f3d58802e635fbe.tar.gz android-node-v8-60d1aac8d225e844e68ae48e8f3d58802e635fbe.tar.bz2 android-node-v8-60d1aac8d225e844e68ae48e8f3d58802e635fbe.zip |
deps: update V8 to 5.8.283.38
PR-URL: https://github.com/nodejs/node/pull/12784
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
Diffstat (limited to 'deps/v8/src/runtime/runtime-promise.cc')
-rw-r--r-- | deps/v8/src/runtime/runtime-promise.cc | 110 |
1 files changed, 19 insertions, 91 deletions
diff --git a/deps/v8/src/runtime/runtime-promise.cc b/deps/v8/src/runtime/runtime-promise.cc index ec340e5b0a..7f8419940a 100644 --- a/deps/v8/src/runtime/runtime-promise.cc +++ b/deps/v8/src/runtime/runtime-promise.cc @@ -3,8 +3,11 @@ // found in the LICENSE file. #include "src/runtime/runtime-utils.h" +#include "src/arguments.h" +#include "src/counters.h" #include "src/debug/debug.h" #include "src/elements.h" +#include "src/objects-inl.h" namespace v8 { namespace internal { @@ -44,7 +47,7 @@ RUNTIME_FUNCTION(Runtime_PromiseRejectEventFromStack) { rejected_promise = isolate->GetPromiseOnStackOnThrow(); isolate->debug()->OnAsyncTaskEvent( debug::kDebugEnqueuePromiseReject, - isolate->debug()->NextAsyncTaskId(promise)); + isolate->debug()->NextAsyncTaskId(promise), 0); } PromiseRejectEvent(isolate, promise, rejected_promise, value, true); return isolate->heap()->undefined_value(); @@ -71,83 +74,11 @@ RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) { return isolate->heap()->undefined_value(); } -namespace { - -// In an async function, reuse the existing stack related to the outer -// Promise. Otherwise, e.g. in a direct call to then, save a new stack. -// Promises with multiple reactions with one or more of them being async -// functions will not get a good stack trace, as async functions require -// different stacks from direct Promise use, but we save and restore a -// stack once for all reactions. -// -// If this isn't a case of async function, we return false, otherwise -// we set the correct id and return true. -// -// TODO(littledan): Improve this case. -bool GetDebugIdForAsyncFunction(Isolate* isolate, - Handle<PromiseReactionJobInfo> info, - int* debug_id) { - // deferred_promise can be Undefined, FixedArray or userland promise object. - if (!info->deferred_promise()->IsJSPromise()) { - return false; - } - - Handle<JSPromise> deferred_promise(JSPromise::cast(info->deferred_promise()), - isolate); - Handle<Symbol> handled_by_symbol = - isolate->factory()->promise_handled_by_symbol(); - Handle<Object> handled_by_promise = - JSObject::GetDataProperty(deferred_promise, handled_by_symbol); - - if (!handled_by_promise->IsJSPromise()) { - return false; - } - - Handle<JSPromise> handled_by_promise_js = - Handle<JSPromise>::cast(handled_by_promise); - Handle<Symbol> async_stack_id_symbol = - isolate->factory()->promise_async_stack_id_symbol(); - Handle<Object> id = - JSObject::GetDataProperty(handled_by_promise_js, async_stack_id_symbol); - - // id can be Undefined or Smi. - if (!id->IsSmi()) { - return false; - } - - *debug_id = Handle<Smi>::cast(id)->value(); - return true; -} - -void SetDebugInfo(Isolate* isolate, Handle<JSPromise> promise, - Handle<PromiseReactionJobInfo> info, int status) { - int id = kDebugPromiseNoID; - if (!GetDebugIdForAsyncFunction(isolate, info, &id)) { - id = isolate->debug()->NextAsyncTaskId(promise); - DCHECK(status != v8::Promise::kPending); - } - info->set_debug_id(id); -} - -void EnqueuePromiseReactionJob(Isolate* isolate, Handle<JSPromise> promise, - Handle<PromiseReactionJobInfo> info, - int status) { - if (isolate->debug()->is_active()) { - SetDebugInfo(isolate, promise, info, status); - } - - isolate->EnqueueMicrotask(info); -} - -} // namespace - RUNTIME_FUNCTION(Runtime_EnqueuePromiseReactionJob) { HandleScope scope(isolate); - DCHECK_EQ(3, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); - CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 1); - CONVERT_SMI_ARG_CHECKED(status, 2); - EnqueuePromiseReactionJob(isolate, promise, info, status); + DCHECK_EQ(1, args.length()); + CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 0); + isolate->EnqueueMicrotask(info); return isolate->heap()->undefined_value(); } @@ -198,15 +129,6 @@ RUNTIME_FUNCTION(Runtime_PromiseMarkAsHandled) { return isolate->heap()->undefined_value(); } -RUNTIME_FUNCTION(Runtime_PromiseMarkHandledHint) { - SealHandleScope shs(isolate); - DCHECK_EQ(1, args.length()); - CONVERT_ARG_CHECKED(JSPromise, promise, 0); - - promise->set_handled_hint(true); - return isolate->heap()->undefined_value(); -} - RUNTIME_FUNCTION(Runtime_PromiseHookInit) { HandleScope scope(isolate); DCHECK_EQ(2, args.length()); @@ -228,18 +150,24 @@ RUNTIME_FUNCTION(Runtime_PromiseHookResolve) { RUNTIME_FUNCTION(Runtime_PromiseHookBefore) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); - isolate->RunPromiseHook(PromiseHookType::kBefore, promise, - isolate->factory()->undefined_value()); + CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0); + if (promise->IsJSPromise()) { + isolate->RunPromiseHook(PromiseHookType::kBefore, + Handle<JSPromise>::cast(promise), + isolate->factory()->undefined_value()); + } return isolate->heap()->undefined_value(); } RUNTIME_FUNCTION(Runtime_PromiseHookAfter) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); - isolate->RunPromiseHook(PromiseHookType::kAfter, promise, - isolate->factory()->undefined_value()); + CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0); + if (promise->IsJSPromise()) { + isolate->RunPromiseHook(PromiseHookType::kAfter, + Handle<JSPromise>::cast(promise), + isolate->factory()->undefined_value()); + } return isolate->heap()->undefined_value(); } |