added typedInfo.hasField method

This commit is contained in:
ussrhero 2019-06-01 00:24:17 +03:00
parent ee03c669ae
commit 5d5e634ace
5 changed files with 79 additions and 36 deletions

View File

@ -917,6 +917,8 @@ void pykd_init()
"Return field's type by index") "Return field's type by index")
.def("field", TypeInfoAdapter::getElementByName, .def("field", TypeInfoAdapter::getElementByName,
"Return field's type") "Return field's type")
.def("hasField", TypeInfoAdapter::hasField,
"Return True if type has a field with the specified name")
.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, .def( "fields", TypeInfoAdapter::getFields,
@ -927,6 +929,8 @@ void pykd_init()
"Return method's type by name") "Return method's type by name")
.def( "method", TypeInfoAdapter::getMethodByIndex, .def( "method", TypeInfoAdapter::getMethodByIndex,
"Return method's by index") "Return method's by index")
.def("hasMethod", TypeInfoAdapter::hasMethod,
"Return True if type has a method with the specified name")
.def( "methodName", TypeInfoAdapter::getMethodName, .def( "methodName", TypeInfoAdapter::getMethodName,
"Return method's name") "Return method's name")
.def( "methods", TypeInfoAdapter::getMethods, .def( "methods", TypeInfoAdapter::getMethods,
@ -986,7 +990,7 @@ void pykd_init()
.def( "__getitem__", TypeInfoAdapter::getElementByIndex ) .def( "__getitem__", TypeInfoAdapter::getElementByIndex )
.def( "__getitem__", TypeInfoAdapter::getElementByKey ) .def( "__getitem__", TypeInfoAdapter::getElementByKey )
.def( "__dir__", TypeInfoAdapter::getElementDir ) .def( "__dir__", TypeInfoAdapter::getElementDir )
.def("__contains__", TypeInfoAdapter::isContainedField) .def("__contains__", TypeInfoAdapter::hasFieldOrMethod)
#if PY_VERSION_HEX >= 0x03000000 #if PY_VERSION_HEX >= 0x03000000
.def("__bool__", TypeInfoAdapter::isZero ) .def("__bool__", TypeInfoAdapter::isZero )
#else #else

View File

@ -184,6 +184,9 @@ python::list TypedVarAdapter::getElementsDir(kdlib::TypedVar& typedVar)
kdlib::TypedVarPtr TypedVarAdapter::getFieldAttr(kdlib::TypedVar& typedVar, const std::wstring &name) kdlib::TypedVarPtr TypedVarAdapter::getFieldAttr(kdlib::TypedVar& typedVar, const std::wstring &name)
{ {
if (name == L"__name__")
throw AttributeException("no __name__ attribute");
AutoRestorePyState pystate; AutoRestorePyState pystate;
try try

View File

@ -103,9 +103,8 @@ python::list TypeInfoAdapter::getFields( kdlib::TypeInfo &typeInfo )
return pylst; return pylst;
} }
bool TypeInfoAdapter::isContainedField(kdlib::TypeInfoPtr& typeInfo, const std::wstring& fieldName) bool TypeInfoAdapter::hasFieldOrMethod(kdlib::TypeInfoPtr& typeInfo, const std::wstring& fieldName)
{ {
AutoRestorePyState pystate; AutoRestorePyState pystate;
for (size_t i = 0; i < typeInfo->getElementCount(); ++i) for (size_t i = 0; i < typeInfo->getElementCount(); ++i)
@ -115,6 +114,41 @@ bool TypeInfoAdapter::isContainedField(kdlib::TypeInfoPtr& typeInfo, const std::
return true; return true;
} }
for (size_t i = 0; i < typeInfo->getMethodsCount(); ++i)
{
std::wstring name = typeInfo->getMethodName(i);
if (name == fieldName)
return true;
}
return false;
}
bool TypeInfoAdapter::hasField(kdlib::TypeInfoPtr &typeInfo, const std::wstring &fieldName)
{
AutoRestorePyState pystate;
for (size_t i = 0; i < typeInfo->getElementCount(); ++i)
{
std::wstring name = typeInfo->getElementName(i);
if (name == fieldName)
return true;
}
return false;
}
bool TypeInfoAdapter::hasMethod(kdlib::TypeInfoPtr &typeInfo, const std::wstring &fieldName)
{
AutoRestorePyState pystate;
for (size_t i = 0; i < typeInfo->getMethodsCount(); ++i)
{
std::wstring name = typeInfo->getMethodName(i);
if (name == fieldName)
return true;
}
return false; return false;
} }

View File

@ -150,6 +150,10 @@ struct TypeInfoAdapter : public kdlib::TypeInfo {
return typeInfo.getElement(name); return typeInfo.getElement(name);
} }
static bool hasField(kdlib::TypeInfoPtr &typeInfo, const std::wstring &name);
static bool hasMethod(kdlib::TypeInfoPtr &typeInfo, const std::wstring &fieldName);
static kdlib::TypeInfoPtr getElementAttr(kdlib::TypeInfo &typeInfo, const std::wstring &name); static kdlib::TypeInfoPtr getElementAttr(kdlib::TypeInfo &typeInfo, const std::wstring &name);
static kdlib::TypeInfoPtr getElementByKey(kdlib::TypeInfo &typeInfo, const std::wstring &name); static kdlib::TypeInfoPtr getElementByKey(kdlib::TypeInfo &typeInfo, const std::wstring &name);
@ -334,7 +338,7 @@ struct TypeInfoAdapter : public kdlib::TypeInfo {
return false; return false;
} }
static bool isContainedField(kdlib::TypeInfoPtr& typedVar, const std::wstring& fieldName); static bool hasFieldOrMethod(kdlib::TypeInfoPtr& typedVar, const std::wstring& name);
}; };

View File

@ -40,11 +40,9 @@ class TypeInfoTest( unittest.TestCase ):
""" get field of the complex type """ """ get field of the complex type """
ti1 = target.module.type( "structTest" ) ti1 = target.module.type( "structTest" )
self.assertTrue( "UInt4B", ti1.m_field0.name() ) self.assertTrue( "UInt4B", ti1.m_field0.name() )
#self.assertTrue( "UInt4B", ti1["m_field0"].name() ) self.assertTrue( "m_field0" in ti1 )
self.assertTrue( hasattr( ti1, "m_field0" ) ) self.assertFalse( "not_exist" in ti1) # non-exsisting field
self.assertFalse( hasattr( ti1, "not_exists" ) )
self.assertRaises( pykd.SymbolException, lambda t: t.not_exists, ti1) # non-exsisting field self.assertRaises( pykd.SymbolException, lambda t: t.not_exists, ti1) # non-exsisting field
#self.assertRaises( KeyError, lambda t: t["not_exists"], ti1) # non-exsisting field
def testBaseTypes( self ): def testBaseTypes( self ):
@ -171,14 +169,14 @@ class TypeInfoTest( unittest.TestCase ):
def testNestedStruct( self ): def testNestedStruct( self ):
ti = target.module.type("structWithNested") ti = target.module.type("structWithNested")
self.assertTrue( hasattr( ti, "m_field" ) ) self.assertTrue( ti.hasField("m_field"))
self.assertTrue( hasattr( ti, "m_field3" ) ) self.assertTrue( ti.hasField("m_field3"))
self.assertTrue( hasattr( ti, "m_unnameStruct" ) ) self.assertTrue( ti.hasField("m_unnameStruct"))
self.assertTrue( hasattr( ti.m_unnameStruct, "m_field2" ) ) self.assertTrue( ti.m_unnameStruct.hasField("m_field2"))
self.assertFalse( hasattr( ti, "m_field2" ) ) self.assertFalse( ti.hasField( "m_field2" ) )
self.assertFalse( hasattr( ti, "m_nestedFiled" ) ) self.assertFalse( ti.hasField( "m_nestedFiled" ) )
ti = target.module.type("structWithNested::Nested") ti = target.module.type("structWithNested::Nested")
self.assertTrue( hasattr( ti, "m_nestedFiled" ) ) self.assertTrue( ti.hasField( "m_nestedFiled" ) )
def testPrint(self): def testPrint(self):
self.assertTrue( str(target.module.type( "ucharVar" ) ) ) self.assertTrue( str(target.module.type( "ucharVar" ) ) )