Remove m_importMethToTraitMap from Class.

Its a temporary structure thats just used to help build the class.
Use it a local instead.
Esse commit está contido em:
mwilliams
2013-06-15 12:41:21 -07:00
commit de Sara Golemon
commit 3a6c6c286e
2 arquivos alterados com 42 adições e 39 exclusões
+32 -30
Ver Arquivo
@@ -1285,15 +1285,15 @@ void Class::setSpecial() {
(AttrPublic|AttrNoInjection|AttrPhpLeafFn));
}
void Class::applyTraitPrecRule(const PreClass::TraitPrecRule& rule) {
void Class::applyTraitPrecRule(const PreClass::TraitPrecRule& rule,
MethodToTraitListMap& importMethToTraitMap) {
const StringData* methName = rule.getMethodName();
const StringData* selectedTraitName = rule.getSelectedTraitName();
TraitNameSet otherTraitNames;
rule.getOtherTraitNames(otherTraitNames);
MethodToTraitListMap::iterator methIter =
m_importMethToTraitMap.find(methName);
if (methIter == m_importMethToTraitMap.end()) {
auto methIter = importMethToTraitMap.find(methName);
if (methIter == importMethToTraitMap.end()) {
raise_error("unknown method '%s'", methName->data());
}
@@ -1337,11 +1337,9 @@ ClassPtr Class::findSingleTraitWithMethod(const StringData* methName) {
return traitCls;
}
void Class::setImportTraitMethodModifiers(const StringData* methName,
ClassPtr traitCls,
Attr modifiers) {
TraitMethodList &methList = m_importMethToTraitMap[methName];
void Class::setImportTraitMethodModifiers(TraitMethodList& methList,
ClassPtr traitCls,
Attr modifiers) {
for (TraitMethodList::iterator iter = methList.begin();
iter != methList.end(); iter++) {
if (iter->m_trait.get() == traitCls.get()) {
@@ -1364,7 +1362,8 @@ void Class::addTraitAlias(const StringData* traitName,
(newMethName, origName));
}
void Class::applyTraitAliasRule(const PreClass::TraitAliasRule& rule) {
void Class::applyTraitAliasRule(const PreClass::TraitAliasRule& rule,
MethodToTraitListMap& importMethToTraitMap) {
const StringData* traitName = rule.getTraitName();
const StringData* origMethName = rule.getOrigMethodName();
const StringData* newMethName = rule.getNewMethodName();
@@ -1391,30 +1390,28 @@ void Class::applyTraitAliasRule(const PreClass::TraitAliasRule& rule) {
Attr ruleModifiers;
if (origMethName == newMethName) {
ruleModifiers = rule.getModifiers();
setImportTraitMethodModifiers(origMethName, traitCls, ruleModifiers);
setImportTraitMethodModifiers(importMethToTraitMap[origMethName],
traitCls, ruleModifiers);
} else {
ruleModifiers = rule.getModifiers();
TraitMethod traitMethod(traitCls, traitMeth, ruleModifiers);
addImportTraitMethod(traitMethod, newMethName);
if (!Func::isSpecial(newMethName)) {
importMethToTraitMap[newMethName].push_back(traitMethod);
}
}
if (ruleModifiers & AttrStatic) {
raise_error("cannot use 'static' as access modifier");
}
}
void Class::applyTraitRules() {
void Class::applyTraitRules(MethodToTraitListMap& importMethToTraitMap) {
for (size_t i = 0; i < m_preClass->traitPrecRules().size(); i++) {
applyTraitPrecRule(m_preClass->traitPrecRules()[i]);
applyTraitPrecRule(m_preClass->traitPrecRules()[i],
importMethToTraitMap);
}
for (size_t i = 0; i < m_preClass->traitAliasRules().size(); i++) {
applyTraitAliasRule(m_preClass->traitAliasRules()[i]);
}
}
void Class::addImportTraitMethod(const TraitMethod &traitMethod,
const StringData *methName) {
if (!Func::isSpecial(methName)) {
m_importMethToTraitMap[methName].push_back(traitMethod);
applyTraitAliasRule(m_preClass->traitAliasRules()[i],
importMethToTraitMap);
}
}
@@ -1485,10 +1482,11 @@ void Class::importTraitMethod(const TraitMethod& traitMethod,
// This method removes trait abstract methods that are either:
// 1) implemented by other traits
// 2) duplicate
void Class::removeSpareTraitAbstractMethods() {
void Class::removeSpareTraitAbstractMethods(
MethodToTraitListMap& importMethToTraitMap) {
for (MethodToTraitListMap::iterator iter = m_importMethToTraitMap.begin();
iter != m_importMethToTraitMap.end(); iter++) {
for (MethodToTraitListMap::iterator iter = importMethToTraitMap.begin();
iter != importMethToTraitMap.end(); iter++) {
TraitMethodList& tMethList = iter->second;
bool hasNonAbstractMeth = false;
@@ -1520,6 +1518,8 @@ void Class::removeSpareTraitAbstractMethods() {
// fatals on error
void Class::importTraitMethods(MethodMap::Builder& builder) {
MethodToTraitListMap importMethToTraitMap;
// 1. Find all methods to be imported
for (size_t t = 0; t < m_usedTraits.size(); t++) {
ClassPtr trait = m_usedTraits[t];
@@ -1527,20 +1527,22 @@ void Class::importTraitMethods(MethodMap::Builder& builder) {
Func* method = trait->m_methods[i];
const StringData* methName = method->name();
TraitMethod traitMethod(trait, method, method->attrs());
addImportTraitMethod(traitMethod, methName);
if (!Func::isSpecial(methName)) {
importMethToTraitMap[methName].push_back(traitMethod);
}
}
}
// 2. Apply trait rules
applyTraitRules();
applyTraitRules(importMethToTraitMap);
// 3. Remove abstract methods provided by other traits, and also duplicates
removeSpareTraitAbstractMethods();
removeSpareTraitAbstractMethods(importMethToTraitMap);
// 4. Actually import the methods
for (MethodToTraitListMap::const_iterator iter =
m_importMethToTraitMap.begin();
iter != m_importMethToTraitMap.end(); iter++) {
importMethToTraitMap.begin();
iter != importMethToTraitMap.end(); iter++) {
// The rules may rule out a method from all traits.
// In this case, simply don't import the method.
+10 -9
Ver Arquivo
@@ -891,20 +891,20 @@ private:
TypedValue* getSPropData() const;
TypedValue* cnsNameToTV(const StringData* name, Slot& slot) const;
void addImportTraitMethod(const TraitMethod &traitMethod,
const StringData *methName);
void importTraitMethod(const TraitMethod& traitMethod,
const StringData* methName,
MethodMap::Builder& curMethodMap);
ClassPtr findSingleTraitWithMethod(const StringData* methName);
void setImportTraitMethodModifiers(const StringData* methName,
ClassPtr traitCls,
Attr modifiers);
void setImportTraitMethodModifiers(TraitMethodList& methList,
ClassPtr traitCls,
Attr modifiers);
void importTraitMethods(MethodMap::Builder& curMethodMap);
void addTraitPropInitializers(bool staticProps);
void applyTraitRules();
void applyTraitPrecRule(const PreClass::TraitPrecRule& rule);
void applyTraitAliasRule(const PreClass::TraitAliasRule& rule);
void applyTraitRules(MethodToTraitListMap& importMethToTraitMap);
void applyTraitPrecRule(const PreClass::TraitPrecRule& rule,
MethodToTraitListMap& importMethToTraitMap);
void applyTraitAliasRule(const PreClass::TraitAliasRule& rule,
MethodToTraitListMap& importMethToTraitMap);
void importTraitProps(PropMap::Builder& curPropMap,
SPropMap::Builder& curSPropMap);
void importTraitInstanceProp(ClassPtr trait,
@@ -923,7 +923,8 @@ private:
void methodOverrideCheck(const Func* parentMethod, const Func* method);
static bool compatibleTraitPropInit(TypedValue& tv1, TypedValue& tv2);
void removeSpareTraitAbstractMethods();
void removeSpareTraitAbstractMethods(
MethodToTraitListMap& importMethToTraitMap);
void setParent();
void setSpecial();