2 * Copyright (C) 2013 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
27 #include "JSPromise.h"
32 #include "JSCJSValueInlines.h"
33 #include "JSCellInlines.h"
34 #include "JSPromiseConstructor.h"
35 #include "Microtask.h"
36 #include "SlotVisitorInlines.h"
37 #include "StructureInlines.h"
41 const ClassInfo
JSPromise::s_info
= { "Promise", &Base::s_info
, 0, CREATE_METHOD_TABLE(JSPromise
) };
43 JSPromise
* JSPromise::create(VM
& vm
, JSGlobalObject
* globalObject
)
45 JSPromise
* promise
= new (NotNull
, allocateCell
<JSPromise
>(vm
.heap
)) JSPromise(vm
, globalObject
->promiseStructure());
46 promise
->finishCreation(vm
);
50 Structure
* JSPromise::createStructure(VM
& vm
, JSGlobalObject
* globalObject
, JSValue prototype
)
52 return Structure::create(vm
, globalObject
, prototype
, TypeInfo(ObjectType
, StructureFlags
), info());
55 JSPromise::JSPromise(VM
& vm
, Structure
* structure
)
56 : JSNonFinalObject(vm
, structure
)
60 void JSPromise::finishCreation(VM
& vm
)
62 Base::finishCreation(vm
);
63 putDirect(vm
, vm
.propertyNames
->promiseStatePrivateName
, jsNumber(static_cast<unsigned>(Status::Pending
)));
64 putDirect(vm
, vm
.propertyNames
->promiseFulfillReactionsPrivateName
, jsUndefined());
65 putDirect(vm
, vm
.propertyNames
->promiseRejectReactionsPrivateName
, jsUndefined());
66 putDirect(vm
, vm
.propertyNames
->promiseResultPrivateName
, jsUndefined());
69 auto JSPromise::status(VM
& vm
) const -> Status
71 JSValue value
= getDirect(vm
, vm
.propertyNames
->promiseStatePrivateName
);
72 ASSERT(value
.isUInt32());
73 return static_cast<Status
>(value
.asUInt32());
76 JSValue
JSPromise::result(VM
& vm
) const
78 return getDirect(vm
, vm
.propertyNames
->promiseResultPrivateName
);
83 #endif // ENABLE(PROMISES)