[0.1.x] fixed : typedVar __str__ converter

git-svn-id: https://pykd.svn.codeplex.com/svn@74849 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2012-03-11 14:54:03 +00:00 committed by Mikhail I. Izmestev
parent 70d40017ac
commit 1a87bf5e64
6 changed files with 39 additions and 13 deletions

View File

@ -102,11 +102,12 @@ BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_loadSignDWords, DebugClient:
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_loadSignQWords, DebugClient::loadSignQWords, 2, 3 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_compareMemory, DebugClient::compareMemory, 3, 4 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_getLocals, DebugClient::getLocals, 0, 1 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( pyDia_Symbol_findChildrenEx, pyDia::Symbol::findChildrenEx, 1, 3 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_setSoftwareBp, DebugClient::setSoftwareBp, 1, 2 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_setHardwareBp, DebugClient::setHardwareBp, 3, 4 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( StackFrame_getLocals, StackFrame::getLocals, 0, 1 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( pyDia_Symbol_findChildrenEx, pyDia::Symbol::findChildrenEx, 1, 3 );
#define DEF_PY_CONST_ULONG(x) \
python::scope().attr(#x) = ULONG(##x)
@ -723,8 +724,8 @@ BOOST_PYTHON_MODULE( pykd )
"Retrieves the type of the target CPU: IMAGE_FILE_MACHINE_XXX")
.def( "__str__", &pyDia::Symbol::print)
.def("__getitem__", &pyDia::Symbol::getChildByName)
.def("__len__", &pyDia::Symbol::getChildCount )
.def("__getitem__", &pyDia::Symbol::getChildByIndex)
.def("__len__", (ULONG (pyDia::Symbol::*)())&pyDia::Symbol::getChildCount )
.def("__getitem__", (pyDia::SymbolPtr(pyDia::Symbol::*)(ULONG) )&pyDia::Symbol::getChildByIndex)
.def("__eq__", &pyDia::Symbol::eq)
.def("__hash__", &pyDia::Symbol::getIndexId);

View File

@ -316,12 +316,12 @@ SymbolPtr Symbol::getChildByName(const std::string &_name)
////////////////////////////////////////////////////////////////////////////////
ULONG Symbol::getChildCount()
ULONG Symbol::getChildCount( ULONG symTag )
{
DiaEnumSymbolsPtr symbols;
HRESULT hres =
m_symbol->findChildren(
SymTagNull,
static_cast<enum SymTagEnum>(symTag),
NULL,
nsCaseSensitive,
&symbols);
@ -338,12 +338,12 @@ ULONG Symbol::getChildCount()
////////////////////////////////////////////////////////////////////////////////
SymbolPtr Symbol::getChildByIndex(ULONG _index)
SymbolPtr Symbol::getChildByIndex(ULONG _index, ULONG symTag )
{
DiaEnumSymbolsPtr symbols;
HRESULT hres =
m_symbol->findChildren(
SymTagNull,
static_cast<enum SymTagEnum>(symTag),
NULL,
nsCaseSensitive,
&symbols);

View File

@ -133,8 +133,10 @@ public:
}
SymbolPtr getChildByName(const std::string &_name);
ULONG getChildCount();
SymbolPtr getChildByIndex(ULONG _index);
ULONG getChildCount( ULONG symTag = SymTagNull );
SymbolPtr getChildByIndex(ULONG _index, ULONG symTag = SymTagNull );
bool isConstant();

View File

@ -15,6 +15,7 @@ TypeInfoPtr TypeInfo::getTypeInfo( pyDia::SymbolPtr &typeSym )
return getBaseTypeInfo( typeSym );
case SymTagUDT:
case SymTagBaseClass:
return TypeInfoPtr( new UdtTypeInfo( typeSym ) );
case SymTagArrayType:
@ -479,10 +480,10 @@ TypeInfoPtr UdtTypeInfo::getFieldByIndex( ULONG index )
std::string UdtTypeInfo::getFieldNameByIndex( ULONG index )
{
if ( index >= m_dia->getChildCount() )
if ( index >= m_dia->getChildCount( SymTagData ) )
throw TypeException( m_dia->getName(), ": field not found" );
pyDia::SymbolPtr field = m_dia->getChildByIndex(index);
pyDia::SymbolPtr field = m_dia->getChildByIndex(index, SymTagData);
if ( !field )
throw TypeException( m_dia->getName(), ": field not found" );
@ -494,7 +495,7 @@ std::string UdtTypeInfo::getFieldNameByIndex( ULONG index )
ULONG UdtTypeInfo::getFieldCount()
{
return m_dia->getChildCount();
return m_dia->getChildCount( SymTagData );
}
/////////////////////////////////////////////////////////////////////////////////////

View File

@ -189,3 +189,25 @@ class TypedVarTest( unittest.TestCase ):
tv2 = target.module.typedVar( "structTest", tv1 )
self.assertEqual( tv1, tv2 )
self.assertTrue( tv1 )
def testPrint(self):
self.assertTrue( str(target.module.typedVar( "g_ucharValue" ) ) )
self.assertTrue( str(target.module.typedVar( "g_ushortValue" ) ) )
self.assertTrue( str(target.module.typedVar( "g_ulongValue" ) ) )
self.assertTrue( str(target.module.typedVar( "g_ulonglongValue" ) ) )
self.assertTrue( str(target.module.typedVar( "g_structWithBits" ) ) )
self.assertTrue( str(target.module.typedVar( "g_structTest" ) ) )
self.assertTrue( str(target.module.typedVar( "g_structTest1" ) ) )
self.assertTrue( str(target.module.typedVar( "g_testArray" ) ) )
self.assertTrue( str(target.module.typedVar( "g_structTestPtr" ) ) )
self.assertTrue( str(target.module.typedVar( "g_structTestPtrPtr" ) ) )
self.assertTrue( str(target.module.typedVar( "longlongArray" ) ) )
self.assertTrue( str(target.module.typedVar( "intMatrix4" ) ) )
self.assertTrue( str(target.module.typedVar( "ptrIntMatrix" ) ) )
self.assertTrue( str(target.module.typedVar( "g_classChild" ) ) )
self.assertTrue( str(target.module.typedVar( "g_struct3" ) ) )
self.assertTrue( str(target.module.typedVar( "g_listHead" ) ) )
self.assertTrue( str(target.module.typedVar( "g_voidPtr" ) ) )
self.assertTrue( str(target.module.typedVar( "g_arrOfPtrToFunc" ) ) )
self.assertTrue( str(target.module.typedVar( "g_unTypedPtrToFunction" ) ) )

View File

@ -237,7 +237,7 @@ StructWithNested g_structWithNested;
StructWithNested::Nested g_structNested;
WNDENUMPROC g_ptrToFunction;
void *g_unTypedPtrToFunction;
void *g_unTypedPtrToFunction = g_ptrToFunction;
#pragma pack( pop )
////////////////////////////////////////////////////////////////////////////////