summaryrefslogtreecommitdiff
path: root/deps/v8/src/runtime/runtime-promise.cc
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2017-05-02 10:50:00 +0200
committerMichaël Zasso <targos@protonmail.com>2017-05-06 20:02:35 +0200
commit60d1aac8d225e844e68ae48e8f3d58802e635fbe (patch)
tree922f347dd054db18d88666fad7181e5a777f4022 /deps/v8/src/runtime/runtime-promise.cc
parent73d9c0f903ae371cd5011af64c3a6f69a1bda978 (diff)
downloadandroid-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.cc110
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();
}