コード例 #1
0
ファイル: collections.cpp プロジェクト: DerPapst/hhvm
bool equals(const ObjectData* obj1, const ObjectData* obj2) {
  assertx(isValidCollection(obj1->collectionType()));
  if (!obj2->isCollection()) return false;
  auto ct1 = obj1->collectionType();
  auto ct2 = obj2->collectionType();

  // we intentionally allow mutable/immutable versions of the same collection
  // type to compare equal
  if (isMapCollection(ct1)) {
    return isMapCollection(ct2) && BaseMap::Equals(obj1, obj2);
  } else if (isVectorCollection(ct1)) {
    return isVectorCollection(ct2) && BaseVector::Equals(obj1, obj2);
  } else if (isSetCollection(ct1)) {
    return isSetCollection(ct2) && BaseSet::Equals(obj1, obj2);
  } else {
    assertx(ct1 == CollectionType::Pair);
    return (ct2 == CollectionType::Pair) && c_Pair::Equals(obj1, obj2);
  }
}
コード例 #2
0
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();
}
コード例 #3
0
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
ファイル: collections.cpp プロジェクト: shixiao/hhvm
bool equals(const ObjectData* obj1, const ObjectData* obj2) {
  assertx(isValidCollection(obj1->collectionType()));
  if (!obj2->isCollection()) return false;
  auto ct1 = obj1->collectionType();
  auto ct2 = obj2->collectionType();

  if (isMapCollection(ct1) && isMapCollection(ct2)) {
    // For migration purposes, distinct Map types should compare equal
    return BaseMap::Equals(
      BaseMap::EqualityFlavor::OrderIrrelevant, obj1, obj2);
  }

  if (isVectorCollection(ct1) && isVectorCollection(ct2)) {
    return BaseVector::Equals(obj1, obj2);
  }

  if (isSetCollection(ct1) && isSetCollection(ct2)) {
    return BaseSet::Equals(obj1, obj2);
  }

  if (ct1 != ct2) return false;
  assert(ct1 == CollectionType::Pair);
  return c_Pair::Equals(obj1, obj2);
}
コード例 #5
0
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();
}