Improve BitField natvis

Now, enums are properly displayed, and BitFieldArray is also displayed nicely.  Signed values also work correctly, and 1-bit fields are not treated as bools unless the bitfield is explicitly marked as a bool.
This commit is contained in:
Pokechu22 2022-01-02 14:36:20 -08:00
parent 85d2ea0dd2
commit b96297f2ee

View File

@ -11,61 +11,64 @@
This is a re-implementation of the abstract bitfield class' algrothm (in BitField.h) This is a re-implementation of the abstract bitfield class' algrothm (in BitField.h)
for Visual Studio to use for pretty-printing during debugging. for Visual Studio to use for pretty-printing during debugging.
--> -->
<Type Name="BitField&lt;*,*,*&gt;"> <Type Name="BitField&lt;*,*,*,*&gt;">
<DisplayString Condition="$T2 == 1"><![CDATA[{(storage & (1 << $T1)) != 0}]]></DisplayString> <DisplayString><![CDATA[{($T3)((storage >> $T1) & ((1 << $T2) - 1))}]]></DisplayString>
<DisplayString><![CDATA[{(storage >> $T1) & ((1 << $T2) - 1)}]]></DisplayString>
<Expand> <Expand>
<Item Name="Offset">$T1</Item> <Item Name="Offset">$T1</Item>
<Item Name="Size">$T2</Item> <Item Name="Size">$T2</Item>
</Expand> </Expand>
</Type> </Type>
<!-- Similar re-implementation for BitFieldArray -->
<Type Name="BitFieldArray&lt;*,*,*,*,*&gt;">
<Expand>
<IndexListItems>
<Size>$T3</Size>
<ValueNode><![CDATA[($T4)((storage >> ($T1 + $T2*$i)) & ((1 << $T2) - 1))]]></ValueNode>
</IndexListItems>
<!-- Put these after the index list, so that the index list is the main thing in the unexpanded preview -->
<Item Name="Offset">$T1</Item>
<Item Name="Size">$T2</Item>
<Item Name="Count">$T3</Item>
</Expand>
</Type>
<!--Specialised versions for signed types--> <!--Specialised versions for signed types-->
<Type Name="BitField&lt;*,*,__int64&gt;"> <Type Name="BitField&lt;*,*,signed char,*&gt;">
<!-- It seems like we can't use s8/s16/s32/s64, nor can we use std::int8_t or the like; we have to use these names -->
<AlternativeType Name="BitField&lt;*,*,short,*&gt;" />
<AlternativeType Name="BitField&lt;*,*,int,*&gt;" />
<AlternativeType Name="BitField&lt;*,*,long long,*&gt;" />
<!-- This is what I have do to get a sign extension in this crappy natvis "language" <!-- This is what I have do to get a sign extension in this crappy natvis "language"
Basically, we check the top bit, if it's one, we add the remaining Basically, we check the top bit, if it's one, we add the remaining
bits to the smallest (most negative) number. --> bits to the smallest (most negative) number. -->
<DisplayString Condition="(storage &amp; (1 &lt;&lt; ($T1 + $T2))) != 0"> <DisplayString Condition="(storage &amp; (1 &lt;&lt; ($T1 + $T2 - 1))) != 0">
<![CDATA[{(-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]> <![CDATA[{($T3)((-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1)))}]]>
</DisplayString> </DisplayString>
<DisplayString><![CDATA[{(storage >> $T1) & ((1 << ($T2-1)) - 1)}]]></DisplayString> <DisplayString><![CDATA[{($T3)((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]></DisplayString>
<Expand> <Expand>
<Item Name="Offset">$T1</Item> <Item Name="Offset">$T1</Item>
<Item Name="Size">$T2</Item> <Item Name="Size">$T2</Item>
</Expand> </Expand>
</Type> </Type>
<!-- Oh, and I can't do a generic match for all signed types, so these are identical to the __int64 case above <Type Name="BitFieldArray&lt;*,*,*,signed char,*&gt;">
Would be nice if std::numeric_limits<$T3>::is_signed or std::is_signed<$T3>::value worked --> <AlternativeType Name="BitFieldArray&lt;*,*,*,short,*&gt;" />
<Type Name="BitField&lt;*,*,__int32&gt;"> <AlternativeType Name="BitFieldArray&lt;*,*,*,int,*&gt;" />
<DisplayString Condition="(storage &amp; (1 &lt;&lt; ($T1 + $T2))) != 0"> <AlternativeType Name="BitFieldArray&lt;*,*,*,long,*&gt;" />
<![CDATA[{(-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]>
</DisplayString>
<DisplayString><![CDATA[{(storage >> $T1) & ((1 << ($T2-1)) - 1)}]]></DisplayString>
<Expand>
<Item Name="Offset">$T1</Item>
<Item Name="Size">$T2</Item>
</Expand>
</Type>
<Type Name="BitField&lt;*,*,__int16&gt;">
<DisplayString Condition="(storage &amp; (1 &lt;&lt; ($T1 + $T2))) != 0">
<![CDATA[{(-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]>
</DisplayString>
<DisplayString><![CDATA[{(storage >> $T1) & ((1 << ($T2-1)) - 1)}]]></DisplayString>
<Expand>
<Item Name="Offset">$T1</Item>
<Item Name="Size">$T2</Item>
</Expand>
</Type>
<Type Name="BitField&lt;*,*,__int8&gt;">
<DisplayString Condition="(storage &amp; (1 &lt;&lt; ($T1 + $T2))) != 0">
<![CDATA[{(-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]>
</DisplayString>
<DisplayString><![CDATA[{(storage >> $T1) & ((1 << ($T2-1)) - 1)}]]></DisplayString>
<Expand> <Expand>
<IndexListItems>
<Size>$T3</Size>
<ValueNode Condition="(storage &amp; (1 &lt;&lt; ($T1 + $T2 * $i + $T2 - 1))) != 0">
<![CDATA[($T4)((-1 * (1 << ($T2-1))) + ((storage >> ($T1 + $T2*$i)) & ((1 << ($T2-1)) - 1)))]]>
</ValueNode>
<ValueNode><![CDATA[($T4)((storage >> ($T1 + $T2*$i)) & ((1 << ($T2-1)) - 1))]]></ValueNode>
</IndexListItems>
<Item Name="Offset">$T1</Item> <Item Name="Offset">$T1</Item>
<Item Name="Size">$T2</Item> <Item Name="Size">$T2</Item>
<Item Name="Count">$T3</Item>
</Expand> </Expand>
</Type> </Type>
</AutoVisualizer> </AutoVisualizer>