- Oct 21, 2017
-
-
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.
-
- Sep 26, 2017
-
-
Arseny Kapoulkine authored
-
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.
-
- Jul 18, 2017
-
-
Arseny Kapoulkine authored
Clang/C2 does not implement __builtin_expect; additionally we need to work around deprecation warnings for fopen by disabling them.
-
- Jun 23, 2017
-
-
Arseny Kapoulkine authored
It's not clear whether we still need PUGI__MSVC_CRT_VERSION, but it's more consistent for now to use it for _snprintf_s since this is relying on a CRT extension, not on a compiler feature.
-
- Jun 22, 2017
-
-
Arseny Kapoulkine authored
These functions were deprecated via comments in 1.5 but never got the deprecated attribute; now is the time! Using deprecated functions produces a warning; to silence it, this change moves the relevant tests to a separate translation unit that has deprecation disabled.
-
- Jun 19, 2017
-
-
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.
-
- Jun 16, 2017
-
-
Arseny Kapoulkine authored
Rename partition to partition3 to resolve conflicts with std::partition.
-
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.
-
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.
-
- Jun 15, 2017
-
-
Arseny Kapoulkine authored
Now we can exclude these from code coverage since it's logically impossible to hit them in tests.
-
- Jun 11, 2017
-
-
Renaud Guillard authored
-
- Jun 05, 2017
-
-
Renaud Guillard authored
-
- Jun 04, 2017
-
-
Renaud Guillard authored
-
- Apr 04, 2017
-
-
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.
-
- Mar 22, 2017
-
-
Arseny Kapoulkine authored
-
Arseny Kapoulkine authored
This reverts commit 79109a85. This warning does not happen on gcc-4.8.4; the workaround introduces an unsigned integer overflow which results in a runtime error when compiled with integer sanitizer.
-
- Mar 05, 2017
-
-
Stephan Beyer authored
This is accomplished by putting a // fallthrough comment at the right place. This seems to be more portable than an attribute-based solution like [[fallthrough]] or __attribute__((fallthrough)).
-
- Mar 03, 2017
-
-
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.
-
- Feb 09, 2017
-
-
Arseny Kapoulkine authored
This will make sure we don't forget to implement offset_debug for new node types if they ever happen (really it's mostly for consistency).
-
- Feb 08, 2017
-
-
Arseny Kapoulkine authored
This will make sure we don't forget to implement offset_debug for new node types if they ever happen (really it's mostly for consistency).
-
- Feb 07, 2017
-
-
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.
-
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.
-
- Feb 06, 2017
-
-
Arseny Kapoulkine authored
Instead of delegating to a method that just forwards the call to xpath_query call the relevant method directly.
-
Arseny Kapoulkine authored
It adds one stack frame to string query evaluation and does not really simplify the code.
-
- Feb 04, 2017
-
-
Arseny Kapoulkine authored
Instead of having two checks for out-of-memory when exceptions are enabled, do just one and decide what to do based on whether we can throw.
-
- Feb 03, 2017
-
-
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.
-
- Feb 02, 2017
-
-
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.
-
- Jan 31, 2017
-
-
Arseny Kapoulkine authored
All other functions treat null pointer inputs as invalid; now this function does as well.
-
Arseny Kapoulkine authored
Now error handling in XPath implementation relies on explicit error propagation and is converted to an appropriate result at the end.
-
Arseny Kapoulkine authored
This generates some out-of-memory code paths that are not covered by existing tests, which will need to be resolved later.
-
Arseny Kapoulkine authored
Instead of rolling back the allocation and trying to allocate again, explicitly handle inplace reallocate if possible, and allocate a new block otherwise. This is going to be important once we use reallocate_nothrow from a non-throwing context.
-
Arseny Kapoulkine authored
This requires explicit error handling for xpath_string::data calls.
-
Arseny Kapoulkine authored
This allows us to gradually convert exception handling of out-of-memory during evaluation to a non-throwing approach without changing the observable behavior.
-
- Jan 30, 2017
-
-
Arseny Kapoulkine authored
-
Arseny Kapoulkine authored
W3C specification does not allow predicates after abbreviated steps. Currently this results in parsing terminating at the step, which leads to confusing error messages like "Invalid query" or "Unmatched braces".
-
Arseny Kapoulkine authored
Any time an allocation fails xpath_allocator can set an externally provided bool. The plan is to keep this bool up until evaluation ends, so that we can use it to discard the potentially malformed result.
-
Arseny Kapoulkine authored
For both allocate and reallocate, provide both _nothrow and _throw functions; this change renames allocate() to allocate_throw() (same for reallocate) to make it easier to change the code to remove throwing variants.
-
Arseny Kapoulkine authored
Handle node type error before creating expression node
-
Arseny Kapoulkine authored
We currently need to convert error based on the text to a different type of C++ exceptions when C++ exceptions are enabled.
-