Skip to content

Commit 0c56f1b

Browse files
authored
Auto merge of #298 - AngelicosPhosphoros:use_non_null, r=mbrubeck
Use `NonNull` pointer in heap version Since `SmallVec` allocate on heap only if capacity is larger than inner capacity and therefore larger than 1, it cannot be null. Also, this is same behaviour as `std::vec::Vec` which always uses non-null pointer, which is dangling if it has zero capacity. This change reduces size of enum in some cases because it can exploit [niche optimization](https://rust-lang.github.io/unsafe-code-guidelines/glossary.html#niche). For example, `size_of::<SmallVec<[u8; 8]>>` is 24 bytes with changes from this PR while before it was 32 bytes. Also: 1. Changed some internal APIs to indicate that we work with non-nullable pointers. 2. Updated natvis and fixed bug with incorrect calculation of `is_inline` intrinsic.
2 parents 7215769 + 9d96d7f commit 0c56f1b

File tree

4 files changed

+124
-69
lines changed

4 files changed

+124
-69
lines changed

debug_metadata/smallvec.natvis

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
22
<Type Name="smallvec::SmallVec&lt;array$&lt;*,*&gt;&gt;" Priority="Medium">
3-
<Intrinsic Name="is_inline" Expression="$T2 &gt; capacity" />
4-
<Intrinsic Name="len" Expression="is_inline() ? capacity : data.variant1.value.__0.__1" />
5-
<Intrinsic Name="data_ptr" Expression="is_inline() ? data.variant0.value.__0.value.value : data.variant1.value.__0.__0" />
3+
<Intrinsic Name="is_inline" Expression="$T2 &gt;= capacity" />
4+
<Intrinsic Name="len" Expression="is_inline() ? capacity : data.variant1.value.len" />
5+
<Intrinsic Name="data_ptr" Expression="is_inline() ? data.variant0.value.__0.value.value : data.variant1.value.ptr.pointer" />
66

7-
<DisplayString>{{ len={len()} }}</DisplayString>
7+
<DisplayString>{{ len={len()} is_inline={is_inline()} }}</DisplayString>
88
<Expand>
99
<Item Name="[capacity]">is_inline() ? $T2 : capacity</Item>
1010
<Item Name="[len]">len()</Item>
11+
<Item Name="[data_ptr]">data_ptr()</Item>
1112

1213
<ArrayItems>
1314
<Size>len()</Size>
@@ -17,11 +18,10 @@
1718
</Type>
1819

1920
<Type Name="smallvec::SmallVec&lt;array$&lt;*,*&gt;&gt;" Priority="MediumLow">
20-
<Intrinsic Name="is_inline" Expression="$T2 &gt; capacity" />
21+
<Intrinsic Name="is_inline" Expression="$T2 &gt;= capacity" />
2122
<Intrinsic Name="len" Expression="is_inline() ? capacity : data.heap.__1" />
22-
<Intrinsic Name="data_ptr" Expression="is_inline() ? data.inline.value.value.value : data.heap.__0" />
23-
24-
<DisplayString>{{ len={len()} }}</DisplayString>
23+
<Intrinsic Name="data_ptr" Expression="is_inline() ? data.inline.value.value.value : data.heap.__0.pointer" />
24+
<DisplayString>{{ len={len()} is_inline={is_inline()} }}</DisplayString>
2525
<Expand>
2626
<Item Name="[capacity]">is_inline() ? $T2 : capacity</Item>
2727
<Item Name="[len]">len()</Item>

0 commit comments

Comments
 (0)