mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 03:23:23 +08:00
[0.3.x] added : typeInfo.fields methos ( return list of tuple ( filedName, fieldType ) )
git-svn-id: https://pykd.svn.codeplex.com/svn@87546 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
33761324e3
commit
fb823ae164
@ -528,6 +528,8 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
"Return field's type" )
|
"Return field's type" )
|
||||||
.def( "fieldName", TypeInfoAdapter::getElementName,
|
.def( "fieldName", TypeInfoAdapter::getElementName,
|
||||||
"Return name of struct field by index" )
|
"Return name of struct field by index" )
|
||||||
|
.def( "fields", TypeInfoAdapter::getFields,
|
||||||
|
"Return list of tuple ( filedName, fieldType )" )
|
||||||
.def( "deref", TypeInfoAdapter::deref,
|
.def( "deref", TypeInfoAdapter::deref,
|
||||||
"Return type of pointer" )
|
"Return type of pointer" )
|
||||||
.def( "append", TypeInfoAdapter::appendField,
|
.def( "append", TypeInfoAdapter::appendField,
|
||||||
@ -580,7 +582,7 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
"Return field of structure as an object attribute" )
|
"Return field of structure as an object attribute" )
|
||||||
.def("field", TypedVarAdapter::getElementByIndex,
|
.def("field", TypedVarAdapter::getElementByIndex,
|
||||||
"Return field of structure as an object attribute" )
|
"Return field of structure as an object attribute" )
|
||||||
.add_property( "fields", TypedVarAdapter::getFields,
|
.def( "fields", TypedVarAdapter::getFields,
|
||||||
"Return list of tuple ( filedName, fieldOffset, fieldValue )" )
|
"Return list of tuple ( filedName, fieldOffset, fieldValue )" )
|
||||||
.def( "fieldName", TypedVarAdapter::getElementName,
|
.def( "fieldName", TypedVarAdapter::getElementName,
|
||||||
"Return name of struct field by index" )
|
"Return name of struct field by index" )
|
||||||
|
@ -72,4 +72,34 @@ python::tuple findSymbolAndDisp( ULONG64 offset )
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
python::list TypeInfoAdapter::getFields( kdlib::TypeInfo &typeInfo )
|
||||||
|
{
|
||||||
|
typedef boost::tuple<std::wstring,kdlib::TypeInfoPtr> FieldTuple;
|
||||||
|
|
||||||
|
std::list<FieldTuple> lst;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
|
||||||
|
for ( size_t i = 0; i < typeInfo.getElementCount(); ++i )
|
||||||
|
{
|
||||||
|
std::wstring name = typeInfo.getElementName(i);
|
||||||
|
kdlib::TypeInfoPtr val = typeInfo.getElement(i);
|
||||||
|
|
||||||
|
lst.push_back( FieldTuple( name, val ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
} while(false);
|
||||||
|
|
||||||
|
python::list pylst;
|
||||||
|
|
||||||
|
for ( std::list<FieldTuple>::const_iterator it = lst.begin(); it != lst.end(); ++it)
|
||||||
|
pylst.append( python::make_tuple( it->get<0>(), it->get<1>() ) );
|
||||||
|
|
||||||
|
return pylst;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
} // pykd namespace
|
} // pykd namespace
|
||||||
|
@ -206,6 +206,8 @@ struct TypeInfoAdapter : public kdlib::TypeInfo {
|
|||||||
return typeInfo.str();
|
return typeInfo.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static python::list getFields( kdlib::TypeInfo &typeInfo );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BaseTypesEnum {
|
struct BaseTypesEnum {
|
||||||
|
@ -154,10 +154,6 @@ class TypeInfoTest( unittest.TestCase ):
|
|||||||
self.assertEqual( 0, ti.fieldOffset("m_structValue") )
|
self.assertEqual( 0, ti.fieldOffset("m_structValue") )
|
||||||
self.assertEqual( ti.size(), ti.m_structValue.size() )
|
self.assertEqual( ti.size(), ti.m_structValue.size() )
|
||||||
|
|
||||||
def testAsMap(self):
|
|
||||||
ti = target.module.type("enumType")
|
|
||||||
self.assertEqual( { 1 : "ONE", 2 : "TWO", 3 : "THREE" }, ti.asMap() )
|
|
||||||
|
|
||||||
def testDeref(self):
|
def testDeref(self):
|
||||||
ti = pykd.typeInfo("Int1B*")
|
ti = pykd.typeInfo("Int1B*")
|
||||||
self.assertEqual( "Int1B", ti.deref().name() )
|
self.assertEqual( "Int1B", ti.deref().name() )
|
||||||
@ -223,6 +219,12 @@ class TypeInfoTest( unittest.TestCase ):
|
|||||||
for field in ti:
|
for field in ti:
|
||||||
str( field )
|
str( field )
|
||||||
|
|
||||||
|
def testEnumSubscribe(self):
|
||||||
|
ti = pykd.typeInfo( "enumType" )
|
||||||
|
self.assertEqual( 3, len(ti) )
|
||||||
|
self.assertEqual( [ 1, 2, 3], [ long(field) for field in ti ] )
|
||||||
|
self.assertEqual( [ ( "ONE", 1), ("TWO", 2), ("THREE", 3) ], ti.fields() )
|
||||||
|
|
||||||
def testStructNullSize(self):
|
def testStructNullSize(self):
|
||||||
ti = target.module.type("structNullSize")
|
ti = target.module.type("structNullSize")
|
||||||
self.assertEqual( 0, len(ti) )
|
self.assertEqual( 0, len(ti) )
|
||||||
|
Loading…
Reference in New Issue
Block a user