mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-10-14 07:17:44 +00:00
Don't leak all GUI objects on name ambiguity following 5cc814759f and remove ERROR_GROUP GUI.
Delete CGUI::UpdateObjects and don't recreate the entire object hierarchy by recursing through the existing one each time when inserting one GUI Object. Change CGUI::AddObject to only insert the one relevant pointer into the map hierarchy, return success value and delete the child upon failed insertion in the caller instead of leaking it. Defer GUIM_LOAD and UpdateCachedSize recursion until all XML files linked in the page XML file were loaded. Delete related ERROR_TYPE NameAmbiguity, ObjectNeedsName, and unrelated JSOpenFailed and in consistency with the rest, do the LOGERROR in the scope where the error occurs. Delete ERROR_TYPE InvalidSetting from90f6641c1dunused following85a622b13a,1a49ccb294, ERROR_TYPE OperationNeedsGUIObject from90f6641c1dunused followingd3e56f0f57, see alsoe1014aad3b, refs #128. This was SVN commit r23067.
This commit is contained in:
@@ -71,62 +71,14 @@ IGUIObject::~IGUIObject()
|
||||
|
||||
if (!m_ScriptHandlers.empty())
|
||||
JS_RemoveExtraGCRootsTracer(m_pGUI.GetScriptInterface()->GetJSRuntime(), Trace, this);
|
||||
|
||||
// m_Children is deleted along all other GUI Objects in the CGUI destructor
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Functions
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
void IGUIObject::AddChild(IGUIObject* pChild)
|
||||
void IGUIObject::AddChild(IGUIObject& pChild)
|
||||
{
|
||||
// ENSURE(pChild);
|
||||
|
||||
pChild->SetParent(this);
|
||||
|
||||
m_Children.push_back(pChild);
|
||||
|
||||
{
|
||||
try
|
||||
{
|
||||
// Atomic function, if it fails it won't
|
||||
// have changed anything
|
||||
//UpdateObjects();
|
||||
pChild->GetGUI().UpdateObjects();
|
||||
}
|
||||
catch (PSERROR_GUI&)
|
||||
{
|
||||
// If anything went wrong, reverse what we did and throw
|
||||
// an exception telling it never added a child
|
||||
m_Children.erase(m_Children.end()-1);
|
||||
|
||||
throw;
|
||||
}
|
||||
}
|
||||
// else do nothing
|
||||
}
|
||||
|
||||
void IGUIObject::AddToPointersMap(map_pObjects& ObjectMap)
|
||||
{
|
||||
// Just don't do anything about the top node
|
||||
if (m_pParent == nullptr)
|
||||
return;
|
||||
|
||||
// Now actually add this one
|
||||
// notice we won't add it if it's doesn't have any parent
|
||||
// (i.e. being the base object)
|
||||
if (m_Name.empty())
|
||||
{
|
||||
throw PSERROR_GUI_ObjectNeedsName();
|
||||
}
|
||||
|
||||
if (ObjectMap.find(m_Name) != ObjectMap.end())
|
||||
{
|
||||
throw PSERROR_GUI_NameAmbiguity(m_Name.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
ObjectMap[m_Name] = this;
|
||||
}
|
||||
pChild.SetParent(this);
|
||||
m_Children.push_back(&pChild);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
|
||||
Reference in New Issue
Block a user