Skip to content

Commit cbaee1b

Browse files
committed
Allow null/undefined handler in emscripten_promise_then
Just like in the JS `promise.then` API it is now valid to pass NULL (0) callbacks to emscripten_promise_then.
1 parent 378cc21 commit cbaee1b

4 files changed

Lines changed: 44 additions & 7 deletions

File tree

src/lib/libpromise.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
addToLibrary({
88
$promiseMap__deps: ['$HandleAllocator'],
9-
$promiseMap: "new HandleAllocator();",
9+
$promiseMap: 'new HandleAllocator();',
1010

1111
$getPromise__deps: ['$promiseMap'],
1212
$getPromise: (id) => promiseMap.get(id).promise,
@@ -73,7 +73,7 @@ addToLibrary({
7373
return;
7474
}
7575
#if ASSERTIONS
76-
abort("unexpected promise callback result " + result);
76+
abort(`unexpected promise callback result ${result}`);
7777
#endif
7878
},
7979
@@ -84,6 +84,7 @@ addToLibrary({
8484
'$stackRestore',
8585
'$stackSave'],
8686
$makePromiseCallback: (callback, userData) => {
87+
if (!callback) return;
8788
return (value) => {
8889
#if RUNTIME_DEBUG
8990
dbg(`emscripten promise callback: ${value}`);
@@ -131,7 +132,7 @@ addToLibrary({
131132
throw resultVal;
132133
}
133134
#if ASSERTIONS
134-
abort("unexpected promise callback result " + result);
135+
abort(`unexpected promise callback result ${result}`);
135136
#endif
136137
};
137138
},
@@ -217,7 +218,7 @@ addToLibrary({
217218
dbg(`emscripten_promise_any: ${promises}`);
218219
#endif
219220
#if ASSERTIONS
220-
assert(typeof Promise.any != 'undefined', "Promise.any does not exist");
221+
assert(typeof Promise.any != 'undefined', 'Promise.any does not exist');
221222
#endif
222223
var id = addPromise(Promise.any(promises).catch((err) => {
223224
if (errorBuf) {

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": 268075,
2+
"a.out.js": 268089,
33
"a.out.nodebug.wasm": 587563,
4-
"total": 855638,
4+
"total": 855652,
55
"sent": [
66
"IMG_Init",
77
"IMG_Load",

test/core/test_promise.c

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,36 @@ static em_promise_result_t test_race(void** result, void* data, void* value) {
498498
return EM_PROMISE_MATCH_RELEASE;
499499
}
500500

501+
static em_promise_result_t test_null_handlers(void** result, void* data, void* value) {
502+
emscripten_console_log("test_null_handlers");
503+
assert(data == (void*)8);
504+
505+
em_promise_t fulfilled = emscripten_promise_create();
506+
emscripten_promise_resolve(fulfilled, EM_PROMISE_FULFILL, (void*)42);
507+
// Pass NULL as onFulfilled, it should just pass through the value.
508+
em_promise_t next1 = emscripten_promise_then(fulfilled, NULL, fail, NULL);
509+
em_promise_t next2 = emscripten_promise_then(next1, expect_success, fail, NULL);
510+
511+
em_promise_t rejected = emscripten_promise_create();
512+
emscripten_promise_resolve(rejected, EM_PROMISE_REJECT, (void*)43);
513+
// Pass NULL as onRejected, it should just pass through the error.
514+
em_promise_t next3 = emscripten_promise_then(rejected, fail, NULL, NULL);
515+
em_promise_t next4 = emscripten_promise_then(next3, fail, expect_error, NULL);
516+
517+
em_promise_t to_finish[2] = {next2, next4};
518+
em_promise_t finish_test_null = emscripten_promise_all(to_finish, NULL, 2);
519+
520+
emscripten_promise_destroy(fulfilled);
521+
emscripten_promise_destroy(next1);
522+
emscripten_promise_destroy(next2);
523+
emscripten_promise_destroy(rejected);
524+
emscripten_promise_destroy(next3);
525+
emscripten_promise_destroy(next4);
526+
527+
*result = finish_test_null;
528+
return EM_PROMISE_MATCH_RELEASE;
529+
}
530+
501531
static em_promise_result_t finish(void** result, void* data, void* value) {
502532
emscripten_console_logf("finish");
503533

@@ -547,8 +577,10 @@ int main() {
547577
em_promise_t test6 = emscripten_promise_then(test5, test_any, fail, (void*)6);
548578
em_promise_t test7 =
549579
emscripten_promise_then(test6, test_race, fail, (void*)7);
580+
em_promise_t test8 =
581+
emscripten_promise_then(test7, test_null_handlers, fail, (void*)8);
550582
em_promise_t assert_stack =
551-
emscripten_promise_then(test7, check_stack, fail, NULL);
583+
emscripten_promise_then(test8, check_stack, fail, NULL);
552584
em_promise_t end = emscripten_promise_then(assert_stack, finish, fail, NULL);
553585

554586
emscripten_promise_resolve(start, EM_PROMISE_FULFILL, NULL);
@@ -562,6 +594,7 @@ int main() {
562594
emscripten_promise_destroy(test5);
563595
emscripten_promise_destroy(test6);
564596
emscripten_promise_destroy(test7);
597+
emscripten_promise_destroy(test8);
565598
emscripten_promise_destroy(assert_stack);
566599
emscripten_promise_destroy(end);
567600

test/core/test_promise.out

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,7 @@ promise_any reasons:
3131
test_race
3232
expected success: 42
3333
expected error: 42
34+
test_null_handlers
35+
expected success: 42
36+
expected error: 43
3437
finish

0 commit comments

Comments
 (0)