diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 7627ee83c5..d5e28abd60 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -7015,23 +7015,44 @@ S32 LLObjectSelection::getNumNodes() return mList.size(); } +// Fix for crash while selecting objects with derendered child prims +bool LLObjectSelection::checkNode(LLSelectNode* nodep) +{ + if(nodep) + { + if(nodep->getObject()) + { + if(!nodep->getObject()->isDead()) + { + return true; + } + else + { + LL_WARNS("LLObjectSelection") << "skipping dead node object" << LL_ENDL; + } + } + else + { + LL_WARNS("LLObjectSelection") << "skipping NULL node object pointer" << LL_ENDL; + } + } + else + { + LL_WARNS("LLObjectSelection") << "skipping NULL node" << LL_ENDL; + } + + mFailedNodesList.push_back(nodep); + LL_WARNS("AddPointer") << "+++***+++ adding pointer " << (U32) nodep << LL_ENDL; + return false; +} + // + void LLObjectSelection::addNode(LLSelectNode *nodep) { // Fix for crash while selecting objects with derendered child prims // llassert_always(nodep->getObject() && !nodep->getObject()->isDead()); - if(!nodep) + if(!checkNode(nodep)) { - LL_WARNS("LLObjectSelection") << "skipping NULL node" << LL_ENDL; - return; - } - else if(!nodep->getObject()) - { - LL_WARNS("LLObjectSelection") << "skipping NULL node object pointer" << LL_ENDL; - return; - } - else if(nodep->getObject()->isDead()) - { - LL_WARNS("LLObjectSelection") << "skipping dead node object" << LL_ENDL; return; } // @@ -7044,19 +7065,8 @@ void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep) { // Fix for crash while selecting objects with derendered child prims // llassert_always(nodep->getObject() && !nodep->getObject()->isDead()); - if(!nodep) + if(!checkNode(nodep)) { - LL_WARNS("LLObjectSelection") << "skipping NULL node" << LL_ENDL; - return; - } - else if(!nodep->getObject()) - { - LL_WARNS("LLObjectSelection") << "skipping NULL node object pointer" << LL_ENDL; - return; - } - else if(nodep->getObject()->isDead()) - { - LL_WARNS("LLObjectSelection") << "skipping dead node object" << LL_ENDL; return; } // @@ -7088,6 +7098,11 @@ void LLObjectSelection::deleteAllNodes() mList.clear(); mSelectNodeMap.clear(); mPrimaryObject = NULL; + + // Fix for crash while selecting objects with derendered child prims + std::for_each(mFailedNodesList.begin(),mFailedNodesList.end(),DeletePointer()); + mFailedNodesList.clear(); + // } LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp) diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index a0dbf100db..417c24dd74 100755 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -380,6 +380,11 @@ private: LLPointer mPrimaryObject; std::map, LLSelectNode*> mSelectNodeMap; ESelectType mSelectType; + + // Fix for crash while selecting objects with derendered child prims + list_t mFailedNodesList; + bool checkNode(LLSelectNode* nodep); + // }; typedef LLSafeHandle LLObjectSelectionHandle;