diff --git a/lib/modules/Concurrent.pmod b/lib/modules/Concurrent.pmod index bf855169282a16f572efe257fbca0e4f87c998a0..160083762889ac6f4f9904b266148c4604b79a95 100644 --- a/lib/modules/Concurrent.pmod +++ b/lib/modules/Concurrent.pmod @@ -906,8 +906,20 @@ class Promise function(mixed:void), mixed ...:void) executor, mixed ... extra) { state = STATE_NO_FUTURE; - if (executor) - executor(success, failure, @extra); + + if (executor) { + mixed err = catch(executor(success, failure, @extra)); + + // This unfortunately does hide the real error in case of + // double-finalization, i.e. + // fail("I reject!"); + // error("I rejected.\n"); + // in the executor will leave our caller with an error about the + // Promise already having been finalized, not giving anyone too much + // information about where the double-finalization occured... + if (err) + failure(err); + } } Future on_success(function(mixed, mixed ... : void) cb, mixed ... extra)