mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-19 19:13:22 +08:00
[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:
parent
22cf80c801
commit
c340df4e6c
@ -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
|
@ -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
|
||||
|
@ -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" )
|
||||
|
||||
|
@ -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() )
|
||||
|
Loading…
Reference in New Issue
Block a user