1// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/builtins/builtins-utils.h"
6#include "src/builtins/builtins.h"
7
8#include "src/promise-utils.h"
9
10namespace v8 {
11namespace internal {
12
13// ES#sec-promise-resolve-functions
14// Promise Resolve Functions
15BUILTIN(PromiseResolveClosure) {
16  HandleScope scope(isolate);
17
18  Handle<Context> context(isolate->context(), isolate);
19
20  if (PromiseUtils::HasAlreadyVisited(context)) {
21    return isolate->heap()->undefined_value();
22  }
23
24  PromiseUtils::SetAlreadyVisited(context);
25  Handle<JSObject> promise = handle(PromiseUtils::GetPromise(context), isolate);
26  Handle<Object> value = args.atOrUndefined(isolate, 1);
27
28  MaybeHandle<Object> maybe_result;
29  Handle<Object> argv[] = {promise, value};
30  RETURN_FAILURE_ON_EXCEPTION(
31      isolate, Execution::Call(isolate, isolate->promise_resolve(),
32                               isolate->factory()->undefined_value(),
33                               arraysize(argv), argv));
34  return isolate->heap()->undefined_value();
35}
36
37// ES#sec-promise-reject-functions
38// Promise Reject Functions
39BUILTIN(PromiseRejectClosure) {
40  HandleScope scope(isolate);
41
42  Handle<Context> context(isolate->context(), isolate);
43
44  if (PromiseUtils::HasAlreadyVisited(context)) {
45    return isolate->heap()->undefined_value();
46  }
47
48  PromiseUtils::SetAlreadyVisited(context);
49  Handle<Object> value = args.atOrUndefined(isolate, 1);
50  Handle<JSObject> promise = handle(PromiseUtils::GetPromise(context), isolate);
51  Handle<Object> debug_event =
52      handle(PromiseUtils::GetDebugEvent(context), isolate);
53  MaybeHandle<Object> maybe_result;
54  Handle<Object> argv[] = {promise, value, debug_event};
55  RETURN_FAILURE_ON_EXCEPTION(
56      isolate, Execution::Call(isolate, isolate->promise_internal_reject(),
57                               isolate->factory()->undefined_value(),
58                               arraysize(argv), argv));
59  return isolate->heap()->undefined_value();
60}
61
62// ES#sec-createresolvingfunctions
63// CreateResolvingFunctions ( promise )
64BUILTIN(CreateResolvingFunctions) {
65  HandleScope scope(isolate);
66  DCHECK_EQ(3, args.length());
67
68  Handle<JSObject> promise = args.at<JSObject>(1);
69  Handle<Object> debug_event = args.at<Object>(2);
70  Handle<JSFunction> resolve, reject;
71
72  PromiseUtils::CreateResolvingFunctions(isolate, promise, debug_event,
73                                         &resolve, &reject);
74
75  Handle<FixedArray> result = isolate->factory()->NewFixedArray(2);
76  result->set(0, *resolve);
77  result->set(1, *reject);
78
79  return *isolate->factory()->NewJSArrayWithElements(result, FAST_ELEMENTS, 2,
80                                                     NOT_TENURED);
81}
82
83}  // namespace internal
84}  // namespace v8
85