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:
bzbarsky%mit.edu
2004-01-27 21:18:00 +00:00
parent 989edcf891
commit f3f750b9eb
2 changed files with 22 additions and 1 deletions

View File

@@ -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,

View File

@@ -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