From f3f750b9eb4cbc636a30e8877ff72cabb2047add Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Tue, 27 Jan 2004 21:18:00 +0000 Subject: [PATCH] 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 --- mozilla/content/xbl/src/nsXBLProtoImpl.cpp | 16 +++++++++++++++- mozilla/content/xbl/src/nsXBLProtoImpl.h | 7 +++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/mozilla/content/xbl/src/nsXBLProtoImpl.cpp b/mozilla/content/xbl/src/nsXBLProtoImpl.cpp index 142b22125aa..7abbacf0c6f 100644 --- a/mozilla/content/xbl/src/nsXBLProtoImpl.cpp +++ b/mozilla/content/xbl/src/nsXBLProtoImpl.cpp @@ -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, diff --git a/mozilla/content/xbl/src/nsXBLProtoImpl.h b/mozilla/content/xbl/src/nsXBLProtoImpl.h index 212a69c3b69..38c067305a6 100644 --- a/mozilla/content/xbl/src/nsXBLProtoImpl.h +++ b/mozilla/content/xbl/src/nsXBLProtoImpl.h @@ -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