Array Unit::getTraitsInfo() { // Returns an array with all defined trait names. This method is used to // support get_declared_traits(). Array array = Array::Create(); if (s_namedDataMap) { for (AllCachedClasses ac; !ac.empty(); ) { Class* c = ac.popFront(); if (c->attrs() & AttrTrait) { array.append(c->nameRef()); } } } return array; }
Array Unit::getInterfacesInfo() { // Return an array of all defined interface names. This method is used to // support get_declared_interfaces(). Array a = Array::Create(); if (s_namedDataMap) { for (AllCachedClasses ac; !ac.empty();) { Class* c = ac.popFront(); if (c->attrs() & AttrInterface) { a.append(c->nameRef()); } } } return a; }
void profile(const StringData* name) { if (g_initFlag.load(std::memory_order_acquire)) return; assert(name->isStatic()); unsigned inc = 1; Class* c = Unit::lookupClass(name); if (c && (c->attrs() & AttrInterface)) { // Favor interfaces inc = 250; } // The extra layer of locking is here so that InstanceBits::init can safely // iterate over s_instanceCounts while building its map of names to bits. ReadLock l(s_instanceCountsLock); InstanceCounts::accessor acc; if (!s_instanceCounts.insert(acc, InstanceCounts::value_type(name, inc))) { acc->second += inc; } }
Type liveTVType(const TypedValue* tv) { assert(tv->m_type == KindOfClass || tvIsPlausible(*tv)); if (tv->m_type == KindOfObject) { Class* cls = tv->m_data.pobj->getVMClass(); // We only allow specialization on final classes for now. if (cls && !(cls->attrs() & AttrFinal)) cls = nullptr; return Type::Obj.specialize(cls); } if (tv->m_type == KindOfArray) { return Type::Arr.specialize(tv->m_data.parr->kind()); } auto outer = tv->m_type; auto inner = KindOfInvalid; if (outer == KindOfStaticString) outer = KindOfString; if (outer == KindOfRef) { inner = tv->m_data.pref->tv()->m_type; if (inner == KindOfStaticString) inner = KindOfString; } return Type(outer, inner); }
bool Unit::classExists(const StringData* name, bool autoload, Attr typeAttrs) { Class* cls = Unit::getClass(name, autoload); return cls && (cls->attrs() & (AttrInterface | AttrTrait)) == typeAttrs; }