[0.1.x] added : method asMap for typeInfo ( only for enumerators )

git-svn-id: https://pykd.svn.codeplex.com/svn@72763 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2011-12-29 15:50:44 +00:00 committed by Mikhail I. Izmestev
parent 670659121b
commit c465d4c110
6 changed files with 56 additions and 11 deletions

View File

@ -468,7 +468,8 @@ BOOST_PYTHON_MODULE( pykd )
.def( "bitOffset", &TypeInfo::getBitOffset ) .def( "bitOffset", &TypeInfo::getBitOffset )
.def( "bitWidth", &TypeInfo::getBitWidth ) .def( "bitWidth", &TypeInfo::getBitWidth )
.def( "field", &TypeInfo::getField ) .def( "field", &TypeInfo::getField )
.def( "__getattr__", &TypeInfo::getField ); .def( "__getattr__", &TypeInfo::getField )
.def( "asMap", &TypeInfo::asMap );
python::class_<TypedVar, TypedVarPtr, python::bases<intBase>, boost::noncopyable >("typedVar", python::class_<TypedVar, TypedVarPtr, python::bases<intBase>, boost::noncopyable >("typedVar",
"Class of non-primitive type object, child class of typeClass. Data from target is copied into object instance", "Class of non-primitive type object, child class of typeClass. Data from target is copied into object instance",

View File

@ -66,12 +66,26 @@ std::list< SymbolPtr > Symbol::findChildrenImpl(
) )
{ {
DiaEnumSymbolsPtr symbols; DiaEnumSymbolsPtr symbols;
HRESULT hres = HRESULT hres;
m_symbol->findChildren(
static_cast<enum SymTagEnum>(symTag), if ( name.empty() )
toWStr(name), {
nameCmpFlags, hres = m_symbol->findChildren(
&symbols); static_cast<enum SymTagEnum>(symTag),
NULL,
nameCmpFlags,
&symbols);
}
else
{
hres = m_symbol->findChildren(
static_cast<enum SymTagEnum>(symTag),
toWStr(name),
nameCmpFlags,
&symbols);
}
if (S_OK != hres) if (S_OK != hres)
throw Exception("Call IDiaSymbol::findChildren", hres); throw Exception("Call IDiaSymbol::findChildren", hres);

View File

@ -53,8 +53,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,1,0,3 FILEVERSION 0,1,0,4
PRODUCTVERSION 0,1,0,3 PRODUCTVERSION 0,1,0,4
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -70,11 +70,11 @@ BEGIN
BLOCK "041904b0" BLOCK "041904b0"
BEGIN BEGIN
VALUE "FileDescription", "pykd - python extension for windbg" VALUE "FileDescription", "pykd - python extension for windbg"
VALUE "FileVersion", "0, 1, 0, 3" VALUE "FileVersion", "0, 1, 0, 4"
VALUE "InternalName", "pykd" VALUE "InternalName", "pykd"
VALUE "OriginalFilename", "pykd.dll" VALUE "OriginalFilename", "pykd.dll"
VALUE "ProductName", "pykd - python extension for windbg" VALUE "ProductName", "pykd - python extension for windbg"
VALUE "ProductVersion", "0, 1, 0, 3" VALUE "ProductVersion", "0, 1, 0, 4"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -388,6 +388,27 @@ TypeInfoPtr TypeInfo::getRecurciveComplexType( TypeInfoPtr &lowestType, std::str
return lowestType; return lowestType;
} }
/////////////////////////////////////////////////////////////////////////////////////
python::dict EnumTypeInfo::asMap()
{
python::dict dct;
std::list< pyDia::SymbolPtr > symbolsList = m_dia->findChildrenImpl(SymTagData, "", nsfCaseSensitive );
for ( std::list< pyDia::SymbolPtr >::iterator it = symbolsList.begin(); it != symbolsList.end(); it++ )
{
CComVariant val;
(*it)->getValue( val );
dct[val.ulVal] = (*it)->getName();
}
return dct;
}
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
}; // end namespace pykd }; // end namespace pykd

View File

@ -82,6 +82,9 @@ public:
return 8 * getSize(); return 8 * getSize();
} }
virtual python::dict asMap() {
throw DbgException( "there is no fields" );
}
ULONG getOffset() { ULONG getOffset() {
return m_offset; return m_offset;
@ -243,6 +246,8 @@ protected:
return ti; return ti;
} }
virtual python::dict asMap();
virtual bool isEnum() { virtual bool isEnum() {
return true; return true;
} }

View File

@ -101,3 +101,7 @@ class TypeInfoTest( unittest.TestCase ):
self.assertEqual( 0, ti.m_doubleValue.offset() ) self.assertEqual( 0, ti.m_doubleValue.offset() )
self.assertEqual( 0, ti.m_bits.offset() ) self.assertEqual( 0, ti.m_bits.offset() )
self.assertEqual( ti.size(), ti.m_doubleValue.size() ) self.assertEqual( ti.size(), ti.m_doubleValue.size() )
def testAsMap(self):
ti = target.module.type("enumType")
self.assertEqual( { 1 : "ONE", 2 : "TWO", 3 : "THREE" }, ti.asMap() )