LibreOffice.natvis: fix BigPrtArray visualiser.
Also visualisers for uno_Any and SwNode are tweaked.
Visualisers for uno::Reference, rtl::Reference and VclPtr added.
SwFrameFormats visualiser reimplemented to follow implementation
of boost::multi_index_container.
Minor reformatting.
Change-Id: I24ccb8bfccd7f7514697ca3f36490672ad549aef
Reviewed-on: https://gerrit.libreoffice.org/40466
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/solenv/vs/LibreOffice.natvis b/solenv/vs/LibreOffice.natvis
index a58eaef..60ce1d5 100644
--- a/solenv/vs/LibreOffice.natvis
+++ b/solenv/vs/LibreOffice.natvis
@@ -18,22 +18,20 @@
</Type>
<Type Name="_rtl_uString">
<DisplayString Condition="length == 0">empty</DisplayString>
<DisplayString>{buffer,su}</DisplayString>
<StringView>buffer,su</StringView>
<DisplayString>{buffer,[length]su}</DisplayString>
<StringView>buffer,[length]su</StringView>
</Type>
<Type Name="_rtl_String">
<DisplayString Condition="length == 0">empty</DisplayString>
<DisplayString>{buffer,s}</DisplayString>
<StringView>buffer,s</StringView>
<DisplayString>{buffer,[length]s}</DisplayString>
<StringView>buffer,[length]s</StringView>
</Type>
<Type Name="com::sun::star::uno::Any">
<Type Name="_uno_Any">
<!--
typelib_TypeClass_VOID = 0,
typelib_TypeClass_ANY = 14,
typelib_TypeClass_TYPEDEF = 16,
typelib_TypeClass_STRUCT = 17,
typelib_TypeClass_UNION = 18,/** Deprecated, UNOIDL does not have a union concept.*/
typelib_TypeClass_EXCEPTION = 19,
typelib_TypeClass_ARRAY = 21,/** Deprecated, UNOIDL does not have an array concept.*/
typelib_TypeClass_SERVICE = 23,/** (not implemented) */
typelib_TypeClass_MODULE = 24,/** (not implemented) */
@@ -45,38 +43,41 @@
typelib_TypeClass_CONSTANTS = 30,
typelib_TypeClass_SINGLETON = 31,
-->
<DisplayString Condition="pType->eTypeClass == 1">{pType->eTypeClass,en}: {*((wchar_t*)pData),c}</DisplayString><!-- typelib_TypeClass_CHAR -->
<DisplayString Condition="pType->eTypeClass == 2">{pType->eTypeClass,en}: {*((bool*)pData),d}</DisplayString><!-- typelib_TypeClass_BOOLEAN -->
<DisplayString Condition="pType->eTypeClass == 3">{pType->eTypeClass,en}: {*((unsigned char*)pData),d}</DisplayString><!-- typelib_TypeClass_BYTE -->
<DisplayString Condition="pType->eTypeClass == 4">{pType->eTypeClass,en}: {(*((short*)pData) & 0xFFFF),d}</DisplayString><!-- typelib_TypeClass_SHORT -->
<DisplayString Condition="pType->eTypeClass == 5">{pType->eTypeClass,en}: {(*((unsigned short*)pData) & 0xFFFF),d}</DisplayString><!-- typelib_TypeClass_UNSIGNED_SHORT -->
<DisplayString Condition="pType->eTypeClass == 6">{pType->eTypeClass,en}: {*((int*)pData),d}</DisplayString><!-- typelib_TypeClass_LONG -->
<DisplayString Condition="pType->eTypeClass == 7">{pType->eTypeClass,en}: {*((unsigned int*)pData),d}</DisplayString><!-- typelib_TypeClass_UNSIGNED_LONG -->
<DisplayString Condition="pType->eTypeClass == 8">{pType->eTypeClass,en}: {*((__int64*)pData),d}</DisplayString><!-- typelib_TypeClass_HYPER -->
<DisplayString Condition="pType->eTypeClass == 9">{pType->eTypeClass,en}: {*((unsigned __int64*)pData),d}</DisplayString><!-- typelib_TypeClass_UNSIGNED_HYPER -->
<DisplayString Condition="pType->eTypeClass == 10">{pType->eTypeClass,en}: {*((float*)pData)}</DisplayString><!-- typelib_TypeClass_FLOAT -->
<DisplayString Condition="pType->eTypeClass == 11">{pType->eTypeClass,en}: {*((double*)pData)}</DisplayString><!-- typelib_TypeClass_DOUBLE -->
<DisplayString Condition="pType->eTypeClass == 12">{pType->eTypeClass,en}: {*((rtl::OUString*)pData)}</DisplayString><!-- typelib_TypeClass_STRING -->
<DisplayString Condition="pType->eTypeClass == 13">{pType->eTypeClass,en}: {*((com::sun::star::uno::Type*)pData)}</DisplayString><!-- typelib_TypeClass_TYPE -->
<DisplayString Condition="pType->eTypeClass == 15">{pType->eTypeClass,en}: {*((sal_Int32*)pData),d}</DisplayString><!-- typelib_TypeClass_ENUM -->
<DisplayString Condition="pType->eTypeClass == 20">{pType->eTypeClass,en}: {*((uno_Sequence **)pData)}</DisplayString><!-- typelib_TypeClass_SEQUENCE -->
<DisplayString Condition="pType->eTypeClass == 22">{pType->eTypeClass,en}: {*((com::sun::star::uno::BaseReference *)pData)}</DisplayString><!-- typelib_TypeClass_INTERFACE -->
<DisplayString Condition="pType->eTypeClass == 1" >{*((wchar_t*)pData),c} (CHAR)</DisplayString><!-- typelib_TypeClass_CHAR -->
<DisplayString Condition="pType->eTypeClass == 2" >{*((bool*)pData),d} (BOOLEAN)</DisplayString><!-- typelib_TypeClass_BOOLEAN -->
<DisplayString Condition="pType->eTypeClass == 3" >{*((unsigned char*)pData),d} (BYTE)</DisplayString><!-- typelib_TypeClass_BYTE -->
<DisplayString Condition="pType->eTypeClass == 4" >{(*((short*)pData) & 0xFFFF),d} (SHORT)</DisplayString><!-- typelib_TypeClass_SHORT -->
<DisplayString Condition="pType->eTypeClass == 5" >{(*((unsigned short*)pData) & 0xFFFF),d} (UNSIGNED_SHORT)</DisplayString><!-- typelib_TypeClass_UNSIGNED_SHORT -->
<DisplayString Condition="pType->eTypeClass == 6" >{*((int*)pData),d} (LONG)</DisplayString><!-- typelib_TypeClass_LONG -->
<DisplayString Condition="pType->eTypeClass == 7" >{*((unsigned int*)pData),d} (UNSIGNED_LONG)</DisplayString><!-- typelib_TypeClass_UNSIGNED_LONG -->
<DisplayString Condition="pType->eTypeClass == 8" >{*((__int64*)pData),d} (HYPER)</DisplayString><!-- typelib_TypeClass_HYPER -->
<DisplayString Condition="pType->eTypeClass == 9" >{*((unsigned __int64*)pData),d} (UNSIGNED_HYPER)</DisplayString><!-- typelib_TypeClass_UNSIGNED_HYPER -->
<DisplayString Condition="pType->eTypeClass == 10">{*((float*)pData)} (FLOAT)</DisplayString><!-- typelib_TypeClass_FLOAT -->
<DisplayString Condition="pType->eTypeClass == 11">{*((double*)pData)} (DOUBLE)</DisplayString><!-- typelib_TypeClass_DOUBLE -->
<DisplayString Condition="pType->eTypeClass == 12">{*((rtl::OUString*)pData)} (STRING)</DisplayString><!-- typelib_TypeClass_STRING -->
<DisplayString Condition="pType->eTypeClass == 13">{*((com::sun::star::uno::Type*)pData)} (TYPE)</DisplayString><!-- typelib_TypeClass_TYPE -->
<DisplayString Condition="pType->eTypeClass == 14">{*((_uno_Any*)pData)} (ANY)</DisplayString><!-- typelib_TypeClass_ANY -->
<DisplayString Condition="pType->eTypeClass == 15">{*((sal_Int32*)pData),d} (ENUM)</DisplayString><!-- typelib_TypeClass_ENUM -->
<DisplayString Condition="pType->eTypeClass == 19">{*((com::sun::star::uno::Exception *)pData)} (EXCEPTION)</DisplayString><!-- typelib_TypeClass_EXCEPTION -->
<DisplayString Condition="pType->eTypeClass == 20">{*((uno_Sequence **)pData)} (SEQUENCE)</DisplayString><!-- typelib_TypeClass_SEQUENCE -->
<DisplayString Condition="pType->eTypeClass == 22">{*((com::sun::star::uno::BaseReference *)pData)} (INTERFACE)</DisplayString><!-- typelib_TypeClass_INTERFACE -->
<DisplayString>{pType->eTypeClass,en}</DisplayString>
<Expand>
<Item Name="Data" Condition="pType->eTypeClass == 22">*((com::sun::star::uno::BaseReference *)pData)</Item>
<Item Name="Data" Condition="pType->eTypeClass != 22">pData</Item>
<ExpandedItem Condition="pType->eTypeClass == 19">(com::sun::star::uno::Exception *)pData</ExpandedItem>
<ExpandedItem Condition="pType->eTypeClass == 22">(com::sun::star::uno::BaseReference *)pData</ExpandedItem>
<Item Name="Data" Condition="pType->eTypeClass != 19 && pType->eTypeClass != 22">pData</Item>
</Expand>
</Type>
<Type Name="basegfx::internal::ImplMatLine<3>">
<Type Name="basegfx::internal::ImplMatLine < 3 >">
<DisplayString>{mfValue[0]}, {mfValue[1]}, {mfValue[2]}</DisplayString>
</Type>
<Type Name="basegfx::internal::ImplHomMatrixTemplate<3>">
<Type Name="basegfx::internal::ImplHomMatrixTemplate < 3 >">
<DisplayString>{{{maLine[0]}}}, {{{maLine[1]}}}, {mpLine}</DisplayString>
</Type>
<Type Name="o3tl::cow_wrapper<basegfx::Impl2DHomMatrix,o3tl::UnsafeRefCountingPolicy>::impl_t">
<Type Name="o3tl::cow_wrapper < basegfx::Impl2DHomMatrix,o3tl::UnsafeRefCountingPolicy >::impl_t">
<DisplayString>{m_value}</DisplayString>
</Type>
<Type Name="o3tl::cow_wrapper<basegfx::Impl2DHomMatrix,o3tl::UnsafeRefCountingPolicy>">
<Type Name="o3tl::cow_wrapper < basegfx::Impl2DHomMatrix,o3tl::UnsafeRefCountingPolicy >">
<DisplayString>{m_pimpl}</DisplayString>
</Type>
<Type Name="basegfx::B2DHomMatrix">
@@ -100,69 +101,99 @@
<Type Name="SwRect">
<DisplayString>{m_Point}, {m_Size}</DisplayString>
</Type>
<Type Name="com::sun::star::uno::Sequence<*>">
<DisplayString Condition="_pSequence->nElements == 0">empty</DisplayString>
<DisplayString>Sequence of {_pSequence->nElements} {"$T1",sb}</DisplayString>
<Type Name="com::sun::star::uno::Sequence < * >">
<DisplayString Condition="_pSequence->nElements == 0">empty sequence</DisplayString>
<DisplayString>sequence of {_pSequence->nElements} {"$T1",sb}</DisplayString>
<Expand>
<Item Name="[size]">_pSequence->nElements</Item>
<ArrayItems>
<Size>_pSequence->nElements</Size>
<ValuePointer>reinterpret_cast< const $T1 * >( _pSequence->elements )</ValuePointer>
<ValuePointer>reinterpret_cast < const $T1 * >( _pSequence->elements )</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="SwNodes">
<Type Name="BigPtrArray">
<DisplayString>{{{m_nSize} nodes}}</DisplayString>
<Expand>
<Item Name="[Count]">m_nSize</Item>
<Item Name="[size]">m_nSize</Item>
<CustomListItems>
<Variable Name="idx" InitialValue="0"/>
<Variable Name="blockIx" InitialValue="0"/>
<Variable Name="p" InitialValue="m_vpInf[ 0 ]"/>
<!-- Visualiser needs to know the type of variable (including pointer type).
If later we try to assign an incompatible value, visualiser will error out.
For pointers, valid syntax is e.g. "(BlockInfo*)nullptr" -->
<Variable Name="blocks" InitialValue="m_ppInf._Mypair._Myval2"/>
<Variable Name="count" InitialValue="m_nSize"/>
<Variable Name="pos" InitialValue="0"/>
<Variable Name="block_count" InitialValue="m_nBlock"/>
<Variable Name="block_pos" InitialValue="0"/>
<Variable Name="block" InitialValue="blocks[0]"/>
<Variable Name="next_block" InitialValue="block"/>
<Size>m_nSize</Size>
<Loop>
<Break Condition="idx >= m_nSize"/>
<If Condition="p->nStart > idx || p->nEnd < idx">
<Exec>blockIx = 0</Exec>
<Loop>
<Break Condition="blockIx >= m_vpInf._Mypair._Myval2._Mylast - m_vpInf._Mypair._Myval2._Myfirst"/>
<Break Condition="p->nStart <= idx && p->nEnd >= idx"/>
<Exec>blockIx++</Exec>
<Exec>p = m_vpInf[ blockIx ]</Exec>
</Loop>
<Break Condition="block_pos >= block_count"/>
<Break Condition="block == nullptr"/>
<Break Condition="block->nStart != 0"/>
<Break Condition="block->nEnd - block->nStart + 1 != block->nElem"/>
<Loop>
<Break Condition="pos >= count"/>
<Item>*block->mvData._Elems[ pos - block->nStart ]</Item>
<If Condition="pos == block->nEnd">
<Exec>block_pos++</Exec>
<Break Condition="block_pos >= block_count"/>
<Exec>next_block = blocks[block_pos]</Exec>
<Break Condition="next_block == nullptr"/>
<Break Condition="next_block->nEnd - next_block->nStart + 1 != next_block->nElem"/>
<Break Condition="next_block->nStart != block->nEnd + 1"/>
<Break Condition="next_block->nEnd <= count"/>
<Exec>block = next_block</Exec>
</If>
<Item>*static_cast<SwNodePtr>(p->mvData[ idx - p->nStart ])</Item>
<Exec>idx++</Exec>
<Exec>pos++</Exec>
</Loop>
</CustomListItems>
</Expand>
</Type>
<Type Name="SwNode">
<DisplayString>{{SwNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{Node}}</DisplayString>
<Expand>
<Item Name="Nodes">static_cast< SwNodes* >(m_pBlock->pBigArr)</Item>
<Item Name="Nodes">static_cast < SwNodes* >(m_pBlock->pBigArr)</Item>
</Expand>
</Type>
<Type Name="SwEndNode">
<DisplayString>{{SwEndNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString Condition="m_pStartOfSection != nullptr">[{m_pBlock->nStart + m_nOffset}] {{EndNode}} - for {*m_pStartOfSection}</DisplayString>
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{EndNode}}</DisplayString>
</Type>
<Type Name="SwStartNode">
<DisplayString Condition="m_eStartNodeType == 1">{{SwTableBoxStartNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 2">{{SwFlyStartNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 3">{{SwFootnoteStartNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 4">{{SwHeaderStartNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 5">{{SwFooterStartNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString>{{SwStartNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 0">[{m_pBlock->nStart + m_nOffset}] {{NormalStartNode}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 1">[{m_pBlock->nStart + m_nOffset}] {{TableBoxStartNode}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 2">[{m_pBlock->nStart + m_nOffset}] {{FlyStartNode}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 3">[{m_pBlock->nStart + m_nOffset}] {{FootnoteStartNode}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 4">[{m_pBlock->nStart + m_nOffset}] {{HeaderStartNode}}</DisplayString>
<DisplayString Condition="m_eStartNodeType == 5">[{m_pBlock->nStart + m_nOffset}] {{FooterStartNode}}</DisplayString>
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{StartNode}}</DisplayString>
</Type>
<Type Name="SwContentNode">
<DisplayString>{{SwContentNode {m_pBlock->nStart + m_nOffset}}}</DisplayString>
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{ContentNode}}</DisplayString>
</Type>
<Type Name="SwOLENode">
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{OLENode}}</DisplayString>
</Type>
<Type Name="SwGrfNode">
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{GrfNode}}</DisplayString>
</Type>
<Type Name="SwSectionNode">
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{SectionNode}}</DisplayString>
</Type>
<Type Name="SwTableNode">
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{TableNode}}</DisplayString>
</Type>
<Type Name="SwDummySectionNode">
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{DummySectionNode}}</DisplayString>
</Type>
<Type Name="SwTextNode">
<DisplayString>{{SwTextNode {m_pBlock->nStart + m_nOffset}: {m_Text}}}</DisplayString>
<DisplayString>[{m_pBlock->nStart + m_nOffset}] {{TextNode: {m_Text}}}</DisplayString>
</Type>
<Type Name="SwNodeIndex">
<DisplayString>{{{*m_pNode}}}</DisplayString>
@@ -183,8 +214,35 @@
<Item Name="[size]">m_Array.node_count</Item>
<IndexListItems>
<Size>m_Array.node_count</Size>
<ValueNode>**(SwFrameFormat**)((char*)(m_PosIndex.ptrs.spc.data_[$i]) - 0x10)</ValueNode>
<ValueNode>**reinterpret_cast < value_type* > (&static_cast < ByPos::node_type* > (static_cast < ByPos::node_type::trampoline* > (m_PosIndex.ptrs.spc.data_[$i]))->space)</ValueNode>
</IndexListItems>
</Expand>
</Type>
<Type Name="SwFormat">
<DisplayString>Format: "{m_aFormatName,sub}"</DisplayString>
</Type>
<Type Name="com::sun::star::uno::BaseReference">
<DisplayString Condition="_pInterface == nullptr">empty</DisplayString>
<DisplayString>{{{_pInterface}}}</DisplayString>
</Type>
<Type Name="com::sun::star::uno::Reference < * >">
<DisplayString Condition="_pInterface == nullptr">empty</DisplayString>
<DisplayString>{{{reinterpret_cast < $T1 * >(_pInterface)}}}</DisplayString>
<Expand>
<ExpandedItem>reinterpret_cast < $T1 * >(_pInterface)</ExpandedItem>
</Expand>
</Type>
<Type Name="rtl::Reference < * >">
<DisplayString Condition="m_pBody == nullptr">empty</DisplayString>
<DisplayString>{{{reinterpret_cast < $T1 * >(m_pBody)}}}</DisplayString>
<Expand>
<ExpandedItem>reinterpret_cast < $T1 * >(m_pBody)</ExpandedItem>
</Expand>
</Type>
<Type Name="VclPtr < * >">
<DisplayString>{m_rInnerRef}</DisplayString>
<Expand>
<ExpandedItem>m_rInnerRef</ExpandedItem>
</Expand>
</Type>
</AutoVisualizer>
\ No newline at end of file
\ No newline at end of file