diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 72de152..5007617 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -827,6 +827,10 @@ BOOST_PYTHON_MODULE( pykd ) "Return value by pointer" ) .def("type", TypedVarAdapter::getType, "Return typeInfo instance" ) + .def("castTo", TypedVarAdapter::castByName, + "Cast variable to the type and return new typedVar instance") + .def("castTo", TypedVarAdapter::castByTypeInfo, + "Cast variable to the type and return new typedVar instance") .def("__getattr__", TypedVarAdapter::getFieldAttr, "Return field of structure as an object attribute" ) .def( "__str__", TypedVarAdapter::print ) diff --git a/pykd/pytypedvar.h b/pykd/pytypedvar.h index 00d190f..f020010 100644 --- a/pykd/pytypedvar.h +++ b/pykd/pytypedvar.h @@ -173,6 +173,18 @@ struct TypedVarAdapter { { return !isZero(typedVar); } + + static kdlib::TypedVarPtr castByName(kdlib::TypedVar& typedVar, const std::wstring &typeName) + { + AutoRestorePyState pystate; + return typedVar.castTo(typeName); + } + + static kdlib::TypedVarPtr castByTypeInfo(kdlib::TypedVar& typedVar, const kdlib::TypeInfoPtr& typeInfo) + { + AutoRestorePyState pystate; + return typedVar.castTo(typeInfo); + } }; } // end namespace pykd diff --git a/test/scripts/typedvar.py b/test/scripts/typedvar.py index 1dc0d60..5635648 100644 --- a/test/scripts/typedvar.py +++ b/test/scripts/typedvar.py @@ -369,3 +369,7 @@ class TypedVarTest( unittest.TestCase ): tv = target.module.typedVar( "structTest", target.module.g_structTest ) self.assertFalse(tv==None) self.assertTrue(tv!=None) + + def testCastTo(self): + self.assertEqual(0xD2, target.module.typedVar( "ulonglongVar" ).castTo("UInt1B")) + self.assertEqual(0, target.module.typedVar( "g_structTest" ).castTo("UInt4B"))