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/promise-utils.h"
6
7#include "src/factory.h"
8#include "src/isolate.h"
9#include "src/objects-inl.h"
10
11namespace v8 {
12namespace internal {
13
14enum PromiseResolvingFunctionContextSlot {
15  kAlreadyVisitedSlot = Context::MIN_CONTEXT_SLOTS,
16  kPromiseSlot,
17  kDebugEventSlot,
18  kPromiseContextLength,
19};
20
21JSObject* PromiseUtils::GetPromise(Handle<Context> context) {
22  return JSObject::cast(context->get(kPromiseSlot));
23}
24
25Object* PromiseUtils::GetDebugEvent(Handle<Context> context) {
26  return context->get(kDebugEventSlot);
27}
28
29bool PromiseUtils::HasAlreadyVisited(Handle<Context> context) {
30  return Smi::cast(context->get(kAlreadyVisitedSlot))->value() != 0;
31}
32
33void PromiseUtils::SetAlreadyVisited(Handle<Context> context) {
34  context->set(kAlreadyVisitedSlot, Smi::FromInt(1));
35}
36
37void PromiseUtils::CreateResolvingFunctions(Isolate* isolate,
38                                            Handle<JSObject> promise,
39                                            Handle<Object> debug_event,
40                                            Handle<JSFunction>* resolve,
41                                            Handle<JSFunction>* reject) {
42  DCHECK(debug_event->IsTrue(isolate) || debug_event->IsFalse(isolate));
43  Handle<Context> context =
44      isolate->factory()->NewPromiseResolvingFunctionContext(
45          kPromiseContextLength);
46  context->set_native_context(*isolate->native_context());
47  // We set the closure to be an empty function, same as native context.
48  context->set_closure(isolate->native_context()->closure());
49  context->set(kAlreadyVisitedSlot, Smi::kZero);
50  context->set(kPromiseSlot, *promise);
51  context->set(kDebugEventSlot, *debug_event);
52
53  Handle<SharedFunctionInfo> resolve_shared_fun(
54      isolate->native_context()->promise_resolve_shared_fun(), isolate);
55  Handle<JSFunction> resolve_fun =
56      isolate->factory()->NewFunctionFromSharedFunctionInfo(
57          isolate->sloppy_function_without_prototype_map(), resolve_shared_fun,
58          isolate->native_context(), TENURED);
59
60  Handle<SharedFunctionInfo> reject_shared_fun(
61      isolate->native_context()->promise_reject_shared_fun(), isolate);
62  Handle<JSFunction> reject_fun =
63      isolate->factory()->NewFunctionFromSharedFunctionInfo(
64          isolate->sloppy_function_without_prototype_map(), reject_shared_fun,
65          isolate->native_context(), TENURED);
66
67  resolve_fun->set_context(*context);
68  reject_fun->set_context(*context);
69
70  *resolve = resolve_fun;
71  *reject = reject_fun;
72}
73
74}  // namespace internal
75}  // namespace v8
76