示例#1
0
Object c_AwaitAllWaitHandle::FromVector(const BaseVector* dependencies) {
  auto const start = dependencies->data();
  auto const stop = start + dependencies->size();
  int32_t cnt = 0;

  for (auto iter = start; iter < stop; ++iter) {
    auto const current = tvAssertCell(iter);
    auto const child = c_WaitHandle::fromCell(current);
    if (UNLIKELY(!child)) failVector();
    cnt += !child->isFinished();
  }

  if (!cnt) return returnEmpty();

  SmartPtr<c_AwaitAllWaitHandle> result(Alloc(cnt));
  auto next = &result->m_children[cnt];

  for (auto iter = start; iter < stop; ++iter) {
    auto const current = tvAssertCell(iter);
    auto const child = c_WaitHandle::fromCell(current);
    if (child->isFinished()) continue;
    child->incRefCount();
    *(--next) = static_cast<c_WaitableWaitHandle*>(child);
  }

  assert(next == &result->m_children[0]);
  result->initialize();
  return Object(std::move(result));
}
Object c_AwaitAllWaitHandle::ti_fromvector(const Variant& dependencies) {
  if (LIKELY(dependencies.isObject())) {
    auto obj = dependencies.getObjectData();
    if (LIKELY(obj->isCollection() &&
               isVectorCollection(obj->collectionType()))) {
      assertx(collections::isType(obj->getVMClass(), CollectionType::Vector,
                                                  CollectionType::ImmVector));
      return FromVector(static_cast<BaseVector*>(obj));
    }
  }
  failVector();
}
Object c_AwaitAllWaitHandle::ti_fromvector(const Variant& dependencies) {
  if (LIKELY(dependencies.isObject())) {
    auto obj = dependencies.getObjectData();
    if (LIKELY(obj->isCollection() &&
               isVectorCollection(obj->collectionType()))) {
      assert(obj->instanceof(c_Vector::classof()) ||
             obj->instanceof(c_ImmVector::classof()));
      return FromVector(static_cast<BaseVector*>(obj));
    }
  }
  failVector();
}
示例#4
0
Object c_AwaitAllWaitHandle::ti_fromvector(const Variant& dependencies) {
  if (UNLIKELY(!dependencies.isObject() ||
               !Collection::isVectorType(
                 dependencies.getObjectData()->getCollectionType()))) {
    failVector();
  }
  assert(
    dependencies.getObjectData()->instanceof(c_Vector::classof()) ||
    dependencies.getObjectData()->instanceof(c_ImmVector::classof())
  );

  return FromVector(static_cast<BaseVector*>(dependencies.getObjectData()));
}
Object HHVM_STATIC_METHOD(AwaitAllWaitHandle, fromVector,
                          const Variant& dependencies) {
  if (LIKELY(dependencies.isObject())) {
    auto obj = dependencies.getObjectData();
    if (LIKELY(obj->isCollection() &&
               isVectorCollection(obj->collectionType()))) {
      assertx(collections::isType(obj->getVMClass(), CollectionType::Vector,
                                                  CollectionType::ImmVector));
      return c_AwaitAllWaitHandle::Create<false>([=](auto fn) {
        PackedArray::IterateV(static_cast<BaseVector*>(obj)->arrayData(), fn);
      });
    }
  }
  failVector();
}