@@ -25,24 +25,84 @@ namespace v8 {
2525 using Resolver = Promise::Resolver;
2626 // CHAKRA-TODO: Unimplemented completely
2727 MaybeLocal<Resolver> Resolver::New (Local<Context> context) {
28- return Local<Resolver>();
28+ JsValueRef resolver;
29+ if (JsCreateObject (&resolver) != JsNoError) {
30+ return Local<Resolver>();
31+ }
32+
33+ JsValueRef promise, resolve, reject;
34+ if (JsCreatePromise (&promise, &resolve, &reject) != JsNoError) {
35+ return Local<Resolver>();
36+ }
37+
38+ if (jsrt::SetProperty (resolver, jsrt::CachedPropertyIdRef::promise, promise) != JsNoError) {
39+ return Local<Resolver>();
40+ }
41+
42+ if (jsrt::SetProperty (resolver, jsrt::CachedPropertyIdRef::resolve, resolve) != JsNoError) {
43+ return Local<Resolver>();
44+ }
45+
46+ if (jsrt::SetProperty (resolver, jsrt::CachedPropertyIdRef::reject, reject) != JsNoError) {
47+ return Local<Resolver>();
48+ }
49+
50+ JsValueRef state;
51+ jsrt::UintToValue (0 , &state);
52+ if (jsrt::SetProperty (promise, jsrt::CachedPropertyIdRef::value, state) != JsNoError) {
53+ return Local<Resolver>();
54+ }
55+
56+ return Local<Resolver>::New (static_cast <Resolver*>(resolver));
2957 }
3058
3159 Local<Resolver> Resolver::New (Isolate* isolate) {
3260 return New (isolate->GetCurrentContext ()).ToLocalChecked ();
3361 }
3462
3563 Local<Promise> Resolver::GetPromise () {
36- CHAKRA_ASSERT (false );
37- return Local<Promise>();
64+ JsValueRef promise;
65+ if (jsrt::GetProperty (this , jsrt::CachedPropertyIdRef::promise, &promise) != JsNoError) {
66+ return Local<Promise>();
67+ }
68+ return Local<Promise>::New (static_cast <Promise*>(promise));
3869 }
3970
4071 Resolver* Resolver::Cast (Value* obj) {
4172 return static_cast <Resolver*>(obj);
4273 }
4374
4475 Maybe<bool > Resolver::Resolve (Local<Context> context, Local<Value> value) {
45- return Just (false );
76+ JsValueRef resolve;
77+ if (jsrt::GetProperty (this , jsrt::CachedPropertyIdRef::resolve, &resolve) != JsNoError) {
78+ return Nothing<bool >();
79+ }
80+
81+ JsValueRef promise;
82+ if (jsrt::GetProperty (this , jsrt::CachedPropertyIdRef::promise, &promise) != JsNoError) {
83+ return Nothing<bool >();
84+ }
85+
86+ if (jsrt::SetProperty (promise, jsrt::CachedPropertyIdRef::value, *value) != JsNoError) {
87+ return Nothing<bool >();
88+ }
89+
90+ JsValueRef state;
91+ jsrt::UintToValue (1 , &state);
92+ if (jsrt::SetProperty (promise, jsrt::CachedPropertyIdRef::value, state) != JsNoError) {
93+ return Nothing<bool >();
94+ }
95+
96+ JsValueRef result;
97+ JsValueRef args[2 ];
98+ args[0 ] = this ; // ? What is the "this" of the resolver here?
99+ args[1 ] = reinterpret_cast <JsValueRef>(*value);
100+
101+ if (JsCallFunction (resolve, args, 2 , &result) != JsNoError) {
102+ return Nothing<bool >();
103+ }
104+
105+ return Just (true );
46106 }
47107
48108 void Resolver::Resolve (Local<Value> value) {
@@ -51,6 +111,35 @@ namespace v8 {
51111 }
52112
53113 Maybe<bool > Resolver::Reject (Local<Context> context, Local<Value> value) {
54- return Just (false );
114+ JsValueRef reject;
115+ if (jsrt::GetProperty (this , jsrt::CachedPropertyIdRef::reject, &reject) != JsNoError) {
116+ return Nothing<bool >();
117+ }
118+
119+ JsValueRef promise;
120+ if (jsrt::GetProperty (this , jsrt::CachedPropertyIdRef::promise, &promise) != JsNoError) {
121+ return Nothing<bool >();
122+ }
123+
124+ if (jsrt::SetProperty (promise, jsrt::CachedPropertyIdRef::value, *value) != JsNoError) {
125+ return Nothing<bool >();
126+ }
127+
128+ JsValueRef state;
129+ jsrt::UintToValue (2 , &state);
130+ if (jsrt::SetProperty (promise, jsrt::CachedPropertyIdRef::value, state) != JsNoError) {
131+ return Nothing<bool >();
132+ }
133+
134+ JsValueRef result;
135+ JsValueRef args[2 ];
136+ args[0 ] = this ; // ? What is the "this" of the resolver here?
137+ args[1 ] = reinterpret_cast <JsValueRef>(*value);
138+
139+ if (JsCallFunction (reject, args, 2 , &result) != JsNoError) {
140+ return Nothing<bool >();
141+ }
142+
143+ return Just (true );
55144 }
56145} // namespace v8
0 commit comments