SSATmp* ldClsPropAddrKnown(IRGS& env, const Class* cls, const StringData* name) { initSProps(env, cls); // calls init; must be above sPropHandle() auto const slot = cls->lookupSProp(name); auto const handle = cls->sPropHandle(slot); auto const repoTy = !RuntimeOption::RepoAuthoritative ? RepoAuthType{} : cls->staticPropRepoAuthType(slot); auto const ptrTy = typeFromRAT(repoTy).ptr(Ptr::SProp); return gen(env, LdRDSAddr, RDSHandleData { handle }, ptrTy); }
SSATmp* allocObjFast(HTS& env, const Class* cls) { auto registerObj = [&] (SSATmp* obj) { if (RuntimeOption::EnableObjDestructCall && cls->getDtor()) { gen(env, RegisterLiveObj, obj); } return obj; }; // If it's an extension class with a custom instance initializer, // that init function does all the work. if (cls->instanceCtor()) { auto const obj = gen(env, ConstructInstance, ClassData(cls)); return registerObj(obj); } // Make sure our property init vectors are all set up. const bool props = cls->pinitVec().size() > 0; const bool sprops = cls->numStaticProperties() > 0; assert((props || sprops) == cls->needInitialization()); if (cls->needInitialization()) { if (props) initProps(env, cls); if (sprops) initSProps(env, cls); } /* * Allocate the object. This must happen after we do sinits for consistency * with the interpreter about o_id assignments. Also, the prop * initialization above can throw, so we don't want to have the object * allocated already. */ auto const ssaObj = gen(env, NewInstanceRaw, ClassData(cls)); // Initialize the properties gen(env, InitObjProps, ClassData(cls), ssaObj); // Call a custom initializer if one exists if (cls->callsCustomInstanceInit()) { return registerObj(gen(env, CustomInstanceInit, ssaObj)); } return registerObj(ssaObj); }