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(); }
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(); }