void AsioSession::updateEventHookState() { if (hasOnResumableCreate() || hasOnResumableAwait() || hasOnResumableSuccess()) { EventHook::EnableAsync(); } else { EventHook::DisableAsync(); } }
void EventHook::onFunctionSuspendE(ActRec* suspending, const ActRec* resumableAR) { // When we're suspending an eagerly executing resumable, we've already // teleported the ActRec from suspending over to resumableAR, so we need to // make sure the unwinder knows not to touch the locals, $this, or // VarEnv/ExtraArgs. suspending->setThisOrClassAllowNull(nullptr); suspending->setLocalsDecRefd(); suspending->setVarEnv(nullptr); try { auto const flags = check_request_surprise(); onFunctionExit(resumableAR, nullptr, false, nullptr, flags); if ((flags & AsyncEventHookFlag) && resumableAR->func()->isAsyncFunction()) { assert(resumableAR->resumed()); auto const afwh = frame_afwh(resumableAR); auto const session = AsioSession::Get(); if (session->hasOnResumableCreate()) { session->onResumableCreate(afwh, afwh->getChild()); } } } catch (...) { auto const resumableObj = [&]() -> ObjectData* { if (resumableAR->func()->isAsyncFunction()) { return frame_afwh(resumableAR); } assert(resumableAR->func()->isGenerator()); return !resumableAR->func()->isAsync() ? frame_generator(resumableAR)->toObject() : frame_async_generator(resumableAR)->toObject(); }(); decRefObj(resumableObj); throw; } }