diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 7ecbf86..040a2a1 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -638,6 +638,7 @@ void XMLNode::Unlink( XMLNode* child ) if ( child->_next ) { child->_next->_prev = child->_prev; } + child->_parent = 0; } @@ -652,10 +653,12 @@ XMLNode* XMLNode::InsertEndChild( XMLNode* addThis ) { if (addThis->_document != _document) return 0; + if (addThis->_parent) addThis->_parent->Unlink( addThis ); else addThis->_memPool->SetTracked(); + if ( _lastChild ) { TIXMLASSERT( _firstChild ); TIXMLASSERT( _lastChild->_next == 0 ); @@ -681,10 +684,12 @@ XMLNode* XMLNode::InsertFirstChild( XMLNode* addThis ) { if (addThis->_document != _document) return 0; + if (addThis->_parent) addThis->_parent->Unlink( addThis ); else addThis->_memPool->SetTracked(); + if ( _firstChild ) { TIXMLASSERT( _lastChild ); TIXMLASSERT( _firstChild->_prev == 0 ); @@ -711,7 +716,9 @@ XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ) { if (addThis->_document != _document) return 0; + TIXMLASSERT( afterThis->_parent == this ); + if ( afterThis->_parent != this ) { return 0; } diff --git a/xmltest.cpp b/xmltest.cpp index 80e42ea..533bcba 100644 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -1254,7 +1254,7 @@ int main( int argc, const char ** argv ) doc.RootElement()->InsertAfterChild(two, subtree); XMLPrinter printer2( 0, true ); doc.Accept( &printer2 ); - XMLTest( "Move node from within after ", xmlAfterTwo, printer2.CStr()); + XMLTest( "Move node from within after ", xmlAfterTwo, printer2.CStr(), false ); doc.Parse( xml ); XMLNode* one = doc.RootElement()->FirstChildElement("one"); @@ -1262,7 +1262,7 @@ int main( int argc, const char ** argv ) doc.RootElement()->InsertAfterChild(one, subtree); XMLPrinter printer3( 0, true ); doc.Accept( &printer3 ); - XMLTest( "Move node from within after ", xmlAfterOne, printer3.CStr()); + XMLTest( "Move node from within after ", xmlAfterOne, printer3.CStr(), false ); doc.Parse( xml ); subtree = doc.RootElement()->FirstChildElement("one")->FirstChildElement("subtree"); @@ -1270,7 +1270,7 @@ int main( int argc, const char ** argv ) doc.RootElement()->InsertEndChild(subtree); XMLPrinter printer4( 0, true ); doc.Accept( &printer4 ); - XMLTest( "Move node from within after ", xmlAfterTwo, printer4.CStr()); + XMLTest( "Move node from within after ", xmlAfterTwo, printer4.CStr(), false ); } // ----------- Performance tracking --------------