diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pugixml.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 033bf13..1a7acb3 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -679,13 +679,13 @@ PUGI__NS_BEGIN // the last page is not deleted even if it's empty (see deallocate_memory) assert(_root->prev); + page->busy_size = size; + page->prev = _root->prev; page->next = _root; _root->prev->next = page; _root->prev = page; - - page->busy_size = size; } return reinterpret_cast<char*>(page) + sizeof(xml_memory_page); @@ -703,10 +703,9 @@ PUGI__NS_BEGIN compact_header(xml_memory_page* page, unsigned int flags) { PUGI__STATIC_ASSERT(xml_memory_block_alignment == compact_alignment); - PUGI__STATIC_ASSERT(sizeof(xml_memory_page) + xml_memory_page_size <= (1 << (16 + compact_alignment_log2))); ptrdiff_t offset = (reinterpret_cast<char*>(this) - reinterpret_cast<char*>(page->compact_page_marker)); - assert(offset >= 0 && offset < 256 << compact_alignment_log2); + assert(static_cast<uintptr_t>(offset) < 256 * compact_alignment); _page = static_cast<unsigned char>(offset >> compact_alignment_log2); _flags = static_cast<unsigned char>(flags); @@ -730,8 +729,9 @@ PUGI__NS_BEGIN xml_memory_page* get_page() const { const char* page_marker = reinterpret_cast<const char*>(this) - (_page << compact_alignment_log2); + const char* page = page_marker - *reinterpret_cast<const uint32_t*>(page_marker); - return const_cast<xml_memory_page*>(reinterpret_cast<const xml_memory_page*>(page_marker - *reinterpret_cast<const uint32_t*>(page_marker))); + return const_cast<xml_memory_page*>(reinterpret_cast<const xml_memory_page*>(page)); } private: @@ -775,7 +775,7 @@ PUGI__NS_BEGIN // value is guaranteed to be compact-aligned; this is not // 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 - // compensate for arithmetic shift behavior for negative values + // compensate for arithmetic shift rounding for negative values ptrdiff_t diff = reinterpret_cast<char*>(value) - reinterpret_cast<char*>(this); ptrdiff_t offset = ((diff + int(compact_alignment - 1)) >> compact_alignment_log2) - start; |