From a2a3c7a9d4604c9637431b0a5d9b24e7efa8a3c8 Mon Sep 17 00:00:00 2001 From: ussrhero Date: Mon, 4 Jun 2018 23:34:06 +0300 Subject: [PATCH] refactored numVariant class --- kdlibcpp | 2 +- pykd/pykd.vcxproj.filters | 6 +-- pykd/pymod.cpp | 10 ++-- pykd/pytypeinfo.cpp | 12 ++--- pykd/variant.h | 97 ++++++++++++++++++------------------ test/scripts/pykdtest.py | 9 ++-- test/scripts/pykdtest.pyproj | 4 +- test/scripts/typedvar.py | 2 +- 8 files changed, 69 insertions(+), 73 deletions(-) diff --git a/kdlibcpp b/kdlibcpp index 6f96e04..9fa21ea 160000 --- a/kdlibcpp +++ b/kdlibcpp @@ -1 +1 @@ -Subproject commit 6f96e046f3e79bc464759c6729d6d344083587e4 +Subproject commit 9fa21ea2cf01e91885b067f760f2ba1a9fd04ddd diff --git a/pykd/pykd.vcxproj.filters b/pykd/pykd.vcxproj.filters index 55e9996..80f1916 100644 --- a/pykd/pykd.vcxproj.filters +++ b/pykd/pykd.vcxproj.filters @@ -194,9 +194,6 @@ Source Files - - Source Files - Source Files @@ -311,6 +308,9 @@ boost.python + + Source Files + diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index c5cac9e..cfe7b42 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -609,8 +609,8 @@ void pykd_init() python::def("loadTaggedBuffer", pykd::loadTaggedBuffer, "Read the buffer of secondary callback data by ID" ); - python::class_( "numVariant", "numVariant", python::no_init ) - .def("__init__", python::make_constructor(&NumVariantAdaptor::getVariant) ) + python::class_( "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::class_, boost::noncopyable>("module", "Class representing executable module", python::no_init) + python::class_, 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_, boost::noncopyable >("typeInfo", "Class representing typeInfo", python::no_init ) + python::class_, 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_, boost::noncopyable >("typedVar", + python::class_, 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) ) diff --git a/pykd/pytypeinfo.cpp b/pykd/pytypeinfo.cpp index 3f22af5..f6a71bb 100644 --- a/pykd/pytypeinfo.cpp +++ b/pykd/pytypeinfo.cpp @@ -226,11 +226,11 @@ python::object callTypedVar(kdlib::TypedVarPtr& funcobj, python::tuple& args) throw kdlib::TypeException(L"failed convert string argument"); } - python::extract getNumVar(args[i]); + python::extract 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(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 getNumVar(args[i]); + python::extract getNumVar(args[i]); if ( getNumVar.check() ) { kdlib::NumVariant var = getNumVar(); - argLst.push_back( var ); + argLst.push_back(kdlib::TypedValue(var)); continue; } if ( python::extract(args[i]).check() ) { kdlib::NumVariant var= NumVariantAdaptor::convertToVariant(args[i]); - argLst.push_back( var ); + argLst.push_back(kdlib::TypedValue(var)); continue; } diff --git a/pykd/variant.h b/pykd/variant.h index a40ef5a..fd625df 100644 --- a/pykd/variant.h +++ b/pykd/variant.h @@ -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 getNumVar(obj); + python::extract 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 getNumVar(obj_ptr); + python::extract getNumVar(obj_ptr); if (getNumVar.check()) return obj_ptr; @@ -320,9 +319,9 @@ private: { void* storage = ( (python::converter::rvalue_from_python_storage*)data)->storage.bytes; - kdlib::NumBehavior* num = python::extract(obj_ptr); + kdlib::NumConvertable& num = python::extract(obj_ptr); - kdlib::NumVariant var = *num; + kdlib::NumVariant var = num; new (storage ) T( static_cast(var.asULongLong() ) ); diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py index df433b9..6963082 100644 --- a/test/scripts/pykdtest.py +++ b/test/scripts/pykdtest.py @@ -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 diff --git a/test/scripts/pykdtest.pyproj b/test/scripts/pykdtest.pyproj index 67bf6d4..a49f2bd 100644 --- a/test/scripts/pykdtest.pyproj +++ b/test/scripts/pykdtest.pyproj @@ -8,7 +8,7 @@ pykdtest.py - ..\..\out\x64\Debug_3.6 + ..\..\out\x64\Debug_2.7 . pykdtest pykdtest @@ -19,7 +19,7 @@ False False - Global|PythonCore|3.6 + Global|PythonCore|2.7 true diff --git a/test/scripts/typedvar.py b/test/scripts/typedvar.py index 4b55c99..88ec80a 100644 --- a/test/scripts/typedvar.py +++ b/test/scripts/typedvar.py @@ -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,) )