Cleanup before merge
This commit is contained in:
parent
b1965061af
commit
9597265a12
123
src/pugixml.cpp
123
src/pugixml.cpp
@ -430,11 +430,11 @@ PUGI__NS_BEGIN
|
|||||||
static const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_contents_shared_mask;
|
static const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_contents_shared_mask;
|
||||||
static const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_contents_shared_mask;
|
static const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_contents_shared_mask;
|
||||||
|
|
||||||
#ifdef PUGIXML_COMPACT
|
#ifdef PUGIXML_COMPACT
|
||||||
#define PUGI__GETPAGE_IMPL(header) (header).get_page()
|
#define PUGI__GETPAGE_IMPL(header) (header).get_page()
|
||||||
#else
|
#else
|
||||||
#define PUGI__GETPAGE_IMPL(header) reinterpret_cast<impl::xml_memory_page*>((header) & impl::xml_memory_page_pointer_mask)
|
#define PUGI__GETPAGE_IMPL(header) reinterpret_cast<impl::xml_memory_page*>((header) & impl::xml_memory_page_pointer_mask)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PUGI__GETPAGE(n) PUGI__GETPAGE_IMPL((n)->header)
|
#define PUGI__GETPAGE(n) PUGI__GETPAGE_IMPL((n)->header)
|
||||||
#define PUGI__NODETYPE(n) static_cast<xml_node_type>(((n)->header & impl::xml_memory_page_type_mask) + 1)
|
#define PUGI__NODETYPE(n) static_cast<xml_node_type>(((n)->header & impl::xml_memory_page_type_mask) + 1)
|
||||||
@ -539,6 +539,44 @@ PUGI__NS_BEGIN
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PUGIXML_COMPACT
|
||||||
|
void* allocate_object(size_t size, xml_memory_page*& out_page)
|
||||||
|
{
|
||||||
|
void* result = allocate_memory(size + sizeof(uint32_t), out_page);
|
||||||
|
if (!result) return 0;
|
||||||
|
|
||||||
|
// adjust for marker
|
||||||
|
ptrdiff_t offset = static_cast<char*>(result) - reinterpret_cast<char*>(out_page->compact_page_marker);
|
||||||
|
|
||||||
|
if (PUGI__UNLIKELY(static_cast<uintptr_t>(offset) >= 256 * xml_memory_block_alignment))
|
||||||
|
{
|
||||||
|
// insert new marker
|
||||||
|
uint32_t* marker = static_cast<uint32_t*>(result);
|
||||||
|
|
||||||
|
*marker = static_cast<uint32_t>(reinterpret_cast<char*>(marker) - reinterpret_cast<char*>(out_page));
|
||||||
|
out_page->compact_page_marker = marker;
|
||||||
|
|
||||||
|
// since we don't reuse the page space until we reallocate it, we can just pretend that we freed the marker block
|
||||||
|
// this will make sure deallocate_memory correctly tracks the size
|
||||||
|
out_page->freed_size += sizeof(uint32_t);
|
||||||
|
|
||||||
|
return marker + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// roll back uint32_t part
|
||||||
|
_busy_size -= sizeof(uint32_t);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void* allocate_object(size_t size, xml_memory_page*& out_page)
|
||||||
|
{
|
||||||
|
return allocate_memory(size, out_page);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void deallocate_memory(void* ptr, size_t size, xml_memory_page* page)
|
void deallocate_memory(void* ptr, size_t size, xml_memory_page* page)
|
||||||
{
|
{
|
||||||
if (page == _root) page->busy_size = _busy_size;
|
if (page == _root) page->busy_size = _busy_size;
|
||||||
@ -679,13 +717,13 @@ PUGI__NS_BEGIN
|
|||||||
// the last page is not deleted even if it's empty (see deallocate_memory)
|
// the last page is not deleted even if it's empty (see deallocate_memory)
|
||||||
assert(_root->prev);
|
assert(_root->prev);
|
||||||
|
|
||||||
page->busy_size = size;
|
|
||||||
|
|
||||||
page->prev = _root->prev;
|
page->prev = _root->prev;
|
||||||
page->next = _root;
|
page->next = _root;
|
||||||
|
|
||||||
_root->prev->next = page;
|
_root->prev->next = page;
|
||||||
_root->prev = page;
|
_root->prev = page;
|
||||||
|
|
||||||
|
page->busy_size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
return reinterpret_cast<char*>(page) + sizeof(xml_memory_page);
|
return reinterpret_cast<char*>(page) + sizeof(xml_memory_page);
|
||||||
@ -705,7 +743,7 @@ PUGI__NS_BEGIN
|
|||||||
PUGI__STATIC_ASSERT(xml_memory_block_alignment == compact_alignment);
|
PUGI__STATIC_ASSERT(xml_memory_block_alignment == compact_alignment);
|
||||||
|
|
||||||
ptrdiff_t offset = (reinterpret_cast<char*>(this) - reinterpret_cast<char*>(page->compact_page_marker));
|
ptrdiff_t offset = (reinterpret_cast<char*>(this) - reinterpret_cast<char*>(page->compact_page_marker));
|
||||||
assert(static_cast<uintptr_t>(offset) < 256 * compact_alignment);
|
assert(offset % compact_alignment == 0 && static_cast<uintptr_t>(offset) < 256 * compact_alignment);
|
||||||
|
|
||||||
_page = static_cast<unsigned char>(offset >> compact_alignment_log2);
|
_page = static_cast<unsigned char>(offset >> compact_alignment_log2);
|
||||||
_flags = static_cast<unsigned char>(flags);
|
_flags = static_cast<unsigned char>(flags);
|
||||||
@ -772,8 +810,8 @@ PUGI__NS_BEGIN
|
|||||||
{
|
{
|
||||||
if (value)
|
if (value)
|
||||||
{
|
{
|
||||||
// value is guaranteed to be compact-aligned; this is not
|
// value is guaranteed to be compact-aligned; 'this' is not
|
||||||
// our decoding is based on this aligned to compact alignment downwards (see operator T*)
|
// our decoding is based on 'this' aligned to compact alignment downwards (see operator T*)
|
||||||
// so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to
|
// so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to
|
||||||
// compensate for arithmetic shift rounding for negative values
|
// compensate for arithmetic shift rounding for negative values
|
||||||
ptrdiff_t diff = reinterpret_cast<char*>(value) - reinterpret_cast<char*>(this);
|
ptrdiff_t diff = reinterpret_cast<char*>(value) - reinterpret_cast<char*>(this);
|
||||||
@ -834,8 +872,8 @@ PUGI__NS_BEGIN
|
|||||||
{
|
{
|
||||||
if (value)
|
if (value)
|
||||||
{
|
{
|
||||||
// value is guaranteed to be compact-aligned; this is not
|
// value is guaranteed to be compact-aligned; 'this' is not
|
||||||
// our decoding is based on this aligned to compact alignment downwards (see operator T*)
|
// our decoding is based on 'this' aligned to compact alignment downwards (see operator T*)
|
||||||
// so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to
|
// so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to
|
||||||
// compensate for arithmetic shift behavior for negative values
|
// compensate for arithmetic shift behavior for negative values
|
||||||
ptrdiff_t diff = reinterpret_cast<char*>(value) - reinterpret_cast<char*>(this);
|
ptrdiff_t diff = reinterpret_cast<char*>(value) - reinterpret_cast<char*>(this);
|
||||||
@ -934,7 +972,7 @@ PUGI__NS_BEGIN
|
|||||||
{
|
{
|
||||||
ptrdiff_t remainder = offset - ((*base - 1) << 7);
|
ptrdiff_t remainder = offset - ((*base - 1) << 7);
|
||||||
|
|
||||||
if (static_cast<uintptr_t>(remainder) < 254)
|
if (static_cast<uintptr_t>(remainder) <= 253)
|
||||||
{
|
{
|
||||||
_data = static_cast<unsigned char>(remainder + 1);
|
_data = static_cast<unsigned char>(remainder + 1);
|
||||||
}
|
}
|
||||||
@ -1117,46 +1155,10 @@ PUGI__NS_END
|
|||||||
|
|
||||||
// Low-level DOM operations
|
// Low-level DOM operations
|
||||||
PUGI__NS_BEGIN
|
PUGI__NS_BEGIN
|
||||||
#ifdef PUGIXML_COMPACT
|
|
||||||
inline void* allocate_object(xml_allocator& alloc, size_t size, xml_memory_page*& out_page)
|
|
||||||
{
|
|
||||||
void* result = alloc.allocate_memory(size + sizeof(uint32_t), out_page);
|
|
||||||
if (!result) return 0;
|
|
||||||
|
|
||||||
// adjust for marker
|
|
||||||
if (PUGI__UNLIKELY(static_cast<uintptr_t>(static_cast<char*>(result) - reinterpret_cast<char*>(out_page->compact_page_marker)) >= 256 * compact_alignment))
|
|
||||||
{
|
|
||||||
// insert new marker
|
|
||||||
uint32_t* marker = static_cast<uint32_t*>(result);
|
|
||||||
|
|
||||||
*marker = static_cast<uint32_t>(reinterpret_cast<char*>(marker) - reinterpret_cast<char*>(out_page));
|
|
||||||
out_page->compact_page_marker = marker;
|
|
||||||
|
|
||||||
// since we don't reuse the page space until we reallocate it, we can just pretend that we freed the marker block
|
|
||||||
// this will make sure deallocate_memory correctly tracks the size
|
|
||||||
out_page->freed_size += sizeof(uint32_t);
|
|
||||||
|
|
||||||
return marker + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// roll back uint32_t part
|
|
||||||
alloc._busy_size -= sizeof(uint32_t);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
inline void* allocate_object(xml_allocator& alloc, size_t size, xml_memory_page*& out_page)
|
|
||||||
{
|
|
||||||
return alloc.allocate_memory(size, out_page);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inline xml_attribute_struct* allocate_attribute(xml_allocator& alloc)
|
inline xml_attribute_struct* allocate_attribute(xml_allocator& alloc)
|
||||||
{
|
{
|
||||||
xml_memory_page* page;
|
xml_memory_page* page;
|
||||||
void* memory = allocate_object(alloc, sizeof(xml_attribute_struct), page);
|
void* memory = alloc.allocate_object(sizeof(xml_attribute_struct), page);
|
||||||
|
|
||||||
return new (memory) xml_attribute_struct(page);
|
return new (memory) xml_attribute_struct(page);
|
||||||
}
|
}
|
||||||
@ -1164,7 +1166,7 @@ PUGI__NS_BEGIN
|
|||||||
inline xml_node_struct* allocate_node(xml_allocator& alloc, xml_node_type type)
|
inline xml_node_struct* allocate_node(xml_allocator& alloc, xml_node_type type)
|
||||||
{
|
{
|
||||||
xml_memory_page* page;
|
xml_memory_page* page;
|
||||||
void* memory = allocate_object(alloc, sizeof(xml_node_struct), page);
|
void* memory = alloc.allocate_object(sizeof(xml_node_struct), page);
|
||||||
|
|
||||||
return new (memory) xml_node_struct(page, type);
|
return new (memory) xml_node_struct(page, type);
|
||||||
}
|
}
|
||||||
@ -6174,19 +6176,26 @@ namespace pugi
|
|||||||
// we can determine the offset reliably only if there is exactly once parse buffer
|
// we can determine the offset reliably only if there is exactly once parse buffer
|
||||||
if (!doc.buffer || doc.extra_buffers) return -1;
|
if (!doc.buffer || doc.extra_buffers) return -1;
|
||||||
|
|
||||||
// document node always has an offset of 0
|
switch (type())
|
||||||
if (_root == &doc) return 0;
|
{
|
||||||
|
case node_document:
|
||||||
|
return 0;
|
||||||
|
|
||||||
// we need contents to be inside buffer and not shared
|
case node_element:
|
||||||
// if it's shared we don't know if this is the original node
|
case node_declaration:
|
||||||
if (_root->name && (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0)
|
case node_pi:
|
||||||
return _root->name - doc.buffer;
|
return _root->name && (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0 ? _root->name - doc.buffer : -1;
|
||||||
|
|
||||||
if (_root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0)
|
case node_pcdata:
|
||||||
return _root->value - doc.buffer;
|
case node_cdata:
|
||||||
|
case node_comment:
|
||||||
|
case node_doctype:
|
||||||
|
return _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1;
|
||||||
|
|
||||||
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
#ifdef __BORLANDC__
|
||||||
PUGI__FN bool operator&&(const xml_node& lhs, bool rhs)
|
PUGI__FN bool operator&&(const xml_node& lhs, bool rhs)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user