JSPromiseDeferred.cpp [plain text]
#include "config.h"
#include "JSPromiseDeferred.h"
#if ENABLE(PROMISES)
#include "BuiltinNames.h"
#include "Error.h"
#include "Exception.h"
#include "JSCJSValueInlines.h"
#include "JSCellInlines.h"
#include "JSPromise.h"
#include "JSPromiseConstructor.h"
#include "SlotVisitorInlines.h"
#include "StructureInlines.h"
namespace JSC {
const ClassInfo JSPromiseDeferred::s_info = { "JSPromiseDeferred", 0, 0, CREATE_METHOD_TABLE(JSPromiseDeferred) };
JSPromiseDeferred* JSPromiseDeferred::create(ExecState* exec, JSGlobalObject* globalObject)
{
VM& vm = exec->vm();
JSFunction* newPromiseDeferredFunction = globalObject->newPromiseDeferredFunction();
CallData callData;
CallType callType = JSC::getCallData(newPromiseDeferredFunction, callData);
ASSERT(callType != CallTypeNone);
MarkedArgumentBuffer arguments;
JSValue deferred = call(exec, newPromiseDeferredFunction, callType, callData, jsUndefined(), arguments);
JSValue promise = deferred.get(exec, vm.propertyNames->promisePrivateName);
ASSERT(promise.inherits(JSPromise::info()));
JSValue resolve = deferred.get(exec, vm.propertyNames->builtinNames().resolvePrivateName());
JSValue reject = deferred.get(exec, vm.propertyNames->builtinNames().rejectPrivateName());
return JSPromiseDeferred::create(vm, jsCast<JSPromise*>(promise), resolve, reject);
}
JSPromiseDeferred* JSPromiseDeferred::create(VM& vm, JSObject* promise, JSValue resolve, JSValue reject)
{
JSPromiseDeferred* deferred = new (NotNull, allocateCell<JSPromiseDeferred>(vm.heap)) JSPromiseDeferred(vm);
deferred->finishCreation(vm, promise, resolve, reject);
return deferred;
}
JSPromiseDeferred::JSPromiseDeferred(VM& vm)
: Base(vm, vm.promiseDeferredStructure.get())
{
}
void JSPromiseDeferred::finishCreation(VM& vm, JSObject* promise, JSValue resolve, JSValue reject)
{
Base::finishCreation(vm);
m_promise.set(vm, this, promise);
m_resolve.set(vm, this, resolve);
m_reject.set(vm, this, reject);
}
void JSPromiseDeferred::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSPromiseDeferred* thisObject = jsCast<JSPromiseDeferred*>(cell);
ASSERT_GC_OBJECT_INHERITS(thisObject, info());
Base::visitChildren(thisObject, visitor);
visitor.append(&thisObject->m_promise);
visitor.append(&thisObject->m_resolve);
visitor.append(&thisObject->m_reject);
}
}
#endif // ENABLE(PROMISES)