void c_AsyncGeneratorWaitHandle::fail(ObjectData* exception) { AsioSession* session = AsioSession::Get(); if (UNLIKELY(session->hasOnResumableFail())) { session->onResumableFail(this, exception); } auto parentChain = getParentChain(); setState(STATE_FAILED); cellCopy(make_tv<KindOfObject>(exception), m_resultOrException); parentChain.unblock(); decRefObj(m_generator->toObject()); decRefObj(this); }
/** * Mark the wait handle as failed due to PHP exception. * * - consumes reference of the given Exception object */ void c_AsyncFunctionWaitHandle::fail(ObjectData* exception) { assert(isRunning()); assert(exception); assert(exception->instanceof(SystemLib::s_ThrowableClass)); AsioSession* session = AsioSession::Get(); if (UNLIKELY(session->hasOnResumableFail())) { try { session->onResumableFail(this, Object{exception}); } catch (...) { // TODO(#4557954) Make unwinder able to deal with new exceptions better. handle_destructor_exception("AsyncFunctionWaitHandle fail callback"); } } auto parentChain = getParentChain(); setState(STATE_FAILED); cellCopy(make_tv<KindOfObject>(exception), m_resultOrException); parentChain.unblock(); }