| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/promise-utils.h" |
| |
| #include "src/factory.h" |
| #include "src/isolate.h" |
| #include "src/objects-inl.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| JSPromise* PromiseUtils::GetPromise(Handle<Context> context) { |
| return JSPromise::cast(context->get(kPromiseSlot)); |
| } |
| |
| Object* PromiseUtils::GetDebugEvent(Handle<Context> context) { |
| return context->get(kDebugEventSlot); |
| } |
| |
| bool PromiseUtils::HasAlreadyVisited(Handle<Context> context) { |
| return Smi::cast(context->get(kAlreadyVisitedSlot))->value() != 0; |
| } |
| |
| void PromiseUtils::SetAlreadyVisited(Handle<Context> context) { |
| context->set(kAlreadyVisitedSlot, Smi::FromInt(1)); |
| } |
| |
| void PromiseUtils::CreateResolvingFunctions(Isolate* isolate, |
| Handle<JSObject> promise, |
| Handle<Object> debug_event, |
| Handle<JSFunction>* resolve, |
| Handle<JSFunction>* reject) { |
| DCHECK(debug_event->IsTrue(isolate) || debug_event->IsFalse(isolate)); |
| Handle<Context> context = |
| isolate->factory()->NewPromiseResolvingFunctionContext( |
| kPromiseContextLength); |
| context->set_native_context(*isolate->native_context()); |
| // We set the closure to be an empty function, same as native context. |
| context->set_closure(isolate->native_context()->closure()); |
| context->set(kAlreadyVisitedSlot, Smi::kZero); |
| context->set(kPromiseSlot, *promise); |
| context->set(kDebugEventSlot, *debug_event); |
| |
| Handle<SharedFunctionInfo> resolve_shared_fun( |
| isolate->native_context()->promise_resolve_shared_fun(), isolate); |
| Handle<JSFunction> resolve_fun = |
| isolate->factory()->NewFunctionFromSharedFunctionInfo( |
| isolate->sloppy_function_without_prototype_map(), resolve_shared_fun, |
| isolate->native_context(), TENURED); |
| |
| Handle<SharedFunctionInfo> reject_shared_fun( |
| isolate->native_context()->promise_reject_shared_fun(), isolate); |
| Handle<JSFunction> reject_fun = |
| isolate->factory()->NewFunctionFromSharedFunctionInfo( |
| isolate->sloppy_function_without_prototype_map(), reject_shared_fun, |
| isolate->native_context(), TENURED); |
| |
| resolve_fun->set_context(*context); |
| reject_fun->set_context(*context); |
| |
| *resolve = resolve_fun; |
| *reject = reject_fun; |
| } |
| |
| } // namespace internal |
| } // namespace v8 |