Use lookupUniqueClass

The translator does better in a number of places when it
knows an AttrUnqiue Class* at translation time - even if it
doesnt know for sure that it will be defined when we enter the
tracelet. Now that we autoload (nearly) everything, we enter
a lot of tracelets where an AttrUnique Class* has been seen
(during warmup) but is not yet defined (in this request).
I added lookupUniqueClass while working on the new autoloader
to find such Classes, and allow us to do a better translation,
but never got around to using it.
Esse commit está contido em:
mwilliams
2013-03-12 20:02:10 -07:00
commit de Sara Golemon
commit f7b802c872
6 arquivos alterados com 21 adições e 16 exclusões
+1 -1
Ver Arquivo
@@ -100,7 +100,7 @@ static void recordActRecPush(NormalizedInstruction& i,
fcall.m_offset = fpi->m_fcallOff;
assert(isFCallStar(*unit->at(fcall.offset())));
if (clsName) {
const Class* cls = Unit::lookupClass(clsName);
const Class* cls = Unit::lookupUniqueClass(clsName);
bool magic = false;
const Func* func = lookupImmutableMethod(cls, name, magic, staticCall);
if (func) {
@@ -1417,7 +1417,7 @@ void HhbcTranslator::emitFPushClsMethodD(int32_t numParams,
UNUSED const StringData* className = np.first;
TRACE(3, "%u: FPushClsMethodD %s::%s %d\n", m_bcOff, className->data(),
methodName->data(), numParams);
const Class* baseClass = Unit::lookupClass(np.second);
const Class* baseClass = Unit::lookupUniqueClass(np.second);
bool magicCall = false;
const Func* func = HPHP::VM::Transl::lookupImmutableMethod(baseClass,
methodName,
@@ -1944,7 +1944,8 @@ void HhbcTranslator::emitVerifyParamType(int32_t paramId,
assert(!constraintClsName || constraintClsName->isStatic());
const Func* func = getCurFunc();
const Class* constraint = (constraintClsName ?
Unit::lookupClass(constraintClsName) : nullptr);
Unit::lookupUniqueClass(constraintClsName) :
nullptr);
const TypeConstraint& tc = func->params()[paramId].typeConstraint();
const StringData* tcTypeName = tc.typeName();
@@ -2003,7 +2004,7 @@ void HhbcTranslator::emitInstanceOfD(int classNameStrId) {
Class::initInstanceBits();
const bool haveBit = Class::haveInstanceBit(className);
Class* const maybeCls = Unit::lookupClass(className);
Class* const maybeCls = Unit::lookupUniqueClass(className);
const bool isNormalClass = maybeCls &&
!(maybeCls->attrs() &
(AttrTrait | AttrInterface));
+1 -1
Ver Arquivo
@@ -267,7 +267,7 @@ SSATmp* Simplifier::simplifyGetCtxFwdCall(IRInstruction* inst) {
SSATmp* Simplifier::simplifyLdCls(IRInstruction* inst) {
SSATmp* clsName = inst->getSrc(0);
if (clsName->isConst()) {
const Class* cls = Unit::lookupClass(clsName->getValStr());
const Class* cls = Unit::lookupUniqueClass(clsName->getValStr());
if (cls) {
if (RuntimeOption::RepoAuthoritative && (cls->attrs() & AttrUnique)) {
// the class is unique
+6 -6
Ver Arquivo
@@ -7035,7 +7035,7 @@ TranslatorX64::emitKnownClassCheck(const NormalizedInstruction& i,
RegNumber reg) {
using namespace TargetCache;
assert(clsName);
Class* klass = Unit::lookupClass(clsName);
Class* klass = Unit::lookupUniqueClass(clsName);
bool guarded = false;
if (klass) {
guarded = i.guardedCls;
@@ -8778,7 +8778,7 @@ TranslatorX64::translateFPushClsMethodD(const Tracelet& t,
cls && cls->isStatic());
assert(i.inputs.size() == 0);
const Class* baseClass = Unit::lookupClass(np.second);
const Class* baseClass = Unit::lookupUniqueClass(np.second);
bool magicCall = false;
const Func* func = lookupImmutableMethod(baseClass, meth, magicCall,
true /* staticLookup */);
@@ -9160,7 +9160,7 @@ void TranslatorX64::translateFPushCtorD(const Tracelet& t,
using namespace TargetCache;
int numArgs = i.imm[0].u_IVA;
const StringData* clsName = curUnit()->lookupLitstrId(i.imm[1].u_SA);
Class* cls = Unit::lookupClass(clsName);
Class* cls = Unit::lookupUniqueClass(clsName);
bool fastPath = !RuntimeOption::EnableObjDestructCall &&
classIsPersistent(cls) &&
!(cls->attrs() & (AttrAbstract | AttrInterface | AttrTrait)) &&
@@ -9574,7 +9574,7 @@ TranslatorX64::findCuf(const NormalizedInstruction& ni,
} else if (sclass->isame(s_static.get())) {
return nullptr;
} else {
cls = VM::Unit::lookupClass(sclass);
cls = VM::Unit::lookupUniqueClass(sclass);
if (!cls) return nullptr;
}
@@ -10274,7 +10274,7 @@ TranslatorX64::translateVerifyParamType(const Tracelet& t,
const StringData* clsName;
if (!isSelfOrParent) {
clsName = tc.typeName();
constraint = Unit::lookupClass(clsName);
constraint = Unit::lookupUniqueClass(clsName);
} else {
if (tc.isSelf()) {
tc.selfToClass(curFunc(), &constraint);
@@ -10428,7 +10428,7 @@ TranslatorX64::translateInstanceOfD(const Tracelet& t,
}
const StringData* clsName = curUnit()->lookupLitstrId(i.imm[0].u_SA);
Class* maybeCls = Unit::lookupClass(clsName);
Class* maybeCls = Unit::lookupUniqueClass(clsName);
// maybeInterface is just used as a hint: If it's a trait/interface now but
// a class at runtime, InstanceOfDSlowInterface will still do the right
+5 -5
Ver Arquivo
@@ -681,7 +681,7 @@ getDynLocType(const vector<DynLocation*>& inputs,
if ((op == OpAGetC && inputs[0]->isString())) {
const StringData *sd = inputs[0]->rtt.valueString();
if (sd) {
Class *klass = Unit::lookupClass(sd);
Class *klass = Unit::lookupUniqueClass(sd);
TRACE(3, "KindOfClass: derived class \"%s\" from string literal\n",
klass ? klass->preClass()->name()->data() : "NULL");
return RuntimeType(klass);
@@ -1350,7 +1350,7 @@ void Translator::analyzeSecondPass(Tracelet& t) {
/* new obj with a ctor that takes no args */
const NamedEntityPair& np =
curUnit()->lookupNamedEntityPairId(prev->imm[1].u_SA);
const Class* cls = Unit::lookupClass(np.second);
const Class* cls = Unit::lookupUniqueClass(np.second);
if (cls && (cls->attrs() & AttrUnique) &&
Func::isSpecial(cls->getCtor()->name())) {
/* its the generated 86ctor, so no need to call it */
@@ -1719,8 +1719,8 @@ bool Translator::applyInputMetaData(Unit::MetaHandle& metaHand,
dl->rtt.valueClass() ? dl->rtt.valueClass()->name() : nullptr;
// The two classes might not be exactly the same, which is ok
// as long as metaCls is more derived than rttCls.
Class* metaCls = Unit::lookupClass(metaName);
Class* rttCls = rttName ? Unit::lookupClass(rttName) : nullptr;
Class* metaCls = Unit::lookupUniqueClass(metaName);
Class* rttCls = rttName ? Unit::lookupUniqueClass(rttName) : nullptr;
if (metaCls && rttCls && metaCls != rttCls &&
!metaCls->classof(rttCls)) {
// Runtime type is more derived
@@ -1741,7 +1741,7 @@ bool Translator::applyInputMetaData(Unit::MetaHandle& metaHand,
case Unit::MetaInfo::MVecPropClass: {
const StringData* metaName = ni->unit()->lookupLitstrId(info.m_data);
Class* metaCls = Unit::lookupClass(metaName);
Class* metaCls = Unit::lookupUniqueClass(metaName);
if (metaCls) {
ni->immVecClasses[arg] = metaCls;
}
+4
Ver Arquivo
@@ -502,6 +502,10 @@ struct Unit {
return cls;
}
static Class *lookupUniqueClass(const StringData *clsName) {
return lookupUniqueClass(GetNamedEntity(clsName));
}
static Class *lookupClass(const StringData *clsName) {
Class *cls = *GetNamedEntity(clsName)->clsList();
if (LIKELY(cls != nullptr)) cls = cls->getCached();