[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
This commit is contained in:
SND\kernelnet_cp 2012-05-17 14:20:45 +00:00 committed by Mikhail I. Izmestev
parent 1fb0cb9e6c
commit 17f8fb721e
3 changed files with 31 additions and 1 deletions

View File

@ -170,6 +170,13 @@ ULONG Symbol::getCount()
return callSymbol(get_count); return callSymbol(get_count);
} }
////////////////////////////////////////////////////////////////////////////////
int Symbol::getVirtualBasePointerOffset()
{
return callSymbol( get_virtualBasePointerOffset);
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void Symbol::getValueImpl(IDiaSymbol *_symbol, VARIANT &vtValue) 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() ULONG Symbol::getBaseType()
{ {
return callSymbol(get_baseType); return callSymbol(get_baseType);

View File

@ -117,6 +117,10 @@ public:
bool isBasicType(); bool isBasicType();
bool isVirtualBaseClass();
bool isIndirectVirtualBaseClass();
ULONG getBaseType(); ULONG getBaseType();
ULONG getBitPosition(); ULONG getBitPosition();
@ -155,6 +159,8 @@ public:
bool eq(Symbol &rhs); bool eq(Symbol &rhs);
int getVirtualBasePointerOffset();
public: public:
typedef std::pair<ULONG, const char *> ValueNameEntry; typedef std::pair<ULONG, const char *> ValueNameEntry;

View File

@ -533,9 +533,12 @@ void UdtTypeInfo::getFields( pyDia::SymbolPtr &rootSym, ULONG startOffset )
ULONG symTag = childSym->getSymTag(); ULONG symTag = childSym->getSymTag();
if ( symTag == SymTagBaseClass ) if ( symTag == SymTagBaseClass )
{
if ( !childSym->isVirtualBaseClass() )
{ {
getFields( childSym, startOffset + childSym->getOffset() ); getFields( childSym, startOffset + childSym->getOffset() );
} }
}
else else
if ( symTag == SymTagData ) if ( symTag == SymTagData )
{ {