aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2021-12-07 12:48:03 -0800
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2022-01-13 10:50:06 -0800
commitbc9c1ae1c55d2f6d68d68b61543a0797e4248569 (patch)
tree5292ef815705fcfe6420e8f982891b063dc2e83f /lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
parent8cd81274ff618d9d44d1089d3af0c21a76e719ad (diff)
downloadllvm-bc9c1ae1c55d2f6d68d68b61543a0797e4248569.zip
llvm-bc9c1ae1c55d2f6d68d68b61543a0797e4248569.tar.gz
llvm-bc9c1ae1c55d2f6d68d68b61543a0797e4248569.tar.bz2
ADT: Make SmallVector::set_size() private
Stop allowing use of `SmallVectorBase::set_size()` outside of the SmallVector implementation, which sets the size without calling constructors or destructors. Most callers should probably just use `resize()`. Or, if the new size is guaranteed to be `<= size()`, then the new-ish `truncate()` works too (and optimizes better). Some callers want to avoid initializing memory before overwriting, but need a pointer to the memory and so cannot use `push_back()`, `emplace_back()`, or `append()`. Before this commit, this depended on `reserve()` and `set_size()`: ``` V.reserve(V.size() + NumNew); // Reserve expected size. NumNew = initialize(V.end(), ...); // Get number added. V.set_size(V.size() + NumNew); // Set size to match. ``` Such code should be updated to use `resize_for_overwrite()` and `truncate()`: ``` auto Size = V.size(); // Save initial size. V.resize_for_overwrite(Size + NumNew); // Resize to expected size. NumNew = initialize(V.begin() + Size, ...)); // Get number added. V.truncate(Size + NumNew); // Truncate to match. ``` The new pattern is safe even for non-trivial types, since `resize_for_overwrite()` calls constructors and `truncate()` calls destructors. For trivial types, it should optimize the same way as the old pattern. Downstream code adapt to the disappearance of `set_size()` using this new pattern should carefully audit uses of `V` between the resize and the truncate: - Change `V.size()` => `Size`. - Change `V.capacity()` => `V.size()` (mostly). - Change `V.end()` => `V.begin() + Size`. - If `V` is an out-parameter, early returns need a `V.truncate()` or `V.clear()`. A scope exit is recommended. Differential Revision: https://reviews.llvm.org/D115380
Diffstat (limited to 'lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h')
0 files changed, 0 insertions, 0 deletions