String c_WaitableWaitHandle::getName() {
  switch (getKind()) {
    case Kind::Static:              not_reached();
    case Kind::AsyncFunction:       return asAsyncFunction()->getName();
    case Kind::AsyncGenerator:      return asAsyncGenerator()->getName();
    case Kind::AwaitAll:            return asAwaitAll()->getName();
    case Kind::Condition:           return asCondition()->getName();
    case Kind::Reschedule:          return asReschedule()->getName();
    case Kind::Sleep:               return asSleep()->getName();
    case Kind::ExternalThreadEvent: return asExternalThreadEvent()->getName();
  }
  not_reached();
}
c_WaitableWaitHandle* c_WaitableWaitHandle::getChild() {
  assertx(!isFinished());

  switch (getKind()) {
    case Kind::Static:              not_reached();
    case Kind::AsyncFunction:       return asAsyncFunction()->getChild();
    case Kind::AsyncGenerator:      return asAsyncGenerator()->getChild();
    case Kind::AwaitAll:            return asAwaitAll()->getChild();
    case Kind::Condition:           return asCondition()->getChild();
    case Kind::Reschedule:          return nullptr;
    case Kind::Sleep:               return nullptr;
    case Kind::ExternalThreadEvent: return nullptr;
  }
  not_reached();
}
c_WaitableWaitHandle* c_WaitableWaitHandle::getChild() {
  assert(!isFinished());

  switch (getKind()) {
    case Kind::Static:              not_reached();
    case Kind::AsyncFunction:       return asAsyncFunction()->getChild();
    case Kind::AsyncGenerator:      return asAsyncGenerator()->getChild();
    case Kind::GenArray:            return asGenArray()->getChild();
    case Kind::GenMap:              return asGenMap()->getChild();
    case Kind::GenVector:           return asGenVector()->getChild();
    case Kind::Reschedule:          return nullptr;
    case Kind::Sleep:               return nullptr;
    case Kind::ExternalThreadEvent: return nullptr;
      return nullptr;
  }
  not_reached();
}
void c_WaitableWaitHandle::enterContextImpl(context_idx_t ctx_idx) {
  switch (getKind()) {
    case Kind::Static:
      not_reached();
    case Kind::AsyncFunction:
      return asAsyncFunction()->enterContextImpl(ctx_idx);
    case Kind::AsyncGenerator:
      return asAsyncGenerator()->enterContextImpl(ctx_idx);
    case Kind::GenArray:
      return asGenArray()->enterContextImpl(ctx_idx);
    case Kind::GenMap:
      return asGenMap()->enterContextImpl(ctx_idx);
    case Kind::GenVector:
      return asGenVector()->enterContextImpl(ctx_idx);
    case Kind::Reschedule:
      return asReschedule()->enterContextImpl(ctx_idx);
    case Kind::Sleep:
      return asSleep()->enterContextImpl(ctx_idx);
    case Kind::ExternalThreadEvent:
      return asExternalThreadEvent()->enterContextImpl(ctx_idx);
  }
  not_reached();
}