Skip to content

Commit 47e6d28

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 fdda71c commit 47e6d28

3 files changed

Lines changed: 42 additions & 5 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,
@@ -70,7 +70,7 @@ addToLibrary({
7070
return;
7171
}
7272
#if ASSERTIONS
73-
abort("unexpected promise callback result " + result);
73+
abort(`unexpected promise callback result ${result}`);
7474
#endif
7575
},
7676
@@ -81,6 +81,7 @@ addToLibrary({
8181
'$stackRestore',
8282
'$stackSave'],
8383
$makePromiseCallback: (callback, userData) => {
84+
if (!callback) return;
8485
return (value) => {
8586
#if RUNTIME_DEBUG
8687
dbg(`emscripten promise callback: ${value}`);
@@ -128,7 +129,7 @@ addToLibrary({
128129
throw resultVal;
129130
}
130131
#if ASSERTIONS
131-
abort("unexpected promise callback result " + result);
132+
abort(`unexpected promise callback result ${result}`);
132133
#endif
133134
};
134135
},
@@ -219,7 +220,7 @@ addToLibrary({
219220
dbg(`emscripten_promise_any: ${promises}`);
220221
#endif
221222
#if ASSERTIONS
222-
assert(typeof Promise.any != 'undefined', "Promise.any does not exist");
223+
assert(typeof Promise.any != 'undefined', 'Promise.any does not exist');
223224
#endif
224225
var id = promiseMap.allocate({
225226
promise: Promise.any(promises).catch((err) => {

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)