@@ -179,7 +179,17 @@ mergeInto(LibraryManager.library, {
179
179
return id ;
180
180
} ,
181
181
182
- emscripten_promise_all_settled__deps : [ '$promiseMap' , '$idsToPromises' ] ,
182
+ $setPromiseResult__internal : true ,
183
+ $setPromiseResult : ( ptr , fulfill , value ) = > {
184
+ #if ASSERTIONS
185
+ assert ( typeof value == 'undefined' || typeof value === 'number' , `native promises can only handle numeric results ( $ { value} $ { typeof value } ) `);
186
+ #endif
187
+ var result = fulfill ? {{{ cDefs.EM_PROMISE_FULFILL }}} : {{{ cDefs.EM_PROMISE_REJECT }}}
188
+ {{{ makeSetValue('ptr', C_STRUCTS.em_settled_result_t.result, 'result', 'i32') }}};
189
+ {{{ makeSetValue('ptr', C_STRUCTS.em_settled_result_t.value, 'value', '*') }}};
190
+ },
191
+
192
+ emscripten_promise_all_settled__deps: ['$promiseMap', '$idsToPromises', '$setPromiseResult'],
183
193
emscripten_promise_all_settled: function(idBuf, resultBuf, size) {
184
194
var promises = idsToPromises(idBuf, size);
185
195
#if RUNTIME_DEBUG
@@ -188,22 +198,12 @@ mergeInto(LibraryManager.library, {
188
198
var id = promiseMap.allocate({
189
199
promise: Promise.allSettled(promises).then((results) => {
190
200
if (resultBuf) {
191
- for ( var i = 0 ; i < size ; i ++ ) {
192
- var baseOffset = i * { { { C_STRUCTS . em_settled_result_t . __size__ } } } ;
193
- var resultOffset =
194
- baseOffset + { { { C_STRUCTS . em_settled_result_t . result } } } ;
195
- var valueOffset =
196
- baseOffset + { { { C_STRUCTS . em_settled_result_t . value } } } ;
201
+ var offset = resultBuf;
202
+ for (var i = 0; i < size; i++, offset += {{{ C_STRUCTS.em_settled_result_t.__size__ }}}) {
197
203
if (results[i].status === 'fulfilled') {
198
- var fulfill = { { { cDefs . EM_PROMISE_FULFILL } } } ;
199
- { { { makeSetValue ( 'resultBuf' , 'resultOffset' , 'fulfill' , 'i32' ) } } } ;
200
- { { { makeSetValue ( 'resultBuf' , 'valueOffset' , 'results[i].value' , '*' ) } } } ;
204
+ setPromiseResult(offset, true, results[i].value);
201
205
} else {
202
- var reject = { { { cDefs . EM_PROMISE_REJECT } } } ;
203
- { { { makeSetValue ( 'resultBuf' , 'resultOffset' , 'reject' , 'i32' ) } } } ;
204
- // Closure can't type `reason` in some contexts.
205
- var reason = /** @type {number } */ ( results [ i ] . reason ) ;
206
- { { { makeSetValue ( 'resultBuf' , 'valueOffset' , 'reason' , '*' ) } } } ;
206
+ setPromiseResult(offset, false, results[i].reason);
207
207
}
208
208
}
209
209
}
@@ -216,7 +216,6 @@ mergeInto(LibraryManager.library, {
216
216
return id;
217
217
},
218
218
219
-
220
219
emscripten_promise_any__deps: [
221
220
'$promiseMap', '$idsToPromises',
222
221
#if !SUPPORTS_PROMISE_ANY && !INCLUDE_FULL_LIBRARY
@@ -260,5 +259,5 @@ mergeInto(LibraryManager.library, {
260
259
dbg(` create : ${id } `) ;
261
260
#endif
262
261
return id ;
263
- }
262
+ } ,
264
263
} ) ;
0 commit comments