void PreClass::prettyPrint(std::ostream &out) const { out << "Class "; if (m_attrs & AttrAbstract) { out << "abstract "; } if (m_attrs & AttrFinal) { out << "final "; } if (m_attrs & AttrInterface) { out << "interface "; } out << m_name->data() << " at " << m_offset; if (m_hoistable == MaybeHoistable) { out << " (maybe-hoistable)"; } else if (m_hoistable == AlwaysHoistable) { out << " (always-hoistable)"; } if (m_attrs & AttrUnique) out << " (unique)"; if (m_attrs & AttrPersistent) out << " (persistent)"; if (m_id != -1) { out << " (ID " << m_id << ")"; } out << std::endl; for (Func* const* it = methods(); it != methods() + numMethods(); ++it) { out << " "; (*it)->prettyPrint(out); } for (const Prop* it = properties(); it != properties() + numProperties(); ++it) { out << " "; it->prettyPrint(out); } for (const Const* it = constants(); it != constants() + numConstants(); ++it) { out << " "; it->prettyPrint(out); } }
Array HHVM_FUNCTION(get_class_constants, const String& className) { auto const cls = Unit::loadClass(className.get()); if (cls == NULL) { return Array::attach(MixedArray::MakeReserve(0)); } auto const numConstants = cls->numConstants(); ArrayInit arrayInit(numConstants, ArrayInit::Map{}); auto const consts = cls->constants(); for (size_t i = 0; i < numConstants; i++) { // Note: hphpc doesn't include inherited constants in // get_class_constants(), so mimic that behavior if (consts[i].cls == cls && !consts[i].isAbstract() && !consts[i].isType()) { auto const name = const_cast<StringData*>(consts[i].name.get()); Cell value = consts[i].val; // Handle dynamically set constants if (value.m_type == KindOfUninit) { value = cls->clsCnsGet(consts[i].name); } assert(value.m_type != KindOfUninit); arrayInit.set(name, cellAsCVarRef(value)); } } return arrayInit.toArray(); }