Skip to content
This repository was archived by the owner on Oct 15, 2020. It is now read-only.

Commit 354e306

Browse files
committed
shim: adding v8::Promise and v8::Promise::Resolver implementations
1 parent 7a53fce commit 354e306

File tree

5 files changed

+120
-8
lines changed

5 files changed

+120
-8
lines changed

deps/chakrashim/include/v8.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ class Local {
356356
friend class PropertyDescriptor;
357357
friend class Proxy;
358358
friend class RegExp;
359+
friend class Promise;
359360
friend class Set;
360361
friend class Signature;
361362
friend class Script;

deps/chakrashim/lib/chakra_shim.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@
547547
obj instanceof URIError;
548548
};
549549
utils.isPromise = function(obj) {
550-
return compareType(obj, 'Object') && obj instanceof Promise;
550+
return compareType(obj, 'Promise') && obj instanceof Promise;
551551
};
552552
utils.isRegExp = function(obj) {
553553
return compareType(obj, 'RegExp');

deps/chakrashim/src/jsrtcachedpropertyidref.inc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ DEF(Symbol_toStringTag)
128128
DEF(add)
129129
DEF(from)
130130

131+
132+
DEF(promise)
133+
DEF(resolve)
134+
DEF(reject)
135+
DEF(state)
136+
131137
DEFSYMBOL(self)
132138
DEFSYMBOL(__external__)
133139
DEFSYMBOL(__hiddenvalues__)

deps/chakrashim/src/v8promise.cc

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,27 @@ namespace v8 {
2626
Promise::Promise() { }
2727

2828
Local<Value> Promise::Result() {
29-
return Local<Value>();
29+
JsValueRef value;
30+
if (jsrt::GetProperty(this, jsrt::CachedPropertyIdRef::value, &value) != JsNoError) {
31+
return Local<Value>();
32+
}
33+
return Local<Value>::New(value);
3034
}
3135

3236
Promise::PromiseState Promise::State() {
33-
return PromiseState::kFulfilled;
37+
JsValueRef state;
38+
if (jsrt::GetProperty(this, jsrt::CachedPropertyIdRef::state, &state) != JsNoError) {
39+
return PromiseState::kPending;
40+
}
41+
int stateNumber;
42+
if (JsNumberToInt(state, &stateNumber) != JsNoError) {
43+
return PromiseState::kPending;
44+
}
45+
switch(stateNumber) {
46+
case 1: return PromiseState::kFulfilled;
47+
case 2: return PromiseState::kRejected;
48+
default: return PromiseState::kPending;
49+
}
3450
}
3551

3652
MaybeLocal<Promise> Promise::Then(Local<Context> context,

deps/chakrashim/src/v8resolver.cc

Lines changed: 94 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)