Home | History | Annotate | Download | only in src
      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 
     11 namespace v8 {
     12 namespace internal {
     13 
     14 enum PromiseResolvingFunctionContextSlot {
     15   kAlreadyVisitedSlot = Context::MIN_CONTEXT_SLOTS,
     16   kPromiseSlot,
     17   kDebugEventSlot,
     18   kPromiseContextLength,
     19 };
     20 
     21 JSObject* PromiseUtils::GetPromise(Handle<Context> context) {
     22   return JSObject::cast(context->get(kPromiseSlot));
     23 }
     24 
     25 Object* PromiseUtils::GetDebugEvent(Handle<Context> context) {
     26   return context->get(kDebugEventSlot);
     27 }
     28 
     29 bool PromiseUtils::HasAlreadyVisited(Handle<Context> context) {
     30   return Smi::cast(context->get(kAlreadyVisitedSlot))->value() != 0;
     31 }
     32 
     33 void PromiseUtils::SetAlreadyVisited(Handle<Context> context) {
     34   context->set(kAlreadyVisitedSlot, Smi::FromInt(1));
     35 }
     36 
     37 void 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