Array vm_get_class_vars(CStrRef className) { HPHP::VM::Class* cls = HPHP::VM::Unit::lookupClass(className.get()); if (cls == NULL) { raise_error("Unknown class %s", className->data()); } cls->initialize(); const VM::Class::SProp* sPropInfo = cls->staticProperties(); const size_t numSProps = cls->numStaticProperties(); const VM::Class::Prop* propInfo = cls->declProperties(); const size_t numDeclProps = cls->numDeclProperties(); // The class' instance property initialization template is in different // places, depending on whether it has any request-dependent initializers // (i.e. constants) const VM::Class::PropInitVec& declPropInitVec = cls->declPropInit(); const VM::Class::PropInitVec* propVals = !cls->pinitVec().empty() ? cls->getPropData() : &declPropInitVec; ASSERT(propVals != NULL); ASSERT(propVals->size() == numDeclProps); // For visibility checks CallerFrame cf; HPHP::VM::Class* ctx = arGetContextClass(cf()); const ClassInfo* ctxCI = (ctx == NULL ? NULL : g_vmContext->findClassInfo(CStrRef(ctx->nameRef()))); ClassInfo::PropertyMap propMap; g_vmContext->findClassInfo(className)->getAllProperties(propMap); HphpArray* ret = NEW(HphpArray)(numDeclProps + numSProps); for (size_t i = 0; i < numDeclProps; ++i) { StringData* name = const_cast<StringData*>(propInfo[i].m_name); // Empty names are used for invisible/private parent properties; skip them if (name->size() == 0) continue; if (propMap[String(name)]->isVisible(ctxCI)) { const TypedValue* value = &((*propVals)[i]); ret->nvSet(name, value, false); } } for (size_t i = 0; i < numSProps; ++i) { bool vis, access; TypedValue* value = cls->getSProp(ctx, sPropInfo[i].m_name, vis, access); if (vis) { ret->nvSet(const_cast<StringData*>(sPropInfo[i].m_name), value, false); } } return ret; }
Variant f_get_class(CVarRef object /* = null_variant */) { if (object.isNull()) { // No arg passed. String ret; if (hhvm) { CallerFrame cf; HPHP::VM::Class* cls = HPHP::VM::arGetContextClassImpl<true>(cf()); if (cls) { ret = CStrRef(cls->nameRef()); } } else { ret = FrameInjection::GetClassName(true); } if (ret.empty()) { raise_warning("get_class() called without object from outside a class"); return false; } return ret; } if (!object.isObject()) return false; return object.toObject()->o_getClassName(); }