summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorPokechu22 <Pokechu022@gmail.com>2022-01-02 14:36:20 -0800
committerPokechu22 <Pokechu022@gmail.com>2022-01-02 14:39:34 -0800
commitb96297f2ee3ed21aee934c84fcecd4a73f2ba753 (patch)
tree308445cfc2cfdb5d7a2866b0f287dd90a73ebd2a /Source
parent85d2ea0dd28444effed13a622360253f2d74bcba (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.natvis71
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&lt;*,*,*&gt;">
- <DisplayString Condition="$T2 == 1"><![CDATA[{(storage & (1 << $T1)) != 0}]]></DisplayString>
- <DisplayString><![CDATA[{(storage >> $T1) & ((1 << $T2) - 1)}]]></DisplayString>
+ <Type Name="BitField&lt;*,*,*,*&gt;">
+ <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&lt;*,*,__int64&gt;">
- <!-- 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 &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>
+ <!-- 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>
- <!-- 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&lt;*,*,__int32&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;*,*,__int16&gt;">
- <DisplayString Condition="(storage &amp; (1 &lt;&lt; ($T1 + $T2))) != 0">
- <![CDATA[{(-1 * (1 << ($T2-1))) + ((storage >> $T1) & ((1 << ($T2-1)) - 1))}]]>
+ <!--Specialised versions for signed types-->
+ <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"
+ Basically, we check the top bit, if it's one, we add the remaining
+ bits to the smallest (most negative) number. -->
+ <DisplayString Condition="(storage &amp; (1 &lt;&lt; ($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&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>
+
+ <Type Name="BitFieldArray&lt;*,*,*,signed char,*&gt;">
+ <AlternativeType Name="BitFieldArray&lt;*,*,*,short,*&gt;" />
+ <AlternativeType Name="BitFieldArray&lt;*,*,*,int,*&gt;" />
+ <AlternativeType Name="BitFieldArray&lt;*,*,*,long,*&gt;" />
+
<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="Size">$T2</Item>
+ <Item Name="Count">$T3</Item>
</Expand>
</Type>
</AutoVisualizer>