[0.1.x] fixed : issue #10764 ( typedVar for class does not contain field for vtable )

git-svn-id: https://pykd.svn.codeplex.com/svn@76379 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2012-05-16 12:42:42 +00:00 committed by Mikhail I. Izmestev
parent 17ae054165
commit 8cc7a18f85
2 changed files with 22 additions and 11 deletions

View File

@ -259,15 +259,16 @@ std::string UdtTypedVar::print()
if ( fieldType->getStaticOffset() != 0 ) if ( fieldType->getStaticOffset() != 0 )
fieldVar = TypedVar::getTypedVar( m_client, fieldType, VarDataMemory::factory(m_dataSpaces, fieldType->getStaticOffset() ) ); fieldVar = TypedVar::getTypedVar( m_client, fieldType, VarDataMemory::factory(m_dataSpaces, fieldType->getStaticOffset() ) );
sstr << " =" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getStaticOffset(); sstr << " =" << std::right << std::setw(10) << std::setfill('0') << std::hex << fieldType->getStaticOffset();
sstr << " " << std::left << std::setw(18) << std::setfill(' ') << m_typeInfo->getFieldNameByIndex(i) << ':';
} }
else else
{ {
fieldVar = TypedVar::getTypedVar( m_client, fieldType, m_varData->fork(fieldType->getOffset()) ); fieldVar = TypedVar::getTypedVar( m_client, fieldType, m_varData->fork(fieldType->getOffset()) );
sstr << " +" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getOffset(); sstr << " +" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getOffset();
sstr << " " << std::left << std::setw(24) << std::setfill(' ') << m_typeInfo->getFieldNameByIndex(i) << ':';
} }
sstr << " " << std::left << std::setw( 20 ) << std::setfill(' ') << m_typeInfo->getFieldNameByIndex(i) << ':';
sstr << " " << std::left << fieldType->getName(); sstr << " " << std::left << fieldType->getName();
if ( fieldVar ) if ( fieldVar )

View File

@ -32,9 +32,11 @@ TypeInfoPtr TypeInfo::getTypeInfo( pyDia::SymbolPtr &typeSym )
return TypeInfoPtr( new ArrayTypeInfo( typeSym ) ); return TypeInfoPtr( new ArrayTypeInfo( typeSym ) );
case SymTagPointerType: case SymTagPointerType:
case SymTagVTable:
return TypeInfoPtr( new PointerTypeInfo( typeSym ) ); return TypeInfoPtr( new PointerTypeInfo( typeSym ) );
case SymTagVTable:
return TypeInfoPtr( new PointerTypeInfo( typeSym->getType() ) );
case SymTagEnum: case SymTagEnum:
return TypeInfoPtr( new EnumTypeInfo( typeSym ) ); return TypeInfoPtr( new EnumTypeInfo( typeSym ) );
@ -230,7 +232,7 @@ BitFieldTypeInfo::BitFieldTypeInfo( pyDia::SymbolPtr &symbol )
m_name = sstr.str(); m_name = sstr.str();
} }
///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symbol ) PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symbol )
{ {
@ -478,11 +480,11 @@ TypeInfoPtr UdtTypeInfo::getField( const std::string &fieldName )
if ( m_fields.empty() ) if ( m_fields.empty() )
getFields( m_dia ); getFields( m_dia );
FieldList::iterator it; FieldList::reverse_iterator it;
it = std::find_if( m_fields.begin(), m_fields.end(), boost::bind( &FieldType::first, _1) == fieldName ); it = std::find_if( m_fields.rbegin(), m_fields.rend(), boost::bind( &FieldType::first, _1) == fieldName );
if ( it == m_fields.end() ) if ( it == m_fields.rend() )
throw TypeException( m_dia->getName(), fieldName + ": unknown field type" ); throw TypeException( m_dia->getName(), fieldName + ": unknown field type" );
return it->second; return it->second;
@ -552,6 +554,13 @@ void UdtTypeInfo::getFields( pyDia::SymbolPtr &rootSym, ULONG startOffset )
m_fields.push_back( std::make_pair( childSym->getName(), ti ) ); m_fields.push_back( std::make_pair( childSym->getName(), ti ) );
} }
else
if ( symTag == SymTagVTable )
{
TypeInfoPtr ti = TypeInfo::getTypeInfo( m_dia, childSym );
m_fields.push_back( std::make_pair( "__VFN_table", ti ) );
}
} }
} }
@ -571,14 +580,15 @@ std::string UdtTypeInfo::print()
if ( fieldType->isStaticMember() ) if ( fieldType->isStaticMember() )
{ {
sstr << " =" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getStaticOffset(); sstr << " =" << std::right << std::setw(10) << std::setfill('0') << std::hex << fieldType->getStaticOffset();
sstr << " " << std::left << std::setw(18) << std::setfill(' ') << getFieldNameByIndex(i) << ':';
} }
else else
{ {
sstr << " +" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getOffset(); sstr << " +" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getOffset();
sstr << " " << std::left << std::setw(24) << std::setfill(' ') << getFieldNameByIndex(i) << ':';
} }
sstr << " " << std::left << std::setw( 20 ) << std::setfill(' ') << getFieldNameByIndex(i) << ':';
sstr << " " << std::left << fieldType->getName(); sstr << " " << std::left << fieldType->getName();
sstr << std::endl; sstr << std::endl;
} }