[0.1.x] update : output type name for "complex" type ( mixed array and pointers )

git-svn-id: https://pykd.svn.codeplex.com/svn@72039 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2011-12-05 07:48:46 +00:00 committed by Mikhail I. Izmestev
parent 22cf80c801
commit c340df4e6c
4 changed files with 85 additions and 82 deletions

View File

@ -160,7 +160,8 @@ PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symScope, const std::string
std::string PointerTypeInfo::getName()
{
return m_derefType->getName() + '*';
//return m_derefType->getName() + '*';
return getComplexName();
}
/////////////////////////////////////////////////////////////////////////////////////
@ -190,11 +191,12 @@ ArrayTypeInfo::ArrayTypeInfo( pyDia::SymbolPtr &symScope, const std::string &sym
std::string ArrayTypeInfo::getName()
{
std::stringstream sstr;
//std::stringstream sstr;
sstr << m_derefType->getName() << '[' << m_count << ']';
//sstr << m_derefType->getName() << '[' << m_count << ']';
return sstr.str();
//return sstr.str();
return getComplexName();
}
/////////////////////////////////////////////////////////////////////////////////////
@ -206,4 +208,56 @@ ULONG ArrayTypeInfo::getSize()
/////////////////////////////////////////////////////////////////////////////////////
std::string TypeInfo::getComplexName()
{
std::string name;
TypeInfo *typeInfo = this;
do {
if ( typeInfo->isArray() )
{
std::vector<ULONG> indices;
do {
indices.push_back( typeInfo->getCount() );
}
while( ( typeInfo = dynamic_cast<ArrayTypeInfo*>(typeInfo)->getDerefType().get() )->isArray() );
if ( !name.empty() )
{
name.insert( 0, 1, '(' );
name.insert( name.size(), 1, ')' );
}
std::stringstream sstr;
for ( std::vector<ULONG>::iterator it = indices.begin(); it != indices.end(); ++it )
sstr << '[' << *it << ']';
name += sstr.str();
continue;
}
else
if ( typeInfo->isPointer() )
{
name.insert( 0, 1, '*' );
typeInfo = dynamic_cast<PointerTypeInfo*>(typeInfo)->getDerefType().get();
continue;
}
break;
} while ( true );
name.insert( 0, typeInfo->getName() );
return name;
}
/////////////////////////////////////////////////////////////////////////////////////
}; // end namespace pykd

View File

@ -71,6 +71,8 @@ public:
protected:
std::string getComplexName();
ULONG m_offset;
};
@ -194,6 +196,11 @@ public:
return true;
}
TypeInfoPtr getDerefType() {
return m_derefType;
}
private:
TypeInfoPtr m_derefType;
@ -231,6 +238,11 @@ public:
return m_derefType;
}
TypeInfoPtr getDerefType() {
return m_derefType;
}
private:
@ -241,66 +253,4 @@ private:
///////////////////////////////////////////////////////////////////////////////////
//
//class TypeInfo {
//
//public:
//
// TypeInfo( pyDia::GlobalScopePtr &diaScope, const std::string &symName );
//
// TypeInfo( pyDia::SymbolPtr &diaType ) :
// m_offset( 0 ),
// m_dia( diaType )
// {}
//
// TypeInfo
// getField( const std::string &fieldName ) {
// pyDia::SymbolPtr field = m_dia->getChildByName( fieldName );
// TypeInfo ti( field->getType() );
// ti.m_offset = field->getOffset();
// return ti;
// }
//
// std::string
// getName();
//
// ULONG
// getOffset() {
// return m_offset;
// }
//
// ULONG
// getSize() {
// return (ULONG)m_dia->getSize();
// }
//
// bool
// isBasicType();
//
// bool
// isArrayType();
//
// bool
// isPointer();
//
// bool
// isUserDefined();
//
//private:
//
// pyDia::SymbolPtr m_dia;
//
// ULONG m_offset;
//
//};
///////////////////////////////////////////////////////////////////////////////////
}; // namespace pykd

View File

@ -56,6 +56,7 @@ if __name__ == "__main__":
target.module.reload();
suite = getTestSuite()
#suite = getTestSuite( "typeinfo.TypeInfoTest.testCreateBySymbol" )
#suite = getTestSuite( "intbase.IntBaseTest.testLongConvert" )
#suite = getTestSuite( "typedvar.TypedVarTest.testStruct" )

View File

@ -15,10 +15,21 @@ class TypeInfoTest( unittest.TestCase ):
def testCreateByName( self ):
""" creating typeInfo by the type name """
#self.assertEqual( "structTest", target.module.type( "structTest" ).name() )
#self.assertEqual( "structTest**", target.module.type( "structTest**" ).name() )
self.assertEqual( "structTest", target.module.type( "structTest" ).name() )
self.assertEqual( "structTest**", target.module.type( "structTest**" ).name() )
self.assertEqual( "Int4B[2][3]", target.module.type("Int4B[2][3]").name() )
def testCreateBySymbol(self):
""" creating typeInfo by the symbol name """
self.assertEqual( "structTest[2]", target.module.type("g_testArray").name() )
self.assertEqual( "Int4B[2][3]", target.module.type("intMatrix").name() )
self.assertEqual( "structTest*", target.module.type("g_structTestPtr").name() )
self.assertEqual( "structTest**", target.module.type("g_structTestPtrPtr").name() )
self.assertEqual( "Char*[2]", target.module.type("strArray").name() )
self.assertEqual( "Char*(*)[2]", target.module.type("ptrStrArray").name() )
self.assertEqual( "Int4B(*[4])[2][3]", target.module.type("arrIntMatrixPtrs").name() )
def testGetField( self ):
""" get field of the complex type """
ti1 = target.module.type( "structTest" )
@ -43,19 +54,6 @@ class TypeInfoTest( unittest.TestCase ):
self.assertEqual( "structTest", ti1.m_childField3.name() )
self.assertEqual( "structTest", target.module.type("g_structTest").name() )
def testPtrName( self ):
self.assertEqual( "structTest*", target.module.type("g_structTestPtr").name() )
self.assertEqual( "structTest**", target.module.type("g_structTestPtrPtr").name() )
self.assertEqual( "structTest**", target.module.type("structTest**").name() )
def testArrayName( self ):
self.assertEqual( "structTest[2]", target.module.type("g_testArray").name() )
self.assertEqual( "Int4B[2][3]", target.module.type("intMatrix").name() )
self.assertEqual( "Char*[2]", target.module.type("strArray").name() )
self.assertEqual( "Int4B[2][3]*",target.module.type("ptrIntMatrix").name() )
self.assertEqual( "Char*[2]*", target.module.type("ptrStrArray").name() )
self.assertEqual( "Int4B[2][3]", target.module.type("Int[2][3]").name() )
def testOffset( self ):
ti1 = target.module.type( "structTest" )
self.assertEqual( 0, ti1.m_field0.offset() )