From 63f43f12d4d901ee24c58fc65f0985c067ca6ab9 Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Tue, 22 Mar 2022 18:42:21 -0700 Subject: [PATCH 1/2] fix regression in nested visualizations with VS2019+ --- natvis/object_visualizer.cpp | 47 ++++++++++++++---------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/natvis/object_visualizer.cpp b/natvis/object_visualizer.cpp index 6bb6b6deb..f02d32bf9 100644 --- a/natvis/object_visualizer.cpp +++ b/natvis/object_visualizer.cpp @@ -1,4 +1,5 @@ #include "pch.h" +#include #include #include "object_visualizer.h" #include "property_visualizer.h" @@ -631,11 +632,10 @@ HRESULT object_visualizer::CreateEvaluationResult(_Deref_out_ DkmEvaluationResul } HRESULT object_visualizer::GetChildren( - _In_ UINT32 /*InitialRequestSize*/, + _In_ UINT32 InitialRequestSize, _In_ DkmInspectionContext* pInspectionContext, _Out_ DkmArray* pInitialChildren, - _Deref_out_ DkmEvaluationResultEnumContext** ppEnumContext -) + _Deref_out_ DkmEvaluationResultEnumContext** ppEnumContext) { // Ignore metadata errors to ensure that Raw Data is always available if (m_propertyData.empty()) @@ -667,32 +667,34 @@ HRESULT object_visualizer::GetChildren( this, pEnumContext.put())); - DkmAllocArray(0, pInitialChildren); + IF_FAIL_RET(GetItems(m_pVisualizedExpression.get(), pEnumContext.get(), 0, InitialRequestSize, pInitialChildren)); + *ppEnumContext = pEnumContext.detach(); return S_OK; } HRESULT object_visualizer::GetItems( - _In_ DkmVisualizedExpression* /*pVisualizedExpression*/, + _In_ DkmVisualizedExpression* pVisualizedExpression, _In_ DkmEvaluationResultEnumContext* /*pEnumContext*/, _In_ UINT32 StartIndex, _In_ UINT32 Count, - _Out_ DkmArray* pItems -) + _Out_ DkmArray* pItems) { - std::list> childItems; + CAutoDkmArray resultValues; + IF_FAIL_RET(DkmAllocArray(std::min(m_propertyData.size(), size_t(Count)), &resultValues)); - auto pParent = m_pVisualizedExpression.get(); - for( auto childIndex = StartIndex; childIndex < StartIndex + Count; ++childIndex) + auto pParent = pVisualizedExpression; + auto childCount = std::min(m_propertyData.size(), size_t(Count + StartIndex)); + for(auto i = 0; i < childCount; ++i) { - auto& prop = m_propertyData[childIndex]; + auto& prop = m_propertyData[i + (size_t)StartIndex]; com_ptr pPropertyVisualized; - if(FAILED(CreateChildVisualizedExpression(prop, pParent, m_isAbiObject, pPropertyVisualized.put()))) + if (FAILED(CreateChildVisualizedExpression(prop, pParent, m_isAbiObject, pPropertyVisualized.put()))) { com_ptr pErrorMessage; IF_FAIL_RET(DkmString::Create(L"", pErrorMessage.put())); - + com_ptr pDisplayName; IF_FAIL_RET(DkmString::Create(prop.displayName.c_str(), pDisplayName.put())); @@ -701,9 +703,9 @@ HRESULT object_visualizer::GetItems( pParent->InspectionContext(), pParent->StackFrame(), pDisplayName.get(), - nullptr, + nullptr, pErrorMessage.get(), - DkmEvaluationResultFlags::ExceptionThrown, + DkmEvaluationResultFlags::ExceptionThrown, DkmDataItem::Null(), pVisualizedResult.put() )); @@ -721,22 +723,9 @@ HRESULT object_visualizer::GetItems( pPropertyVisualized.put() )); } - childItems.push_back(pPropertyVisualized); - } - - CAutoDkmArray resultValues; - IF_FAIL_RET(DkmAllocArray(childItems.size(), &resultValues)); - - UINT32 j = 0; - auto pos = childItems.begin(); - while (pos != childItems.end()) - { - com_ptr pCurr = *pos; - resultValues.Members[j++] = pCurr.detach(); - pos++; + resultValues.Members[i] = pPropertyVisualized.detach(); } *pItems = resultValues.Detach(); - return S_OK; } From 018cd8537fe8ea60024ad59cc9b69bd6ad353d1f Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Tue, 22 Mar 2022 19:46:03 -0700 Subject: [PATCH 2/2] bug in calculating child count --- natvis/object_visualizer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/natvis/object_visualizer.cpp b/natvis/object_visualizer.cpp index f02d32bf9..4b1f7efd5 100644 --- a/natvis/object_visualizer.cpp +++ b/natvis/object_visualizer.cpp @@ -1,5 +1,4 @@ #include "pch.h" -#include #include #include "object_visualizer.h" #include "property_visualizer.h" @@ -685,7 +684,7 @@ HRESULT object_visualizer::GetItems( IF_FAIL_RET(DkmAllocArray(std::min(m_propertyData.size(), size_t(Count)), &resultValues)); auto pParent = pVisualizedExpression; - auto childCount = std::min(m_propertyData.size(), size_t(Count + StartIndex)); + auto childCount = std::min(m_propertyData.size() - StartIndex, (size_t)Count); for(auto i = 0; i < childCount; ++i) { auto& prop = m_propertyData[i + (size_t)StartIndex];