Skip to content

Commit 27adc6b

Browse files
authored
fix regression in nested visualizations with VS2019+ (#1126)
* fix regression in nested visualizations with VS2019+ * bug in calculating child count
1 parent f992bc4 commit 27adc6b

File tree

1 file changed

+17
-29
lines changed

1 file changed

+17
-29
lines changed

natvis/object_visualizer.cpp

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -631,11 +631,10 @@ HRESULT object_visualizer::CreateEvaluationResult(_Deref_out_ DkmEvaluationResul
631631
}
632632

633633
HRESULT object_visualizer::GetChildren(
634-
_In_ UINT32 /*InitialRequestSize*/,
634+
_In_ UINT32 InitialRequestSize,
635635
_In_ DkmInspectionContext* pInspectionContext,
636636
_Out_ DkmArray<DkmChildVisualizedExpression*>* pInitialChildren,
637-
_Deref_out_ DkmEvaluationResultEnumContext** ppEnumContext
638-
)
637+
_Deref_out_ DkmEvaluationResultEnumContext** ppEnumContext)
639638
{
640639
// Ignore metadata errors to ensure that Raw Data is always available
641640
if (m_propertyData.empty())
@@ -667,32 +666,34 @@ HRESULT object_visualizer::GetChildren(
667666
this,
668667
pEnumContext.put()));
669668

670-
DkmAllocArray(0, pInitialChildren);
669+
IF_FAIL_RET(GetItems(m_pVisualizedExpression.get(), pEnumContext.get(), 0, InitialRequestSize, pInitialChildren));
670+
671671
*ppEnumContext = pEnumContext.detach();
672672

673673
return S_OK;
674674
}
675675

676676
HRESULT object_visualizer::GetItems(
677-
_In_ DkmVisualizedExpression* /*pVisualizedExpression*/,
677+
_In_ DkmVisualizedExpression* pVisualizedExpression,
678678
_In_ DkmEvaluationResultEnumContext* /*pEnumContext*/,
679679
_In_ UINT32 StartIndex,
680680
_In_ UINT32 Count,
681-
_Out_ DkmArray<DkmChildVisualizedExpression*>* pItems
682-
)
681+
_Out_ DkmArray<DkmChildVisualizedExpression*>* pItems)
683682
{
684-
std::list<com_ptr<DkmChildVisualizedExpression>> childItems;
683+
CAutoDkmArray<DkmChildVisualizedExpression*> resultValues;
684+
IF_FAIL_RET(DkmAllocArray(std::min(m_propertyData.size(), size_t(Count)), &resultValues));
685685

686-
auto pParent = m_pVisualizedExpression.get();
687-
for( auto childIndex = StartIndex; childIndex < StartIndex + Count; ++childIndex)
686+
auto pParent = pVisualizedExpression;
687+
auto childCount = std::min(m_propertyData.size() - StartIndex, (size_t)Count);
688+
for(auto i = 0; i < childCount; ++i)
688689
{
689-
auto& prop = m_propertyData[childIndex];
690+
auto& prop = m_propertyData[i + (size_t)StartIndex];
690691
com_ptr<DkmChildVisualizedExpression> pPropertyVisualized;
691-
if(FAILED(CreateChildVisualizedExpression(prop, pParent, m_isAbiObject, pPropertyVisualized.put())))
692+
if (FAILED(CreateChildVisualizedExpression(prop, pParent, m_isAbiObject, pPropertyVisualized.put())))
692693
{
693694
com_ptr<DkmString> pErrorMessage;
694695
IF_FAIL_RET(DkmString::Create(L"<Property evaluation failed>", pErrorMessage.put()));
695-
696+
696697
com_ptr<DkmString> pDisplayName;
697698
IF_FAIL_RET(DkmString::Create(prop.displayName.c_str(), pDisplayName.put()));
698699

@@ -701,9 +702,9 @@ HRESULT object_visualizer::GetItems(
701702
pParent->InspectionContext(),
702703
pParent->StackFrame(),
703704
pDisplayName.get(),
704-
nullptr,
705+
nullptr,
705706
pErrorMessage.get(),
706-
DkmEvaluationResultFlags::ExceptionThrown,
707+
DkmEvaluationResultFlags::ExceptionThrown,
707708
DkmDataItem::Null(),
708709
pVisualizedResult.put()
709710
));
@@ -721,22 +722,9 @@ HRESULT object_visualizer::GetItems(
721722
pPropertyVisualized.put()
722723
));
723724
}
724-
childItems.push_back(pPropertyVisualized);
725-
}
726-
727-
CAutoDkmArray<DkmChildVisualizedExpression*> resultValues;
728-
IF_FAIL_RET(DkmAllocArray(childItems.size(), &resultValues));
729-
730-
UINT32 j = 0;
731-
auto pos = childItems.begin();
732-
while (pos != childItems.end())
733-
{
734-
com_ptr<DkmChildVisualizedExpression> pCurr = *pos;
735-
resultValues.Members[j++] = pCurr.detach();
736-
pos++;
725+
resultValues.Members[i] = pPropertyVisualized.detach();
737726
}
738727

739728
*pItems = resultValues.Detach();
740-
741729
return S_OK;
742730
}

0 commit comments

Comments
 (0)