c_AsyncFunctionWaitHandle*
c_AsyncFunctionWaitHandle::Create(const ActRec* fp,
                                  size_t numSlots,
                                  JIT::TCA resumeAddr,
                                  Offset resumeOffset,
                                  ObjectData* child) {
  assert(fp);
  assert(!fp->resumed());
  assert(fp->func()->isAsyncFunction());
  assert(child);
  assert(child->instanceof(c_WaitableWaitHandle::classof()));

  auto child_wh = static_cast<c_WaitableWaitHandle*>(child);
  assert(!child_wh->isFinished());

  checkCreateErrors(child_wh);

  void* obj = Resumable::Create(fp, numSlots, resumeAddr, resumeOffset,
                                sizeof(c_AsyncFunctionWaitHandle));
  auto const waitHandle = new (obj) c_AsyncFunctionWaitHandle();
  waitHandle->incRefCount();
  waitHandle->setNoDestruct();
  waitHandle->initialize(child_wh);
  return waitHandle;
}
c_AsyncGeneratorWaitHandle*
c_AsyncGeneratorWaitHandle::Create(c_AsyncGenerator* gen,
                                   c_WaitableWaitHandle* child) {
  assert(child);
  assert(child->instanceof(c_WaitableWaitHandle::classof()));
  assert(!child->isFinished());

  checkCreateErrors(child);
  auto const waitHandle = NEWOBJ(c_AsyncGeneratorWaitHandle)();
  waitHandle->incRefCount();
  waitHandle->initialize(gen, child);
  return waitHandle;
}