Object c_AwaitAllWaitHandle::FromMap(const BaseMap* dependencies) { auto const start = dependencies->firstElm(); auto const stop = dependencies->elmLimit(); int32_t cnt = 0; for (auto iter = start; iter != stop; iter = BaseMap::nextElm(iter, stop)) { auto const current = tvAssertCell(&iter->data); auto const child = c_WaitHandle::fromCell(current); if (UNLIKELY(!child)) failMap(); 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 = BaseMap::nextElm(iter, stop)) { auto const current = tvAssertCell(&iter->data); 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_frommap(const Variant& dependencies) { if (LIKELY(dependencies.isObject())) { auto obj = dependencies.getObjectData(); if (LIKELY(obj->isCollection() && isMapCollection(obj->collectionType()))) { assertx(collections::isType(obj->getVMClass(), CollectionType::Map, CollectionType::ImmMap)); return FromMap(static_cast<BaseMap*>(obj)); } } failMap(); }
Object c_AwaitAllWaitHandle::ti_frommap(const Variant& dependencies) { if (LIKELY(dependencies.isObject())) { auto obj = dependencies.getObjectData(); if (LIKELY(obj->isCollection() && isMapCollection(obj->collectionType()))) { assert(obj->instanceof(c_Map::classof()) || obj->instanceof(c_ImmMap::classof())); return FromMap(static_cast<BaseMap*>(obj)); } } failMap(); }
Object c_AwaitAllWaitHandle::ti_frommap(const Variant& dependencies) { if (UNLIKELY(!dependencies.isObject() || !Collection::isMapType( dependencies.getObjectData()->getCollectionType()))) { failMap(); } assert( dependencies.getObjectData()->instanceof(c_Map::classof()) || dependencies.getObjectData()->instanceof(c_ImmMap::classof()) ); return FromMap(static_cast<BaseMap*>(dependencies.getObjectData())); }
Object HHVM_STATIC_METHOD(AwaitAllWaitHandle, fromMap, const Variant& dependencies) { if (LIKELY(dependencies.isObject())) { auto obj = dependencies.getObjectData(); if (LIKELY(obj->isCollection() && isMapCollection(obj->collectionType()))) { assertx(collections::isType(obj->getVMClass(), CollectionType::Map, CollectionType::ImmMap)); return c_AwaitAllWaitHandle::Create<false>([=](auto fn) { MixedArray::IterateV(static_cast<BaseMap*>(obj)->arrayData(), fn); }); } } failMap(); }