diff options
| author | Pokechu22 <Pokechu022@gmail.com> | 2022-01-02 14:36:20 -0800 |
|---|---|---|
| committer | Pokechu22 <Pokechu022@gmail.com> | 2022-01-02 14:39:34 -0800 |
| commit | b96297f2ee3ed21aee934c84fcecd4a73f2ba753 (patch) | |
| tree | 308445cfc2cfdb5d7a2866b0f287dd90a73ebd2a /Source | |
| parent | 85d2ea0dd28444effed13a622360253f2d74bcba (diff) | |
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.
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Core/Common/BitField.natvis | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/Source/Core/Common/BitField.natvis b/Source/Core/Common/BitField.natvis index 1eda338924..4d2a309199 100644 --- a/Source/Core/Common/BitField.natvis +++ b/Source/Core/Common/BitField.natvis @@ -11,61 +11,64 @@ This is a re-implementation of the abstract bitfield class' algrothm (in BitField.h) for Visual Studio to use for pretty-printing during debugging. --> - <Type Name="BitField<*,*,*>"> - <DisplayString Condition="$T2 == 1"><![CDATA[{(storage & (1 << $T1)) != 0}]]></DisplayString> - <DisplayString><![CDATA[{(storage >> $T1) & ((1 << $T2) - 1)}]]></DisplayString> + <Type Name="BitField<*,*,*,*>"> + <DisplayString><![CDATA[{($T3)((storage >> $T1) & ((1 << $T2) - 1))}]]></DisplayString> <Expand> <Item Name="Offset">$T1</Item> <Item Name="Size">$T2</Item> </Expand> </Type> - - <!--Specialised versions for signed types--> - <Type Name="BitField<*,*,__int64>"> - <!-- 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 - bits to the smallest (most negative) number. --> - <DisplayString Condition="(storage & (1 << ($T1 + $T2))) != 0"> - <![CDATA[{(-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]> - </DisplayString> - <DisplayString><![CDATA[{(storage >> $T1) & ((1 << ($T2-1)) - 1)}]]></DisplayString> + <!-- Similar re-implementation for BitFieldArray --> + <Type Name="BitFieldArray<*,*,*,*,*>"> <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> - <!-- Oh, and I can't do a generic match for all signed types, so these are identical to the __int64 case above - Would be nice if std::numeric_limits<$T3>::is_signed or std::is_signed<$T3>::value worked --> - <Type Name="BitField<*,*,__int32>"> - <DisplayString Condition="(storage & (1 << ($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<*,*,__int16>"> - <DisplayString Condition="(storage & (1 << ($T1 + $T2))) != 0"> - <![CDATA[{(-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]> + <!--Specialised versions for signed types--> + <Type Name="BitField<*,*,signed char,*>"> + <!-- 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<*,*,short,*>" /> + <AlternativeType Name="BitField<*,*,int,*>" /> + <AlternativeType Name="BitField<*,*,long long,*>" /> + + <!-- 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 + bits to the smallest (most negative) number. --> + <DisplayString Condition="(storage & (1 << ($T1 + $T2 - 1))) != 0"> + <![CDATA[{($T3)((-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1)))}]]> </DisplayString> - <DisplayString><![CDATA[{(storage >> $T1) & ((1 << ($T2-1)) - 1)}]]></DisplayString> + <DisplayString><![CDATA[{($T3)((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]></DisplayString> <Expand> <Item Name="Offset">$T1</Item> <Item Name="Size">$T2</Item> </Expand> </Type> - <Type Name="BitField<*,*,__int8>"> - <DisplayString Condition="(storage & (1 << ($T1 + $T2))) != 0"> - <![CDATA[{(-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]> - </DisplayString> - <DisplayString><![CDATA[{(storage >> $T1) & ((1 << ($T2-1)) - 1)}]]></DisplayString> + + <Type Name="BitFieldArray<*,*,*,signed char,*>"> + <AlternativeType Name="BitFieldArray<*,*,*,short,*>" /> + <AlternativeType Name="BitFieldArray<*,*,*,int,*>" /> + <AlternativeType Name="BitFieldArray<*,*,*,long,*>" /> + <Expand> + <IndexListItems> + <Size>$T3</Size> + <ValueNode Condition="(storage & (1 << ($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="Size">$T2</Item> + <Item Name="Count">$T3</Item> </Expand> </Type> </AutoVisualizer> |
