void checkRefs(IRGS& env, int64_t entryArDelta, const std::vector<bool>& mask, const std::vector<bool>& vals, Offset dest) { auto const actRecOff = entryArDelta + offsetFromIRSP(env, BCSPOffset{0}); auto const funcPtr = gen(env, LdARFuncPtr, IRSPOffsetData { actRecOff }, sp(env)); SSATmp* nParams = nullptr; for (unsigned i = 0; i < mask.size(); i += 64) { assertx(i < vals.size()); uint64_t mask64 = packBitVec(mask, i); if (mask64 == 0) { continue; } if (i == 0) { nParams = cns(env, 64); } else if (!nParams || nParams->hasConstVal()) { nParams = gen(env, LdFuncNumParams, funcPtr); } auto const vals64 = packBitVec(vals, i); auto failBlock = env.irb->guardFailBlock(); if (failBlock == nullptr) failBlock = makeExit(env, dest); gen(env, CheckRefs, failBlock, funcPtr, nParams, cns(env, i), cns(env, mask64), cns(env, vals64)); } }
const StringData* findClassName(SSATmp* cls) { assertx(cls->isA(TCls)); if (cls->hasConstVal()) { return cls->clsVal()->preClass()->name(); } // Try to get the class name from a LdCls IRInstruction* clsInst = cls->inst(); if (clsInst->op() == LdCls || clsInst->op() == LdClsCached) { SSATmp* clsName = clsInst->src(0); assertx(clsName->isA(TStr)); if (clsName->hasConstVal()) { return clsName->strVal(); } } return nullptr; }