Skip to content
Snippets Groups Projects
  1. Oct 21, 2017
    • Arseny Kapoulkine's avatar
      Clarify a note about compact hash behavior during move · 3af93a39
      Arseny Kapoulkine authored
      After move some nodes in the hash table can have keys that point to
      other; this makes the table somewhat larger but this does not impact
      correctness.
      
      The reason is that for us to access a key in the hash table, there
      should be a compact_pointer/string object with the state indicating that
      it is stored in a hash table, and with the address matching the key. For
      this to happen, we had to have put this object into this state which
      would mean that we'd overwrite the hash entry with the new, correct
      value.
      
      When nodes/pages are being removed, we do not clean up keys from the
      hash table - it's safe for the same reason, and thus move doesn't
      introduce additional contracts here.
      3af93a39
  2. Sep 26, 2017
    • Arseny Kapoulkine's avatar
      Fix -Wshadow warning · febf25d1
      Arseny Kapoulkine authored
      febf25d1
    • Arseny Kapoulkine's avatar
      Implement move support for xml_document · a567f12d
      Arseny Kapoulkine authored
      This change implements the initial version of move construction and
      assignment support for documents.
      
      When moving a document to another document, we always make sure move
      target is in "clean" state (empty document), and proceed by relocating
      all structures in the most efficient way possible.
      
      Complications arise from the fact that the root (document) node is
      embedded into xml_document object, so all pointers to it have to change;
      this includes parent pointers of all first-level children as well as
      allocator pointers in all memory pages and previous pointer in the first
      on-heap memory page.
      
      Additionally, compact mode makes everything even more complicated
      because some of the pointers we need to update are stored in the hash
      table (in fact, document first_child pointer is very likely to be there;
      some parent pointers in first-level children will be using
      compact_shared_parent but some won't be) which requires allocating a new
      hash table which can fail.
      
      Some details of this process are not fully fleshed out, especially for
      compact mode; and this definitely requires many tests.
      a567f12d
  3. Jul 18, 2017
    • Arseny Kapoulkine's avatar
      Fix Clang/C2 compatibility · 77d7e603
      Arseny Kapoulkine authored
      Clang/C2 does not implement __builtin_expect; additionally we need to
      work around deprecation warnings for fopen by disabling them.
      77d7e603
  4. Jun 23, 2017
  5. Jun 22, 2017
  6. Jun 19, 2017
    • Arseny Kapoulkine's avatar
      Change PUGI__SNPRINTF to use _countof for MSVC · 208e2cf0
      Arseny Kapoulkine authored
      The macro only works correctly when the input argument is an array with
      a statically known size - pointers or arrays decayed to pointers won't
      work silently.
      
      While this is unlikely to surface issues that aren't caught in
      tests/code review, use _countof for MSVC to prevent such code from
      compiling.
      208e2cf0
  7. Jun 16, 2017
    • Arseny Kapoulkine's avatar
      Fix BorlandC compilation · b6995f06
      Arseny Kapoulkine authored
      Rename partition to partition3 to resolve conflicts with std::partition.
      b6995f06
    • Arseny Kapoulkine's avatar
      Refactor snprintf support · 95f013ba
      Arseny Kapoulkine authored
      Instead of branching code at each invocation site, use variadic macros
      to create a wrapping macro that use snprintf for the buffer of a
      statically known size.
      
      Variadic macros are supported by all C++11 compilers, as is snprintf;
      on MSVC 2005+ we don't necessarily have snprintf, but we can use
      _snprintf_s with _TRUNCATE to get the same behavior. In all other cases
      we fall back to sprintf, that (theoretically) can lead to a stack buffer
      overflow.
      
      In practice all snprintfs used in pugixml use buffers that should be
      large enough to never be overflown but snprintf is safe even if this is
      not the case.
      95f013ba
    • Arseny Kapoulkine's avatar
      Use buffer with a static size in convert_number_to_mantissa_exponent · 207bc788
      Arseny Kapoulkine authored
      We use references to arrays elsewhere in the codebase and there's just
      one caller for this function so it's easier to fix the size.
      
      This will simplify snprintf refactoring.
      207bc788
  8. Jun 15, 2017
  9. Jun 11, 2017
  10. Jun 05, 2017
  11. Jun 04, 2017
  12. Apr 04, 2017
    • Arseny Kapoulkine's avatar
      Work around -fsanitize=integer issues · 38edf255
      Arseny Kapoulkine authored
      Integer sanitizer is flagging unsigned integer overflow in several
      functions in pugixml; unsigned integer overflow is well defined but it
      may not necessarily be intended.
      
      Apart from hash functions, both string_to_integer and integer_to_string
      use unsigned overflow - string_to_integer uses it to perform
      two-complement negation so that the bulk of the operation can run using
      unsigned integers. This makes it possible to simplify overflow checking.
      Similarly integer_to_string negates the number before generating a
      decimal representation, but negating is impossible without unsigned
      overflow or special-casing certain integer limits.
      
      For now just silence the integer overflow using a special attribute;
      also move unsigned overflow into string_to_integer from get_value_* so
      that we have fewer functions marked with the attribute.
      
      Fixes #133.
      38edf255
  13. Mar 22, 2017
  14. Mar 05, 2017
  15. Mar 03, 2017
    • Arseny Kapoulkine's avatar
      Simplify compact_hash_table implementation · 8ce4592e
      Arseny Kapoulkine authored
      Instead of a separate implementation for find/insert, use just one that
      can do both. This reduces the code size and simplifies code coverage;
      the resulting code is close to what we had in terms of performance and
      since hash table is a fall back should not affect any real workloads.
      8ce4592e
  16. Feb 09, 2017
  17. Feb 08, 2017
  18. Feb 07, 2017
    • Arseny Kapoulkine's avatar
      XPath: Simplify sorting implementation · 2162a0d8
      Arseny Kapoulkine authored
      Instead of a complicated partitioning scheme that tries to maintain the
      equal area in the middle, use a scheme where we keep the equal area in
      the left part of the array and then move it to the middle.
      
      Since generally sorted arrays don't contain many duplicates this extra
      copy is not too expensive, and it significantly simplifies the logic and
      maintains good complexity for sorting arrays with many equal elements
      nonetheless (unlike Hoare partitioning).
      
      Instead of a median of 9 just use a median of 3 - it performs pretty
      much identically on some internal performance tests, despite having a
      bit more comparisons in some cases.
      
      Finally, change the insertion sort threshold to 16 elements since that
      appears to have slightly better performance.
      2162a0d8
    • Arseny Kapoulkine's avatar
      XPath: Optimize insertion_sort · 774d5fe9
      Arseny Kapoulkine authored
      The previous implementation opted for doing two comparisons per element
      in the sorted case in order to remove one iterator bounds check per
      moved element when we actually need to copy. In our case however the
      comparator is pretty expensive (except for remove_duplicates which is
      fast as it is) so an extra object comparison hurts much more than an
      iterator comparison saves.
      
      This makes sorting by document order up to 3% faster for random
      sequences.
      774d5fe9
  19. Feb 06, 2017
  20. Feb 04, 2017
  21. Feb 03, 2017
    • Arseny Kapoulkine's avatar
      XPath: Clean up out-of-memory parse error handling · 33159924
      Arseny Kapoulkine authored
      Instead of relying on a specific string in the parse result, use
      allocator error state to report the error and then convert it to a
      string if necessary.
      
      We currently have to manually trigger the OOM error in two places
      because we use global allocator in rare cases; we don't really need to
      do this so this will be cleaned up later.
      33159924
  22. Feb 02, 2017
    • Arseny Kapoulkine's avatar
      Remove redundant branch from xml_node::path() · 0e3ccc73
      Arseny Kapoulkine authored
      The code works fine regardless of the *j->name check, and omitting this
      makes the code more symmetric between the "count" and "write" stage;
      additionally this improves coverage - due to how strcpy_insitu works
      it's not really possible to get an empty non-NULL name in the node.
      0e3ccc73
  23. Jan 31, 2017
  24. Jan 30, 2017
Loading