[0.3.x] fixed some tests

git-svn-id: https://pykd.svn.codeplex.com/svn@83775 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2013-05-24 08:03:37 +00:00 committed by Mikhail I. Izmestev
parent 76aa1ed95d
commit c5b9a4ca93
6 changed files with 70 additions and 32 deletions

View File

@ -327,7 +327,7 @@ BOOST_PYTHON_MODULE( pykd )
// python::def( "setSymbolPath", &setSymbolPath, "Set current symbol path"); // python::def( "setSymbolPath", &setSymbolPath, "Set current symbol path");
// python::def( "appendSymbolPath", &appendSymbolPath, "Append current symbol path"); // python::def( "appendSymbolPath", &appendSymbolPath, "Append current symbol path");
python::class_<kdlib::NumBehavior, boost::noncopyable>( "numVariant", "numVariant", python::no_init ) python::class_<kdlib::NumBehavior, boost::noncopyable>( "numVariant", "numVariant", python::no_init )
.def("__init__", python::make_constructor(&NumVariantAdaptor::getVariant) ) .def("__init__", python::make_constructor(&NumVariantAdaptor::getVariant) )
.def( "__eq__", &NumVariantAdaptor::eq ) .def( "__eq__", &NumVariantAdaptor::eq )
.def( "__ne__", &NumVariantAdaptor::ne) .def( "__ne__", &NumVariantAdaptor::ne)
@ -367,10 +367,7 @@ python::class_<kdlib::NumBehavior, boost::noncopyable>( "numVariant", "numVarian
.def( "__hash__", &NumVariantAdaptor::long_ ) .def( "__hash__", &NumVariantAdaptor::long_ )
; ;
//python::implicitly_convertible<kdlib::NumVariantGetter, unsigned long long>(); NumVariantAdaptor::registerNumConvertion();
//python::implicitly_convertible<kdlib::NumVariantGetter, long long>();
//python::implicitly_convertible<kdlib::NumVariantGetter, unsigned long>();
//python::implicitly_convertible<kdlib::NumVariantGetter, long>();
python::class_<kdlib::Module, kdlib::ModulePtr, python::bases<kdlib::NumBehavior>, boost::noncopyable>("module", "Class representing executable module", python::no_init ) python::class_<kdlib::Module, kdlib::ModulePtr, python::bases<kdlib::NumBehavior>, boost::noncopyable>("module", "Class representing executable module", python::no_init )
.def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByName ) ) .def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByName ) )
@ -395,22 +392,22 @@ python::class_<kdlib::NumBehavior, boost::noncopyable>( "numVariant", "numVarian
"Return symbol name by virtual address" ) ) "Return symbol name by virtual address" ) )
.def("findSymbolAndDisp", ModuleAdapter::findSymbolAndDisp, .def("findSymbolAndDisp", ModuleAdapter::findSymbolAndDisp,
"Return tuple(symbol_name, displacement) by virtual address" ) "Return tuple(symbol_name, displacement) by virtual address" )
//.def("rva", &Module::getSymbolRva, .def("rva", &kdlib::Module::getSymbolRva,
// "Return rva of the symbol" ) "Return rva of the symbol" )
//.def("sizeof", &Module::getSymbolSize, //.def("sizeof", &Module::getSymbolSize,
// "Return a size of the type or variable" ) // "Return a size of the type or variable" )
//.def("type", &Module::getTypeByName, .def("type", &kdlib::Module::getTypeByName,
// "Return typeInfo class by type name" ) "Return typeInfo class by type name" )
//.def("getUdts", &Module::getUdts, //.def("getUdts", &Module::getUdts,
// "Return a list of all user-defined type names" ) // "Return a list of all user-defined type names" )
//.def("getEnums", &Module::getEnums, //.def("getEnums", &Module::getEnums,
// "Return a list of all enumeration names" ) // "Return a list of all enumeration names" )
//.def("typedVar", &Module::getTypedVarByAddr, .def("typedVar", &kdlib::Module::getTypedVarByAddr,
// "Return a typedVar class instance" ) "Return a typedVar class instance" )
//.def("typedVar",&Module::getTypedVarByName, .def("typedVar",&kdlib::Module::getTypedVarByName,
// "Return a typedVar class instance" ) "Return a typedVar class instance" )
//.def("typedVar",&Module::getTypedVarByTypeName, .def("typedVar",&kdlib::Module::getTypedVarByTypeName,
// "Return a typedVar class instance" ) "Return a typedVar class instance" )
//.def("typedVarList", &Module::getTypedVarListByTypeName, //.def("typedVarList", &Module::getTypedVarListByTypeName,
// "Return a list of the typedVar class instances. Each item represents an item of the linked list in the target memory" ) // "Return a list of the typedVar class instances. Each item represents an item of the linked list in the target memory" )
//.def("typedVarArray", &Module::getTypedVarArrayByTypeName, //.def("typedVarArray", &Module::getTypedVarArrayByTypeName,
@ -451,7 +448,7 @@ python::class_<kdlib::NumBehavior, boost::noncopyable>( "numVariant", "numVarian
"Return bit field's offset" ) "Return bit field's offset" )
.def( "bitWidth", &kdlib::TypeInfo::getBitWidth, .def( "bitWidth", &kdlib::TypeInfo::getBitWidth,
"Return bit field's length" ) "Return bit field's length" )
.def( "field", TypeInfoAdapter::getElement, .def( "field", TypeInfoAdapter::getElementByName,
"Return field's type" ) "Return field's type" )
//.def( "asMap", &kdlib::TypeInfo::asMap, //.def( "asMap", &kdlib::TypeInfo::asMap,
// "Return type as python dict ( for enum types )" ) // "Return type as python dict ( for enum types )" )
@ -465,9 +462,9 @@ python::class_<kdlib::NumBehavior, boost::noncopyable>( "numVariant", "numVarian
// "Return array of the type" ) // "Return array of the type" )
//.def( "__str__", &TypeInfo::print, //.def( "__str__", &TypeInfo::print,
// "Return typa as a printable string" ) // "Return typa as a printable string" )
//.def( "__getattr__", &TypeInfo::getField ) .def( "__getattr__", TypeInfoAdapter::getElementByName )
//.def("__len__", &TypeInfo::getElementCount ) .def("__len__", &kdlib::TypeInfo::getElementCount )
//.def("__getitem__", &TypeInfo::getElementByIndex ) .def("__getitem__", TypeInfoAdapter::getElementByIndex )
; ;
python::class_<kdlib::TypedVar, kdlib::TypedVarPtr, python::bases<kdlib::NumBehavior>, boost::noncopyable >("typedVar", python::class_<kdlib::TypedVar, kdlib::TypedVarPtr, python::bases<kdlib::NumBehavior>, boost::noncopyable >("typedVar",
@ -493,7 +490,7 @@ python::class_<kdlib::NumBehavior, boost::noncopyable>( "numVariant", "numVarian
"Return field of structure as an object attribute" ) "Return field of structure as an object attribute" )
//.def( "__str__", &kdlib::TypedVar::print ) //.def( "__str__", &kdlib::TypedVar::print )
.def("__len__", &kdlib::TypedVar::getElementCount ) .def("__len__", &kdlib::TypedVar::getElementCount )
//.def("__getitem__", &kdlib::TypedVar::getElementByIndex ) .def("__getitem__", &TypedVarAdapter::getElementByIndex )
//.def("__getitem__", &kdlib::TypedVar::getElementByIndexPtr ) //.def("__getitem__", &kdlib::TypedVar::getElementByIndexPtr )
; ;

View File

@ -28,6 +28,10 @@ struct TypedVarAdapter {
} }
static kdlib::TypedVarPtr getElementByIndex( kdlib::TypedVar& typedVar, long index ) {
return typedVar.getElement( index );
}
}; };
} // end namespace pykd } // end namespace pykd

View File

@ -21,9 +21,15 @@ struct TypeInfoAdapter : public kdlib::TypeInfo {
} }
static kdlib::TypeInfoPtr getElement( kdlib::TypeInfo &typeInfo, const std::wstring &name ) { static kdlib::TypeInfoPtr getElementByName( kdlib::TypeInfo &typeInfo, const std::wstring &name ) {
return typeInfo.getElement(name); return typeInfo.getElement(name);
} }
static kdlib::TypeInfoPtr getElementByIndex( kdlib::TypeInfo &typeInfo, size_t index ) {
return typeInfo.getElement(index);
}
}; };
} // end namespace pykd } // end namespace pykd

View File

@ -190,6 +190,12 @@ public:
return convertToPython(var); return convertToPython(var);
} }
static void registerNumConvertion() {
python::converter::registry::push_back( &numConvertible, &numConstruct<long>, python::type_id<long>() );
python::converter::registry::push_back( &numConvertible, &numConstruct<unsigned long>, python::type_id<unsigned long>() );
python::converter::registry::push_back( &numConvertible, &numConstruct<long long>, python::type_id<long long>() );
python::converter::registry::push_back( &numConvertible, &numConstruct<unsigned long long>, python::type_id<unsigned long long>() );
}
private: private:
@ -197,7 +203,31 @@ private:
return m_variant; return m_variant;
} }
kdlib::NumVariant m_variant; kdlib::NumVariant m_variant;
static void* numConvertible( PyObject* obj_ptr)
{
python::extract<kdlib::NumBehavior> getNumVar(obj_ptr);
if (getNumVar.check())
return obj_ptr;
else
return 0;
}
template<typename T>
static void numConstruct( PyObject* obj_ptr, python::converter::rvalue_from_python_stage1_data* data)
{
void* storage = ( (python::converter::rvalue_from_python_storage<T>*)data)->storage.bytes;
kdlib::NumBehavior* num = python::extract<kdlib::NumBehavior*>(obj_ptr);
kdlib::NumVariant var = *num;
new (storage ) T( static_cast<T>(var.asULongLong() ) );
data->convertible = storage;
}
}; };
} // end pykf namespace } // end pykf namespace

View File

@ -104,7 +104,7 @@ class TypedVarTest( unittest.TestCase ):
self.assertEqual( 16, tv.fieldOffset("m_field4") ) self.assertEqual( 16, tv.fieldOffset("m_field4") )
def testArrayField(self): def testArrayField(self):
tv = target.module.typedVar( "g_struct3" ) tv = target.module.typedVar( "g_structWithArray" )
self.assertEqual( 2, len(tv.m_arrayField) ) self.assertEqual( 2, len(tv.m_arrayField) )
self.assertEqual( 0, tv.m_arrayField[0] ) self.assertEqual( 0, tv.m_arrayField[0] )
self.assertEqual( 2, tv.m_arrayField[1] ) self.assertEqual( 2, tv.m_arrayField[1] )
@ -117,13 +117,13 @@ class TypedVarTest( unittest.TestCase ):
except IndexError: except IndexError:
self.assertTrue(True) self.assertTrue(True)
def testArrayFieldSlice(self): #def testArrayFieldSlice(self):
tv = target.module.typedVar( "g_struct3" ) # tv = target.module.typedVar( "g_structWithArray" )
self.assertEqual( [ 0, 2 ], tv.m_arrayField[0:2] ) # self.assertEqual( [ 0, 2 ], tv.m_arrayField[0:2] )
def testArrayFieldSliceNegative(self): #def testArrayFieldSliceNegative(self):
tv = target.module.typedVar( "g_struct3" ) # tv = target.module.typedVar( "g_structWithArray" )
self.assertEqual( 2, tv.m_arrayField[-1] ) # self.assertEqual( 2, tv.m_arrayField[-1] )
def testGlobalVar(self): def testGlobalVar(self):
self.assertEqual( 4, target.module.typedVar( "g_ulongValue" ) ) self.assertEqual( 4, target.module.typedVar( "g_ulongValue" ) )
@ -210,7 +210,7 @@ class TypedVarTest( unittest.TestCase ):
self.assertTrue( ind in [0,1,2] ) self.assertTrue( ind in [0,1,2] )
tv = target.module.typedVar( "g_struct3" ) tv = target.module.typedVar( "g_structWithArray" )
self.assertEqual( 2, tv.m_arrayField[ind] ) self.assertEqual( 2, tv.m_arrayField[ind] )
ind = target.module.typedVar( "g_ulongValue" ) ind = target.module.typedVar( "g_ulongValue" )

View File

@ -146,8 +146,9 @@ class TypeInfoTest( unittest.TestCase ):
def testUnion(self): def testUnion(self):
ti = target.module.type("unionTest") ti = target.module.type("unionTest")
self.assertEqual( 0, ti.fieldOffset("m_doubleValue") ) self.assertEqual( 0, ti.fieldOffset("m_doubleValue") )
self.assertEqual( 0, ti.fieldOffset("m_bits") ) self.assertEqual( 0, ti.fieldOffset("m_value") )
self.assertEqual( ti.size(), ti.m_doubleValue.size() ) self.assertEqual( 0, ti.fieldOffset("m_structValue") )
self.assertEqual( ti.size(), ti.m_structValue.size() )
def testAsMap(self): def testAsMap(self):
ti = target.module.type("enumType") ti = target.module.type("enumType")