From 17f8fb721e25434e1dde718731ef38d5a1fc997f Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Thu, 17 May 2012 14:20:45 +0000 Subject: [PATCH] [0.1.x] workaround : #issue 10767 ( typeInfo raises symbolException for classes with diamond virtual inheritance ) - base virtual classes are ignored git-svn-id: https://pykd.svn.codeplex.com/svn@76401 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/diawrapper.cpp | 21 +++++++++++++++++++++ pykd/diawrapper.h | 6 ++++++ pykd/typeinfo.cpp | 5 ++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/pykd/diawrapper.cpp b/pykd/diawrapper.cpp index 67acb85..c70110f 100644 --- a/pykd/diawrapper.cpp +++ b/pykd/diawrapper.cpp @@ -170,6 +170,13 @@ ULONG Symbol::getCount() return callSymbol(get_count); } +//////////////////////////////////////////////////////////////////////////////// + +int Symbol::getVirtualBasePointerOffset() +{ + return callSymbol( get_virtualBasePointerOffset); +} + //////////////////////////////////////////////////////////////////////////////// void Symbol::getValueImpl(IDiaSymbol *_symbol, VARIANT &vtValue) { @@ -241,6 +248,20 @@ bool Symbol::isBasicType() //////////////////////////////////////////////////////////////////////////////// +bool Symbol::isVirtualBaseClass() +{ + return !!callSymbol(get_virtualBaseClass); +} + +//////////////////////////////////////////////////////////////////////////////// + +bool Symbol::isIndirectVirtualBaseClass() +{ + return !!callSymbol(get_indirectVirtualBaseClass); +} + +//////////////////////////////////////////////////////////////////////////////// + ULONG Symbol::getBaseType() { return callSymbol(get_baseType); diff --git a/pykd/diawrapper.h b/pykd/diawrapper.h index d9a54f7..2646716 100644 --- a/pykd/diawrapper.h +++ b/pykd/diawrapper.h @@ -117,6 +117,10 @@ public: bool isBasicType(); + bool isVirtualBaseClass(); + + bool isIndirectVirtualBaseClass(); + ULONG getBaseType(); ULONG getBitPosition(); @@ -155,6 +159,8 @@ public: bool eq(Symbol &rhs); + int getVirtualBasePointerOffset(); + public: typedef std::pair ValueNameEntry; diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index 97935a9..1ae8024 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -534,7 +534,10 @@ void UdtTypeInfo::getFields( pyDia::SymbolPtr &rootSym, ULONG startOffset ) if ( symTag == SymTagBaseClass ) { - getFields( childSym, startOffset + childSym->getOffset() ); + if ( !childSym->isVirtualBaseClass() ) + { + getFields( childSym, startOffset + childSym->getOffset() ); + } } else if ( symTag == SymTagData )