| 806 | }; |
| 807 | |
| 808 | inline void val::awaiter::reject_with(val&& error) { |
| 809 | auto* coro_ptr = std::get_if<state_coro>(&state); |
| 810 | assert(coro_ptr && "Invalid awaiter state: expected suspended coroutine handle."); |
| 811 | auto coro = *coro_ptr; |
| 812 | |
| 813 | if (coro.is_val_promise) { |
| 814 | if (!internal::_emval_is_catchable_cpp_exception_object(error.as_handle())) { |
| 815 | // C++ code cannot catch JS exceptions. |
| 816 | // Thus, we can just reject an enclosing JS Promise. |
| 817 | auto& promise = std::coroutine_handle<promise_type>::from_address(coro.handle.address()).promise(); |
| 818 | promise.reject_with(std::move(error)); |
| 819 | coro.handle.destroy(); |
| 820 | return; |
| 821 | } |
| 822 | } |
| 823 | |
| 824 | state.emplace<state_error>(std::move(error)); |
| 825 | coro.handle.resume(); |
| 826 | } |
| 827 | |
| 828 | #endif |
| 829 | |