mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 11:34:53 +08:00
added : typedVar.hasField ( check if a typedVar object has the specified field )
This commit is contained in:
parent
3ab64bdc85
commit
924c31a9e0
@ -887,7 +887,7 @@ void pykd_init()
|
|||||||
.def("getFixedFileInfo", ModuleAdapter::getFixedFileInfo,
|
.def("getFixedFileInfo", ModuleAdapter::getFixedFileInfo,
|
||||||
"Return FixedFileInfo" )
|
"Return FixedFileInfo" )
|
||||||
.def("hasSymbol", ModuleAdapter::isContainedSymbol,
|
.def("hasSymbol", ModuleAdapter::isContainedSymbol,
|
||||||
"Check if module has the specified symbol")
|
"Check if a module has the specified symbol")
|
||||||
.def("__getattr__", ModuleAdapter::getAttrByName,
|
.def("__getattr__", ModuleAdapter::getAttrByName,
|
||||||
"Return symbol offset or type as attribute" )
|
"Return symbol offset or type as attribute" )
|
||||||
.def("__getitem__", ModuleAdapter::getItemByKey,
|
.def("__getitem__", ModuleAdapter::getItemByKey,
|
||||||
@ -1037,12 +1037,16 @@ void pykd_init()
|
|||||||
"Set field of structure")
|
"Set field of structure")
|
||||||
.def("setField", TypedVarAdapter::setElementByIndex,
|
.def("setField", TypedVarAdapter::setElementByIndex,
|
||||||
"Set field of a structire or an element od array")
|
"Set field of a structire or an element od array")
|
||||||
|
.def("hasField", TypedVarAdapter::hasField,
|
||||||
|
"Check if a typedVar object has the specified field")
|
||||||
.def( "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" )
|
||||||
.def("method", TypedVarAdapter::getMethodByName, ( python::arg("name"), python::arg("prototype") = "" ),
|
.def("method", TypedVarAdapter::getMethodByName, ( python::arg("name"), python::arg("prototype") = "" ),
|
||||||
"Return method of class as an object attribute" )
|
"Return method of class as an object attribute" )
|
||||||
|
.def("hasMethod", TypedVarAdapter::hasMethod,
|
||||||
|
"Check if a typedVar object has the specified method")
|
||||||
.def("deref",TypedVarAdapter::deref,
|
.def("deref",TypedVarAdapter::deref,
|
||||||
"Return value by pointer" )
|
"Return value by pointer" )
|
||||||
.def("rawBytes", TypedVarAdapter::getRawBytes,
|
.def("rawBytes", TypedVarAdapter::getRawBytes,
|
||||||
@ -1066,7 +1070,7 @@ void pykd_init()
|
|||||||
.def("__dir__", TypedVarAdapter::getElementsDir)
|
.def("__dir__", TypedVarAdapter::getElementsDir)
|
||||||
.def("__call__", python::raw_function(pykd::callFunctionByVar, 0) )
|
.def("__call__", python::raw_function(pykd::callFunctionByVar, 0) )
|
||||||
.def("__iter__", TypedVarAdapter::getArrayIter, python::return_value_policy<python::manage_new_object>())
|
.def("__iter__", TypedVarAdapter::getArrayIter, python::return_value_policy<python::manage_new_object>())
|
||||||
.def("__contains__", TypedVarAdapter::isContainedField)
|
.def("__contains__", TypedVarAdapter::hasField)
|
||||||
#if PY_VERSION_HEX >= 0x03000000
|
#if PY_VERSION_HEX >= 0x03000000
|
||||||
.def("__bool__", TypedVarAdapter::isNotZero)
|
.def("__bool__", TypedVarAdapter::isNotZero)
|
||||||
#else
|
#else
|
||||||
|
@ -138,7 +138,7 @@ python::list TypedVarAdapter::getFields( kdlib::TypedVar& typedVar )
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
bool TypedVarAdapter::isContainedField(kdlib::TypedVarPtr& typedVar, const std::wstring& fieldName)
|
bool TypedVarAdapter::hasField(kdlib::TypedVarPtr& typedVar, const std::wstring &fieldName)
|
||||||
{
|
{
|
||||||
AutoRestorePyState pystate;
|
AutoRestorePyState pystate;
|
||||||
|
|
||||||
@ -154,6 +154,23 @@ bool TypedVarAdapter::isContainedField(kdlib::TypedVarPtr& typedVar, const std::
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool TypedVarAdapter::hasMethod(kdlib::TypedVarPtr& typedVar, const std::wstring &name)
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
|
||||||
|
try {
|
||||||
|
typedVar->getMethod(name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (kdlib::DbgException&)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
python::list TypedVarAdapter::getElementsDir(kdlib::TypedVar& typedVar)
|
python::list TypedVarAdapter::getElementsDir(kdlib::TypedVar& typedVar)
|
||||||
{
|
{
|
||||||
std::list<std::wstring> lst;
|
std::list<std::wstring> lst;
|
||||||
@ -197,32 +214,8 @@ kdlib::TypedVarPtr TypedVarAdapter::getFieldAttr(kdlib::TypedVar& typedVar, cons
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
return typedVar.getMethod(name);
|
return typedVar.getMethod(name);
|
||||||
|
|
||||||
//{
|
|
||||||
|
|
||||||
// AutoRestorePyState pystate;
|
|
||||||
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// return typedVar.getElement( name );
|
|
||||||
// }
|
|
||||||
// catch (kdlib::TypeException&)
|
|
||||||
// {}
|
|
||||||
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// return typedVar.getMethod( name );
|
|
||||||
// }
|
|
||||||
// catch (kdlib::TypeException&)
|
|
||||||
// {}
|
|
||||||
//}
|
|
||||||
|
|
||||||
//std::wstringstream sstr;
|
|
||||||
//sstr << L"typed var has no field " << L'\'' << name << L'\'';
|
|
||||||
//throw AttributeException(std::string(_bstr_t(sstr.str().c_str())).c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
python::list TypedVarAdapter::getRawBytes(kdlib::TypedVar& typedVar)
|
python::list TypedVarAdapter::getRawBytes(kdlib::TypedVar& typedVar)
|
||||||
@ -291,7 +284,6 @@ void TypedVarAdapter::setFieldAttr(kdlib::TypedVar& typedVar, const std::wstring
|
|||||||
kdlib::TypedVarPtr TypedVarAdapter::getFieldByKey(kdlib::TypedVar& typedVar, const std::wstring &name)
|
kdlib::TypedVarPtr TypedVarAdapter::getFieldByKey(kdlib::TypedVar& typedVar, const std::wstring &name)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|
||||||
AutoRestorePyState pystate;
|
AutoRestorePyState pystate;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -143,6 +143,10 @@ struct TypedVarAdapter {
|
|||||||
|
|
||||||
static void setField(kdlib::TypedVar& typedVar, const std::wstring &name, python::object& object);
|
static void setField(kdlib::TypedVar& typedVar, const std::wstring &name, python::object& object);
|
||||||
|
|
||||||
|
static bool hasField(kdlib::TypedVarPtr& typedVar, const std::wstring &name);
|
||||||
|
|
||||||
|
static bool hasMethod(kdlib::TypedVarPtr& typedVar, const std::wstring &name);
|
||||||
|
|
||||||
static kdlib::TypedVarPtr getFieldAttr(kdlib::TypedVar& typedVar, const std::wstring &name);
|
static kdlib::TypedVarPtr getFieldAttr(kdlib::TypedVar& typedVar, const std::wstring &name);
|
||||||
|
|
||||||
static void setFieldAttr(kdlib::TypedVar& typedVar, const std::wstring &name, python::object& object);
|
static void setFieldAttr(kdlib::TypedVar& typedVar, const std::wstring &name, python::object& object);
|
||||||
@ -229,7 +233,6 @@ struct TypedVarAdapter {
|
|||||||
return new TypedVarIterator(typedVar);
|
return new TypedVarIterator(typedVar);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isContainedField(kdlib::TypedVarPtr& typedVar, const std::wstring& fieldName);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
kdlib::TypedValue getTypdedValueFromPyObj(const python::object& value);
|
kdlib::TypedValue getTypdedValueFromPyObj(const python::object& value);
|
||||||
|
@ -437,11 +437,8 @@ class TypedVarTest( unittest.TestCase ):
|
|||||||
|
|
||||||
def testAttr(self):
|
def testAttr(self):
|
||||||
var = target.module.typedVar("structTest", [0x55] * 20 )
|
var = target.module.typedVar("structTest", [0x55] * 20 )
|
||||||
self.assertTrue(hasattr(var, "m_field3"))
|
|
||||||
setattr(var, "m_field1", 11)
|
setattr(var, "m_field1", 11)
|
||||||
self.assertEqual(11, getattr(var, "m_field1"))
|
self.assertEqual(11, getattr(var, "m_field1"))
|
||||||
|
|
||||||
self.assertFalse(hasattr(var, "noexisit"))
|
|
||||||
self.assertRaises(pykd.SymbolException, lambda x: getattr(x, "noexists"), var)
|
self.assertRaises(pykd.SymbolException, lambda x: getattr(x, "noexists"), var)
|
||||||
|
|
||||||
def testEvalPyScope(self):
|
def testEvalPyScope(self):
|
||||||
@ -465,8 +462,8 @@ class TypedVarTest( unittest.TestCase ):
|
|||||||
v1 = 100
|
v1 = 100
|
||||||
v2 = -500
|
v2 = -500
|
||||||
scope = { "v1" : v1, "v2" : v2 }
|
scope = { "v1" : v1, "v2" : v2 }
|
||||||
self.assertEqual( v1 + v2, pykd.evalExpr("v1 + v2", scope) )
|
self.assertEqual( v1 + v2, pykd.evalExpr("v1 + v2", scope))
|
||||||
self.assertEqual( v1 * v2, pykd.evalExpr("v1 * v2", locals()) )
|
self.assertEqual( v1 * v2, pykd.evalExpr("v1 * v2", locals()))
|
||||||
|
|
||||||
def testEvalExprScopeStruct(self):
|
def testEvalExprScopeStruct(self):
|
||||||
var = pykd.typedVar("g_structTest1")
|
var = pykd.typedVar("g_structTest1")
|
||||||
@ -485,4 +482,15 @@ class TypedVarTest( unittest.TestCase ):
|
|||||||
self.assertFalse("NotExist" in var)
|
self.assertFalse("NotExist" in var)
|
||||||
self.assertRaises(Exception, lambda var : 2 in var, var)
|
self.assertRaises(Exception, lambda var : 2 in var, var)
|
||||||
|
|
||||||
|
def testHasField(self):
|
||||||
|
var = pykd.typedVar("g_structTest")
|
||||||
|
self.assertTrue(var.hasField("m_field1"))
|
||||||
|
self.assertFalse(var.hasField("NotExist"))
|
||||||
|
|
||||||
|
def testHasMethod(self):
|
||||||
|
var = pykd.typedVar("g_classChild")
|
||||||
|
self.assertTrue(var.hasMethod("childMethod"))
|
||||||
|
self.assertTrue(var.hasMethod("staticMethod"))
|
||||||
|
self.assertTrue(var.hasMethod("virtMethod1"))
|
||||||
|
self.assertFalse(var.hasMethod("notExist"))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user