refactored numVariant class

This commit is contained in:
ussrhero 2018-06-04 23:34:06 +03:00
parent b278f8b27f
commit a2a3c7a9d4
8 changed files with 69 additions and 73 deletions

@ -1 +1 @@
Subproject commit 6f96e046f3e79bc464759c6729d6d344083587e4
Subproject commit 9fa21ea2cf01e91885b067f760f2ba1a9fd04ddd

View File

@ -194,9 +194,6 @@
<ClCompile Include="$(MSBuildThisFileDirectory)..\lib\native\src\boost_regex-src.static_mutex.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)..\lib\native\src\boost_regex-src.usinstances.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)..\lib\native\src\boost_regex-src.w32_regex_traits.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -311,6 +308,9 @@
<ClCompile Include="boost.python\object\boost_python-src.object.stl_iterator.cpp">
<Filter>boost.python</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)..\lib\native\src\boost_regex-src.usinstances.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="pykd.def">

View File

@ -609,8 +609,8 @@ void pykd_init()
python::def("loadTaggedBuffer", pykd::loadTaggedBuffer,
"Read the buffer of secondary callback data by ID" );
python::class_<kdlib::NumBehavior, boost::noncopyable>( "numVariant", "numVariant", python::no_init )
.def("__init__", python::make_constructor(&NumVariantAdaptor::getVariant) )
python::class_<kdlib::NumConvertable, boost::noncopyable>( "numVariant", "numVariant", python::no_init )
//.def("__init__", python::make_constructor(&NumVariantAdaptor::getVariant) )
.def( "__eq__", &NumVariantAdaptor::eq )
.def( "__ne__", &NumVariantAdaptor::ne)
.def( "__lt__", &NumVariantAdaptor::lt)
@ -804,7 +804,7 @@ void pykd_init()
"Return heap's entries iterator object")[python::return_value_policy<python::manage_new_object>()] )
;
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::NumConvertable>, boost::noncopyable>("module", "Class representing executable module", python::no_init)
.def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByName))
.def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByOffset))
.def("begin", ModuleAdapter::getBase,
@ -870,7 +870,7 @@ void pykd_init()
"Return address of the symbol" )
.def( "__str__", &ModuleAdapter::print );
python::class_<kdlib::TypeInfo, kdlib::TypeInfoPtr, python::bases<kdlib::NumBehavior>, boost::noncopyable >("typeInfo", "Class representing typeInfo", python::no_init )
python::class_<kdlib::TypeInfo, kdlib::TypeInfoPtr, python::bases<kdlib::NumConvertable>, boost::noncopyable >("typeInfo", "Class representing typeInfo", python::no_init )
.def("__init__", python::make_constructor( pykd::getTypeInfoByName ) )
.def( "name", TypeInfoAdapter::getName,
"Return type name" )
@ -963,7 +963,7 @@ void pykd_init()
.def("next", &TypedVarIterator::next)
;
python::class_<kdlib::TypedVar, kdlib::TypedVarPtr, python::bases<kdlib::NumBehavior>, boost::noncopyable >("typedVar",
python::class_<kdlib::TypedVar, kdlib::TypedVarPtr, python::bases<kdlib::NumConvertable>, boost::noncopyable >("typedVar",
"Class of non-primitive type object, child class of typeClass. Data from target is copied into object instance", python::no_init )
.def("__init__", python::make_constructor(pykd::getTypedVarByName) )
.def("__init__", python::make_constructor(pykd::getTypedVarByTypeName) )

View File

@ -226,11 +226,11 @@ python::object callTypedVar(kdlib::TypedVarPtr& funcobj, python::tuple& args)
throw kdlib::TypeException(L"failed convert string argument");
}
python::extract<kdlib::NumBehavior> getNumVar(args[i]);
python::extract<kdlib::NumConvertable> getNumVar(args[i]);
if ( getNumVar.check() )
{
kdlib::NumVariant var = getNumVar();
argLst.push_back( var );
argLst.push_back( kdlib::TypedValue(var) );
continue;
}
@ -238,7 +238,7 @@ python::object callTypedVar(kdlib::TypedVarPtr& funcobj, python::tuple& args)
if ( python::extract<int>(args[i]).check() )
{
kdlib::NumVariant var= NumVariantAdaptor::convertToVariant(args[i]);
argLst.push_back( var );
argLst.push_back(kdlib::TypedValue(var));
continue;
}
@ -326,18 +326,18 @@ python::object callFunctionRaw( python::tuple& args, python::dict& kwargs)
continue;
}
python::extract<kdlib::NumBehavior> getNumVar(args[i]);
python::extract<kdlib::NumConvertable> getNumVar(args[i]);
if ( getNumVar.check() )
{
kdlib::NumVariant var = getNumVar();
argLst.push_back( var );
argLst.push_back(kdlib::TypedValue(var));
continue;
}
if ( python::extract<int>(args[i]).check() )
{
kdlib::NumVariant var= NumVariantAdaptor::convertToVariant(args[i]);
argLst.push_back( var );
argLst.push_back(kdlib::TypedValue(var));
continue;
}

View File

@ -9,7 +9,7 @@
namespace pykd {
class NumVariantAdaptor : public kdlib::NumBehavior
class NumVariantAdaptor : public kdlib::NumConvertable
{
public:
@ -18,7 +18,7 @@ public:
{
kdlib::NumVariant var;
python::extract<kdlib::NumBehavior> getNumVar(obj);
python::extract<kdlib::NumConvertable> getNumVar(obj);
if ( getNumVar.check() )
{
var = getNumVar();
@ -68,7 +68,7 @@ public:
return var;
}
static python::object NumVariantAdaptor::convertToPython( kdlib::NumVariant& var )
static python::object NumVariantAdaptor::convertToPython( const kdlib::NumVariant& var )
{
if ( var.isChar() )
return python::object( var.asInt() );
@ -110,18 +110,16 @@ public:
}
static kdlib::NumBehavior* NumVariantAdaptor::getVariant(const python::object &obj)
{
NumVariantAdaptor* var = new NumVariantAdaptor();
//static kdlib::NumConvertable* NumVariantAdaptor::getVariant(const python::object &obj)
//{
// //NumVariantAdaptor* var = new NumVariantAdaptor();
var->m_variant = NumVariantAdaptor::convertToVariant(obj);
// //var->m_variant = NumVariantAdaptor::convertToVariant(obj);
return var;
}
// //return var;
//}
static python::object NumVariantAdaptor::convertToPython( kdlib::NumBehavior& num )
static python::object NumVariantAdaptor::convertToPython( kdlib::NumConvertable& num )
{
kdlib::NumVariant var;
@ -135,7 +133,7 @@ public:
public:
static python::object eq( kdlib::NumBehavior& var, python::object& obj )
static python::object eq( kdlib::NumConvertable& var, python::object& obj )
{
try {
return convertToPython(var) == obj;
@ -146,7 +144,7 @@ public:
return python::object(false);
}
static python::object ne( kdlib::NumBehavior& var, python::object& obj )
static python::object ne( kdlib::NumConvertable& var, python::object& obj )
{
try {
return convertToPython(var) != obj;
@ -157,103 +155,103 @@ public:
return python::object(true);
}
static python::object lt( kdlib::NumBehavior& var, python::object& obj ) {
static python::object lt( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) < obj;
}
static python::object gt( kdlib::NumBehavior& var, python::object& obj ) {
static python::object gt( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) > obj;
}
static python::object le( kdlib::NumBehavior& var, python::object& obj ) {
static python::object le( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) <= obj;
}
static python::object ge( kdlib::NumBehavior& var, python::object& obj ) {
static python::object ge( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) >= obj;
}
static python::object add( kdlib::NumBehavior& var, python::object& obj ) {
static python::object add( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) + obj;
}
static python::object sub( kdlib::NumBehavior& var, python::object& obj ) {
static python::object sub( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) - obj;
}
static python::object rsub( kdlib::NumBehavior& var, python::object& obj ) {
static python::object rsub( kdlib::NumConvertable& var, python::object& obj ) {
return obj - convertToPython(var);
}
static python::object mul( kdlib::NumBehavior& var, python::object& obj ) {
static python::object mul( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) * obj;
}
static python::object div( kdlib::NumBehavior& var, python::object& obj ) {
static python::object div( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) / obj;
}
static python::object truediv(kdlib::NumBehavior& var, python::object& obj) {
static python::object truediv(kdlib::NumConvertable& var, python::object& obj) {
return convertToPython(var) / obj;
}
static python::object rtruediv(kdlib::NumBehavior& var, python::object& obj) {
static python::object rtruediv(kdlib::NumConvertable& var, python::object& obj) {
return obj / convertToPython(var);
}
static python::object rdiv( kdlib::NumBehavior& var, python::object& obj ) {
static python::object rdiv( kdlib::NumConvertable& var, python::object& obj ) {
return obj / convertToPython(var);
}
static python::object mod( kdlib::NumBehavior& var, python::object& obj ) {
static python::object mod( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) % obj;
}
static python::object rmod( kdlib::NumBehavior& var, python::object& obj ) {
static python::object rmod( kdlib::NumConvertable& var, python::object& obj ) {
return obj % convertToPython(var);
}
static python::object rshift( kdlib::NumBehavior& var, python::object& obj ) {
static python::object rshift( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) >> obj;
}
static python::object rrshift( kdlib::NumBehavior& var, python::object& obj ) {
static python::object rrshift( kdlib::NumConvertable& var, python::object& obj ) {
return obj >> convertToPython(var);
}
static python::object lshift( kdlib::NumBehavior& var, python::object& obj ) {
static python::object lshift( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) << obj;
}
static python::object rlshift( kdlib::NumBehavior& var, python::object& obj ) {
static python::object rlshift( kdlib::NumConvertable& var, python::object& obj ) {
return obj << convertToPython(var);
}
static python::object and( kdlib::NumBehavior& var, python::object& obj ) {
static python::object and( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) & obj;
}
static python::object or( kdlib::NumBehavior& var, python::object& obj ) {
static python::object or( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) | obj;
}
static python::object xor( kdlib::NumBehavior& var, python::object& obj ) {
static python::object xor( kdlib::NumConvertable& var, python::object& obj ) {
return convertToPython(var) ^ obj;
}
static python::object neg(kdlib::NumBehavior& var) {
static python::object neg(kdlib::NumConvertable& var) {
return 0 - convertToPython(var);
}
static python::object pos(kdlib::NumBehavior& var) {
static python::object pos(kdlib::NumConvertable& var) {
return 0 + convertToPython(var);
}
static python::object invert(kdlib::NumBehavior& var) {
static python::object invert(kdlib::NumConvertable& var) {
return convertToPython(var) ^ convertToPython(var);
}
static python::object nonzero(kdlib::NumBehavior& var) {
static python::object nonzero(kdlib::NumConvertable& var) {
try {
return convertToPython(var) != 0;
}
@ -263,29 +261,30 @@ public:
return python::object(true);
}
static python::object long_(kdlib::NumBehavior& var ) {
static python::object long_(kdlib::NumConvertable& var ) {
return convertToPython(var);
}
static python::object float_(kdlib::NumBehavior& var) {
return python::object(var.asDouble());
static python::object float_(kdlib::NumConvertable& var) {
kdlib::NumVariant v = var;
return python::object(v.asDouble());
}
static python::object int_(kdlib::NumBehavior& var) {
static python::object int_(kdlib::NumConvertable& var) {
return convertToPython(var);
}
static std::wstring str(kdlib::NumBehavior& var) {
static std::wstring str(kdlib::NumConvertable& var) {
kdlib::NumVariant v = var;
return v.asStr();
}
static std::string hex(kdlib::NumBehavior& var) {
static std::string hex(kdlib::NumConvertable& var) {
kdlib::NumVariant v = var;
return std::string("0x") + std::string(_bstr_t(v.asHex().c_str()));
}
static bool isInteger(kdlib::NumBehavior& var) {
static bool isInteger(kdlib::NumConvertable& var) {
kdlib::NumVariant v = var;
return v.isInteger();
}
@ -307,7 +306,7 @@ private:
static void* numConvertible( PyObject* obj_ptr)
{
python::extract<kdlib::NumBehavior> getNumVar(obj_ptr);
python::extract<kdlib::NumConvertable> getNumVar(obj_ptr);
if (getNumVar.check())
return obj_ptr;
@ -320,9 +319,9 @@ private:
{
void* storage = ( (python::converter::rvalue_from_python_storage<T>*)data)->storage.bytes;
kdlib::NumBehavior* num = python::extract<kdlib::NumBehavior*>(obj_ptr);
kdlib::NumConvertable& num = python::extract<kdlib::NumConvertable&>(obj_ptr);
kdlib::NumVariant var = *num;
kdlib::NumVariant var = num;
new (storage ) T( static_cast<T>(var.asULongLong() ) );

View File

@ -13,7 +13,7 @@ import pykd
import target
import intbase
#import intbase
import memtest
import moduletest
import typeinfo
@ -47,7 +47,7 @@ def getTestSuite( singleName = "" ):
if singleName == "":
return unittest.TestSuite(
[
unittest.TestLoader().loadTestsFromTestCase( intbase.IntBaseTest ),
#unittest.TestLoader().loadTestsFromTestCase( intbase.IntBaseTest ),
unittest.TestLoader().loadTestsFromTestCase( StartProcessWithoutParamsTest ),
# *** Test without start/kill new processes
@ -83,14 +83,11 @@ if __name__ == "__main__":
print( "\nTesting PyKd ver. %s" % pykd.__version__ )
print( "Directory: %s" % os.path.dirname(pykd.__file__) )
import time
# time.sleep(30)
target.appPath = os.path.join( os.path.dirname(pykd.__file__), "targetapp.exe" )
target.moduleName = os.path.splitext(os.path.basename(target.appPath))[0]
unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite() )
#unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite("regtest.CpuRegTest.testSetRegValue") )
#unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite("typedvar.TypedVarTest.testAttr") )
try: input = raw_input
except NameError: pass

View File

@ -8,7 +8,7 @@
<StartupFile>pykdtest.py</StartupFile>
<SearchPath>
</SearchPath>
<WorkingDirectory>..\..\out\x64\Debug_3.6</WorkingDirectory>
<WorkingDirectory>..\..\out\x64\Debug_2.7</WorkingDirectory>
<OutputPath>.</OutputPath>
<Name>pykdtest</Name>
<RootNamespace>pykdtest</RootNamespace>
@ -19,7 +19,7 @@
</InterpreterArguments>
<EnableNativeCodeDebugging>False</EnableNativeCodeDebugging>
<IsWindowsApplication>False</IsWindowsApplication>
<InterpreterId>Global|PythonCore|3.6</InterpreterId>
<InterpreterId>Global|PythonCore|2.7</InterpreterId>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>true</DebugSymbols>

View File

@ -393,7 +393,7 @@ class TypedVarTest( unittest.TestCase ):
funcptr = target.module.typedVar("StdcallFuncRet");
ucharVar = target.module.typedVar( "ucharVar" );
self.assertEqual( 10, ucharVar )
self.assertEqual( 200000/10, funcptr( ucharVar, pykd.numVariant(200000) ) )
self.assertEqual( 200000/10, funcptr( ucharVar, 200000 ) )
def testCallWithWrongArgs(self):
self.assertRaises( pykd.TypeException, target.module.typedVar("StdcallFuncRet"), *(1,) )