If compilation of a prototype member fails, destroy all prototype members
before bailing. Bug 232095, r+sr=bryner git-svn-id: svn://10.0.0.236/trunk@151915 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -172,12 +172,26 @@ nsXBLProtoImpl::CompilePrototypeMembers(nsXBLPrototypeBinding* aBinding)
|
||||
curr;
|
||||
curr = curr->GetNext()) {
|
||||
nsresult rv = curr->CompileMember(context, mClassName, mClassObject);
|
||||
if (NS_FAILED(rv))
|
||||
if (NS_FAILED(rv)) {
|
||||
DestroyMembers(curr);
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsXBLProtoImpl::DestroyMembers(nsXBLProtoImplMember* aBrokenMember)
|
||||
{
|
||||
NS_ASSERTION(mClassObject, "This should never be called when there is no class object");
|
||||
PRBool compiled = PR_TRUE;
|
||||
for (nsXBLProtoImplMember* curr = mMembers; curr; curr = curr->GetNext()) {
|
||||
if (curr == aBrokenMember) {
|
||||
compiled = PR_FALSE;
|
||||
}
|
||||
curr->Destroy(compiled);
|
||||
}
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_NewXBLProtoImpl(nsXBLPrototypeBinding* aBinding,
|
||||
|
||||
@@ -76,6 +76,13 @@ public:
|
||||
|
||||
void SetMemberList(nsXBLProtoImplMember* aMemberList) { delete mMembers; mMembers = aMemberList; };
|
||||
|
||||
protected:
|
||||
// Function to call if compilation of a member fails. When this is called,
|
||||
// all members before aBrokenMember are compiled, compilation of
|
||||
// aBrokenMember failed, and members after aBrokenMember are uncompiled.
|
||||
// This function assumes that aBrokenMember is _not_ compiled.
|
||||
void DestroyMembers(nsXBLProtoImplMember* aBrokenMember);
|
||||
|
||||
public:
|
||||
nsCString mClassName; // The name of the class.
|
||||
void* mClassObject; // The class object for the binding. We'll use this to pre-compile properties
|
||||
|
||||
Reference in New Issue
Block a user