Bug 602341 part 3. Get rid of the mAtom member of nsPseudoClassList. r=dbaron

This commit is contained in:
Boris Zbarsky 2011-03-23 09:52:25 -04:00
parent f677f9d256
commit 8cdfaea14d
4 changed files with 33 additions and 34 deletions

View File

@ -134,10 +134,8 @@ nsAtomList::~nsAtomList(void)
NS_CSS_DELETE_LIST_MEMBER(nsAtomList, this, mNext); NS_CSS_DELETE_LIST_MEMBER(nsAtomList, this, mNext);
} }
nsPseudoClassList::nsPseudoClassList(nsIAtom* aAtom, nsPseudoClassList::nsPseudoClassList(nsCSSPseudoClasses::Type aType)
nsCSSPseudoClasses::Type aType) : mType(aType),
: mAtom(aAtom),
mType(aType),
mNext(nsnull) mNext(nsnull)
{ {
NS_ASSERTION(!nsCSSPseudoClasses::HasStringArg(aType) && NS_ASSERTION(!nsCSSPseudoClasses::HasStringArg(aType) &&
@ -147,11 +145,9 @@ nsPseudoClassList::nsPseudoClassList(nsIAtom* aAtom,
u.mMemory = nsnull; u.mMemory = nsnull;
} }
nsPseudoClassList::nsPseudoClassList(nsIAtom* aAtom, nsPseudoClassList::nsPseudoClassList(nsCSSPseudoClasses::Type aType,
nsCSSPseudoClasses::Type aType,
const PRUnichar* aString) const PRUnichar* aString)
: mAtom(aAtom), : mType(aType),
mType(aType),
mNext(nsnull) mNext(nsnull)
{ {
NS_ASSERTION(nsCSSPseudoClasses::HasStringArg(aType), NS_ASSERTION(nsCSSPseudoClasses::HasStringArg(aType),
@ -161,11 +157,9 @@ nsPseudoClassList::nsPseudoClassList(nsIAtom* aAtom,
u.mString = NS_strdup(aString); u.mString = NS_strdup(aString);
} }
nsPseudoClassList::nsPseudoClassList(nsIAtom* aAtom, nsPseudoClassList::nsPseudoClassList(nsCSSPseudoClasses::Type aType,
nsCSSPseudoClasses::Type aType,
const PRInt32* aIntPair) const PRInt32* aIntPair)
: mAtom(aAtom), : mType(aType),
mType(aType),
mNext(nsnull) mNext(nsnull)
{ {
NS_ASSERTION(nsCSSPseudoClasses::HasNthPairArg(aType), NS_ASSERTION(nsCSSPseudoClasses::HasNthPairArg(aType),
@ -177,11 +171,9 @@ nsPseudoClassList::nsPseudoClassList(nsIAtom* aAtom,
} }
// adopts aSelectorList // adopts aSelectorList
nsPseudoClassList::nsPseudoClassList(nsIAtom* aAtom, nsPseudoClassList::nsPseudoClassList(nsCSSPseudoClasses::Type aType,
nsCSSPseudoClasses::Type aType,
nsCSSSelectorList* aSelectorList) nsCSSSelectorList* aSelectorList)
: mAtom(aAtom), : mType(aType),
mType(aType),
mNext(nsnull) mNext(nsnull)
{ {
NS_ASSERTION(nsCSSPseudoClasses::HasSelectorListArg(aType), NS_ASSERTION(nsCSSPseudoClasses::HasSelectorListArg(aType),
@ -196,16 +188,16 @@ nsPseudoClassList::Clone(PRBool aDeep) const
{ {
nsPseudoClassList *result; nsPseudoClassList *result;
if (!u.mMemory) { if (!u.mMemory) {
result = new nsPseudoClassList(mAtom, mType); result = new nsPseudoClassList(mType);
} else if (nsCSSPseudoClasses::HasStringArg(mType)) { } else if (nsCSSPseudoClasses::HasStringArg(mType)) {
result = new nsPseudoClassList(mAtom, mType, u.mString); result = new nsPseudoClassList(mType, u.mString);
} else if (nsCSSPseudoClasses::HasNthPairArg(mType)) { } else if (nsCSSPseudoClasses::HasNthPairArg(mType)) {
result = new nsPseudoClassList(mAtom, mType, u.mNumbers); result = new nsPseudoClassList(mType, u.mNumbers);
} else { } else {
NS_ASSERTION(nsCSSPseudoClasses::HasSelectorListArg(mType), NS_ASSERTION(nsCSSPseudoClasses::HasSelectorListArg(mType),
"unexpected pseudo-class"); "unexpected pseudo-class");
// This constructor adopts its selector list argument. // This constructor adopts its selector list argument.
result = new nsPseudoClassList(mAtom, mType, u.mSelectors->Clone()); result = new nsPseudoClassList(mType, u.mSelectors->Clone());
} }
if (aDeep) if (aDeep)
@ -422,21 +414,21 @@ void nsCSSSelector::AddClass(const nsString& aClass)
void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass, void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass,
nsCSSPseudoClasses::Type aType) nsCSSPseudoClasses::Type aType)
{ {
AddPseudoClassInternal(new nsPseudoClassList(aPseudoClass, aType)); AddPseudoClassInternal(new nsPseudoClassList(aType));
} }
void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass, void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass,
nsCSSPseudoClasses::Type aType, nsCSSPseudoClasses::Type aType,
const PRUnichar* aString) const PRUnichar* aString)
{ {
AddPseudoClassInternal(new nsPseudoClassList(aPseudoClass, aType, aString)); AddPseudoClassInternal(new nsPseudoClassList(aType, aString));
} }
void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass, void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass,
nsCSSPseudoClasses::Type aType, nsCSSPseudoClasses::Type aType,
const PRInt32* aIntPair) const PRInt32* aIntPair)
{ {
AddPseudoClassInternal(new nsPseudoClassList(aPseudoClass, aType, aIntPair)); AddPseudoClassInternal(new nsPseudoClassList(aType, aIntPair));
} }
void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass, void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass,
@ -444,8 +436,7 @@ void nsCSSSelector::AddPseudoClass(nsIAtom* aPseudoClass,
nsCSSSelectorList* aSelectorList) nsCSSSelectorList* aSelectorList)
{ {
// Take ownership of nsCSSSelectorList instead of copying. // Take ownership of nsCSSSelectorList instead of copying.
AddPseudoClassInternal(new nsPseudoClassList(aPseudoClass, aType, AddPseudoClassInternal(new nsPseudoClassList(aType, aSelectorList));
aSelectorList));
} }
void nsCSSSelector::AddPseudoClassInternal(nsPseudoClassList *aPseudoClass) void nsCSSSelector::AddPseudoClassInternal(nsPseudoClassList *aPseudoClass)
@ -768,7 +759,7 @@ nsCSSSelector::AppendToStringWithoutCombinatorsOrNegations
aString.Append(PRUnichar('(')); aString.Append(PRUnichar('('));
for (nsPseudoClassList* list = mPseudoClassList; list; for (nsPseudoClassList* list = mPseudoClassList; list;
list = list->mNext) { list = list->mNext) {
list->mAtom->ToString(temp); nsCSSPseudoClasses::PseudoTypeToString(list->mType, temp);
nsStyleUtil::AppendEscapedCSSIdent(temp, aString); nsStyleUtil::AppendEscapedCSSIdent(temp, aString);
NS_ABORT_IF_FALSE(!list->u.mMemory, "data not expected"); NS_ABORT_IF_FALSE(!list->u.mMemory, "data not expected");
aString.Append(PRUnichar(',')); aString.Append(PRUnichar(','));
@ -781,7 +772,7 @@ nsCSSSelector::AppendToStringWithoutCombinatorsOrNegations
#endif #endif
} else { } else {
for (nsPseudoClassList* list = mPseudoClassList; list; list = list->mNext) { for (nsPseudoClassList* list = mPseudoClassList; list; list = list->mNext) {
list->mAtom->ToString(temp); nsCSSPseudoClasses::PseudoTypeToString(list->mType, temp);
// This should not be escaped since (a) the pseudo-class string // This should not be escaped since (a) the pseudo-class string
// has a ":" that can't be escaped and (b) all pseudo-classes at // has a ":" that can't be escaped and (b) all pseudo-classes at
// this point are known, and therefore we know they don't need // this point are known, and therefore we know they don't need

View File

@ -80,19 +80,16 @@ private:
struct nsPseudoClassList { struct nsPseudoClassList {
public: public:
nsPseudoClassList(nsIAtom* aAtom, nsCSSPseudoClasses::Type aType); nsPseudoClassList(nsCSSPseudoClasses::Type aType);
nsPseudoClassList(nsIAtom* aAtom, nsCSSPseudoClasses::Type aType, nsPseudoClassList(nsCSSPseudoClasses::Type aType, const PRUnichar *aString);
const PRUnichar *aString); nsPseudoClassList(nsCSSPseudoClasses::Type aType, const PRInt32 *aIntPair);
nsPseudoClassList(nsIAtom* aAtom, nsCSSPseudoClasses::Type aType, nsPseudoClassList(nsCSSPseudoClasses::Type aType,
const PRInt32 *aIntPair);
nsPseudoClassList(nsIAtom* aAtom, nsCSSPseudoClasses::Type aType,
nsCSSSelectorList *aSelectorList /* takes ownership */); nsCSSSelectorList *aSelectorList /* takes ownership */);
~nsPseudoClassList(void); ~nsPseudoClassList(void);
/** Do a deep clone. Should be used only on the first in the linked list. */ /** Do a deep clone. Should be used only on the first in the linked list. */
nsPseudoClassList* Clone() const { return Clone(PR_TRUE); } nsPseudoClassList* Clone() const { return Clone(PR_TRUE); }
nsCOMPtr<nsIAtom> mAtom;
union { union {
// For a given value of mType, we have either: // For a given value of mType, we have either:
// a. no value, which means mMemory is always null // a. no value, which means mMemory is always null

View File

@ -85,6 +85,14 @@ nsCSSPseudoClasses::HasNthPairArg(Type aType)
aType == ePseudoClass_nthLastOfType; aType == ePseudoClass_nthLastOfType;
} }
void
nsCSSPseudoClasses::PseudoTypeToString(Type aType, nsAString& aString)
{
NS_ABORT_IF_FALSE(aType < ePseudoClass_Count, "Unexpected type");
NS_ABORT_IF_FALSE(aType >= 0, "Very unexpected type");
(*CSSPseudoClasses_info[aType].mAtom)->ToString(aString);
}
nsCSSPseudoClasses::Type nsCSSPseudoClasses::Type
nsCSSPseudoClasses::GetPseudoType(nsIAtom* aAtom) nsCSSPseudoClasses::GetPseudoType(nsIAtom* aAtom)
{ {

View File

@ -72,6 +72,9 @@ public:
static PRBool HasSelectorListArg(Type aType) { static PRBool HasSelectorListArg(Type aType) {
return aType == ePseudoClass_any; return aType == ePseudoClass_any;
} }
// Should only be used on types other than Count and NotPseudoClass
static void PseudoTypeToString(Type aType, nsAString& aString);
}; };
#endif /* nsCSSPseudoClasses_h___ */ #endif /* nsCSSPseudoClasses_h___ */