mirror of
https://github.com/zeux/pugixml.git
synced 2025-01-03 01:55:25 +08:00
Fix _root checking inconsistency in xml_document::destroy
git-svn-id: http://pugixml.googlecode.com/svn/trunk@955 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
parent
888934dac6
commit
48600c3a9d
@ -5220,6 +5220,8 @@ namespace pugi
|
|||||||
|
|
||||||
PUGI__FN void xml_document::create()
|
PUGI__FN void xml_document::create()
|
||||||
{
|
{
|
||||||
|
assert(!_root);
|
||||||
|
|
||||||
// initialize sentinel page
|
// initialize sentinel page
|
||||||
PUGI__STATIC_ASSERT(offsetof(impl::xml_memory_page, data) + sizeof(impl::xml_document_struct) + impl::xml_memory_page_alignment <= sizeof(_memory));
|
PUGI__STATIC_ASSERT(offsetof(impl::xml_memory_page, data) + sizeof(impl::xml_document_struct) + impl::xml_memory_page_alignment <= sizeof(_memory));
|
||||||
|
|
||||||
@ -5242,6 +5244,8 @@ namespace pugi
|
|||||||
|
|
||||||
PUGI__FN void xml_document::destroy()
|
PUGI__FN void xml_document::destroy()
|
||||||
{
|
{
|
||||||
|
assert(_root);
|
||||||
|
|
||||||
// destroy static storage
|
// destroy static storage
|
||||||
if (_buffer)
|
if (_buffer)
|
||||||
{
|
{
|
||||||
@ -5256,28 +5260,19 @@ namespace pugi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// destroy dynamic storage, leave sentinel page (it's in static memory)
|
// destroy dynamic storage, leave sentinel page (it's in static memory)
|
||||||
if (_root)
|
impl::xml_memory_page* root_page = reinterpret_cast<impl::xml_memory_page*>(_root->header & impl::xml_memory_page_pointer_mask);
|
||||||
{
|
assert(root_page && !root_page->prev && !root_page->memory);
|
||||||
impl::xml_memory_page* root_page = reinterpret_cast<impl::xml_memory_page*>(_root->header & impl::xml_memory_page_pointer_mask);
|
|
||||||
assert(root_page && !root_page->prev && !root_page->memory);
|
|
||||||
|
|
||||||
// destroy all pages
|
for (impl::xml_memory_page* page = root_page->next; page; )
|
||||||
for (impl::xml_memory_page* page = root_page->next; page; )
|
{
|
||||||
{
|
impl::xml_memory_page* next = page->next;
|
||||||
impl::xml_memory_page* next = page->next;
|
|
||||||
|
|
||||||
impl::xml_allocator::deallocate_page(page);
|
impl::xml_allocator::deallocate_page(page);
|
||||||
|
|
||||||
page = next;
|
page = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
// cleanup root page
|
_root = 0;
|
||||||
root_page->allocator = 0;
|
|
||||||
root_page->next = 0;
|
|
||||||
root_page->busy_size = root_page->freed_size = 0;
|
|
||||||
|
|
||||||
_root = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PUGIXML_NO_STL
|
#ifndef PUGIXML_NO_STL
|
||||||
@ -5403,6 +5398,8 @@ namespace pugi
|
|||||||
|
|
||||||
PUGI__FN xml_node xml_document::document_element() const
|
PUGI__FN xml_node xml_document::document_element() const
|
||||||
{
|
{
|
||||||
|
assert(_root);
|
||||||
|
|
||||||
for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
|
for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
|
||||||
if ((i->header & impl::xml_memory_page_type_mask) + 1 == node_element)
|
if ((i->header & impl::xml_memory_page_type_mask) + 1 == node_element)
|
||||||
return xml_node(i);
|
return xml_node(i);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user