Skip to content

Commit 378cc21

Browse files
authored
[libpromise.js] Add explicit addPromise helper function (#26950)
In addition to making things more explicitly, this saves on codesize when more than one promise function is included (see dylink_all codesize changes).
1 parent 40d04dc commit 378cc21

6 files changed

Lines changed: 55 additions & 60 deletions

src/lib/libpromise.js

Lines changed: 38 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ addToLibrary({
2525
return promiseInfo;
2626
},
2727

28+
$addPromise__deps: ['$promiseMap'],
29+
$addPromise: (promise) => promiseMap.allocate({promise}),
30+
2831
$idsToPromises__deps: ['$getPromise'],
2932
$idsToPromises: (idBuf, size) => {
3033
var promises = [];
@@ -133,7 +136,7 @@ addToLibrary({
133136
};
134137
},
135138

136-
emscripten_promise_then__deps: ['$promiseMap',
139+
emscripten_promise_then__deps: ['$addPromise',
137140
'$getPromise',
138141
'$makePromiseCallback'],
139142
emscripten_promise_then: (id, onFulfilled, onRejected, userData) => {
@@ -142,33 +145,30 @@ addToLibrary({
142145
#endif
143146
{{{ runtimeKeepalivePush() }}};
144147
var promise = getPromise(id);
145-
var newId = promiseMap.allocate({
146-
promise: promise.then(makePromiseCallback(onFulfilled, userData),
147-
makePromiseCallback(onRejected, userData))
148-
});
148+
var chainedPromise = promise.then(makePromiseCallback(onFulfilled, userData),
149+
makePromiseCallback(onRejected, userData));
150+
var newId = addPromise(chainedPromise);
149151
#if RUNTIME_DEBUG
150152
dbg(`emscripten_promise_then: -> ${newId}`);
151153
#endif
152154
return newId;
153155
},
154156

155-
emscripten_promise_all__deps: ['$promiseMap', '$idsToPromises'],
157+
emscripten_promise_all__deps: ['$addPromise', '$idsToPromises'],
156158
emscripten_promise_all: (idBuf, resultBuf, size) => {
157159
var promises = idsToPromises(idBuf, size);
158160
#if RUNTIME_DEBUG
159161
dbg(`emscripten_promise_all: ${promises}`);
160162
#endif
161-
var id = promiseMap.allocate({
162-
promise: Promise.all(promises).then((results) => {
163-
if (resultBuf) {
164-
for (var i = 0; i < size; i++) {
165-
var result = results[i];
166-
{{{ makeSetValue('resultBuf', `i*${POINTER_SIZE}`, 'result', '*') }}};
167-
}
163+
var id = addPromise(Promise.all(promises).then((results) => {
164+
if (resultBuf) {
165+
for (var i = 0; i < size; i++) {
166+
var result = results[i];
167+
{{{ makeSetValue('resultBuf', `i*${POINTER_SIZE}`, 'result', '*') }}};
168168
}
169-
return resultBuf;
170-
})
171-
});
169+
}
170+
return resultBuf;
171+
}));
172172
#if RUNTIME_DEBUG
173173
dbg(`create: ${id}`);
174174
#endif
@@ -185,34 +185,32 @@ addToLibrary({
185185
{{{ makeSetValue('ptr', C_STRUCTS.em_settled_result_t.value, 'value', '*') }}};
186186
},
187187
188-
emscripten_promise_all_settled__deps: ['$promiseMap', '$idsToPromises', '$setPromiseResult'],
188+
emscripten_promise_all_settled__deps: ['$addPromise', '$idsToPromises', '$setPromiseResult'],
189189
emscripten_promise_all_settled: (idBuf, resultBuf, size) => {
190190
var promises = idsToPromises(idBuf, size);
191191
#if RUNTIME_DEBUG
192192
dbg(`emscripten_promise_all_settled: ${promises}`);
193193
#endif
194-
var id = promiseMap.allocate({
195-
promise: Promise.allSettled(promises).then((results) => {
196-
if (resultBuf) {
197-
var offset = resultBuf;
198-
for (var i = 0; i < size; i++, offset += {{{ C_STRUCTS.em_settled_result_t.__size__ }}}) {
199-
if (results[i].status === 'fulfilled') {
200-
setPromiseResult(offset, true, results[i].value);
201-
} else {
202-
setPromiseResult(offset, false, results[i].reason);
203-
}
194+
var id = addPromise(Promise.allSettled(promises).then((results) => {
195+
if (resultBuf) {
196+
var offset = resultBuf;
197+
for (var i = 0; i < size; i++, offset += {{{ C_STRUCTS.em_settled_result_t.__size__ }}}) {
198+
if (results[i].status === 'fulfilled') {
199+
setPromiseResult(offset, true, results[i].value);
200+
} else {
201+
setPromiseResult(offset, false, results[i].reason);
204202
}
205203
}
206-
return resultBuf;
207-
})
208-
});
204+
}
205+
return resultBuf;
206+
}));
209207
#if RUNTIME_DEBUG
210208
dbg(`create: ${id}`);
211209
#endif
212210
return id;
213211
},
214212
215-
emscripten_promise_any__deps: ['$promiseMap', '$idsToPromises'],
213+
emscripten_promise_any__deps: ['$addPromise', '$idsToPromises'],
216214
emscripten_promise_any: (idBuf, errorBuf, size) => {
217215
var promises = idsToPromises(idBuf, size);
218216
#if RUNTIME_DEBUG
@@ -221,31 +219,27 @@ addToLibrary({
221219
#if ASSERTIONS
222220
assert(typeof Promise.any != 'undefined', "Promise.any does not exist");
223221
#endif
224-
var id = promiseMap.allocate({
225-
promise: Promise.any(promises).catch((err) => {
226-
if (errorBuf) {
227-
for (var i = 0; i < size; i++) {
228-
{{{ makeSetValue('errorBuf', `i*${POINTER_SIZE}`, 'err.errors[i]', '*') }}};
229-
}
222+
var id = addPromise(Promise.any(promises).catch((err) => {
223+
if (errorBuf) {
224+
for (var i = 0; i < size; i++) {
225+
{{{ makeSetValue('errorBuf', `i*${POINTER_SIZE}`, 'err.errors[i]', '*') }}};
230226
}
231-
throw errorBuf;
232-
})
233-
});
227+
}
228+
throw errorBuf;
229+
}));
234230
#if RUNTIME_DEBUG
235231
dbg(`create: ${id}`);
236232
#endif
237233
return id;
238234
},
239235
240-
emscripten_promise_race__deps: ['$promiseMap', '$idsToPromises'],
236+
emscripten_promise_race__deps: ['$addPromise', '$idsToPromises'],
241237
emscripten_promise_race: (idBuf, size) => {
242238
var promises = idsToPromises(idBuf, size);
243239
#if RUNTIME_DEBUG
244240
dbg(`emscripten_promise_race: ${promises}`);
245241
#endif
246-
var id = promiseMap.allocate({
247-
promise: Promise.race(promises)
248-
});
242+
var id = addPromise(Promise.race(promises));
249243
#if RUNTIME_DEBUG
250244
dbg(`create: ${id}`);
251245
#endif

test/codesize/test_codesize_hello_O0.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 24243,
3-
"a.out.js.gz": 8720,
2+
"a.out.js": 24254,
3+
"a.out.js.gz": 8724,
44
"a.out.nodebug.wasm": 14850,
55
"a.out.nodebug.wasm.gz": 7314,
6-
"total": 39093,
7-
"total_gz": 16034,
6+
"total": 39104,
7+
"total_gz": 16038,
88
"sent": [
99
"fd_write"
1010
],

test/codesize/test_codesize_hello_dylink_all.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"a.out.js": 268093,
2+
"a.out.js": 268075,
33
"a.out.nodebug.wasm": 587563,
4-
"total": 855656,
4+
"total": 855638,
55
"sent": [
66
"IMG_Init",
77
"IMG_Load",

test/codesize/test_codesize_minimal_O0.expected.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,7 @@ Module['FS_createPreloadedFile'] = FS.createPreloadedFile;
10491049
'registerPreMainLoop',
10501050
'getPromise',
10511051
'makePromise',
1052+
'addPromise',
10521053
'idsToPromises',
10531054
'makePromiseCallback',
10541055
'Browser_asyncPrepareDataCounter',

test/codesize/test_codesize_minimal_O0.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 19393,
3-
"a.out.js.gz": 6981,
2+
"a.out.js": 19404,
3+
"a.out.js.gz": 6985,
44
"a.out.nodebug.wasm": 1015,
55
"a.out.nodebug.wasm.gz": 602,
6-
"total": 20408,
7-
"total_gz": 7583,
6+
"total": 20419,
7+
"total_gz": 7587,
88
"sent": [],
99
"imports": [],
1010
"exports": [
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{
2-
"hello_world.js": 57036,
3-
"hello_world.js.gz": 17754,
2+
"hello_world.js": 57052,
3+
"hello_world.js.gz": 17758,
44
"hello_world.wasm": 14850,
55
"hello_world.wasm.gz": 7314,
66
"no_asserts.js": 26625,
77
"no_asserts.js.gz": 8892,
88
"no_asserts.wasm": 12010,
99
"no_asserts.wasm.gz": 5880,
10-
"strict.js": 54817,
11-
"strict.js.gz": 17051,
10+
"strict.js": 54833,
11+
"strict.js.gz": 17054,
1212
"strict.wasm": 14850,
1313
"strict.wasm.gz": 7310,
14-
"total": 180188,
15-
"total_gz": 64201
14+
"total": 180220,
15+
"total_gz": 64208
1616
}

0 commit comments

Comments
 (0)