mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-22 05:13:22 +08:00
[0.2.x] ~ ptrTo is method of typeInfo
git-svn-id: https://pykd.svn.codeplex.com/svn@81387 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
305acde46f
commit
689ce0ae42
@ -8,6 +8,14 @@ namespace pykd {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CustomTypeBase::CustomTypeBase(const std::string &name, ULONG pointerSize)
|
||||||
|
: UdtFieldColl(name)
|
||||||
|
{
|
||||||
|
m_ptrSize = pointerSize ? pointerSize : ptrSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void CustomTypeBase::throwIfFiledExist(const std::string &fieldName)
|
void CustomTypeBase::throwIfFiledExist(const std::string &fieldName)
|
||||||
{
|
{
|
||||||
bool fieldExist = false;
|
bool fieldExist = false;
|
||||||
@ -61,9 +69,12 @@ void CustomTypeBase::throwIfTypeRecursiveImpl(TypeInfoPtr type)
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TypeInfoPtr CustomStruct::create(const std::string &name, ULONG alignReq /*= 0*/)
|
TypeInfoPtr CustomStruct::create(
|
||||||
|
const std::string &name,
|
||||||
|
ULONG alignReq /*= 0*/,
|
||||||
|
ULONG pointerSize /*= 0*/)
|
||||||
{
|
{
|
||||||
return TypeInfoPtr( new CustomStruct(name, alignReq) );
|
return TypeInfoPtr( new CustomStruct(name, alignReq, pointerSize) );
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -93,9 +104,9 @@ void CustomStruct::appendField(const std::string &fieldName, TypeInfoPtr fieldTy
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TypeInfoPtr CustomUnion::create(const std::string &name)
|
TypeInfoPtr CustomUnion::create(const std::string &name, ULONG pointerSize /*= 0*/)
|
||||||
{
|
{
|
||||||
return TypeInfoPtr( new CustomUnion(name) );
|
return TypeInfoPtr( new CustomUnion(name, pointerSize) );
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -133,13 +144,6 @@ TypeInfoPtr PtrToVoid()
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TypeInfoPtr PtrTo(TypeInfoPtr type)
|
|
||||||
{
|
|
||||||
return TypeInfoPtr( new PointerTypeInfo(type, ptrSize()) );
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
} // namespace pykd
|
} // namespace pykd
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -16,7 +16,7 @@ class CustomTypeBase : public UdtFieldColl
|
|||||||
{
|
{
|
||||||
typedef UdtFieldColl Base;
|
typedef UdtFieldColl Base;
|
||||||
protected:
|
protected:
|
||||||
CustomTypeBase(const std::string &name) : UdtFieldColl(name) {}
|
CustomTypeBase(const std::string &name, ULONG pointerSize);
|
||||||
|
|
||||||
void throwIfFiledExist(const std::string &fieldName);
|
void throwIfFiledExist(const std::string &fieldName);
|
||||||
void throwIfTypeRecursive(TypeInfoPtr type);
|
void throwIfTypeRecursive(TypeInfoPtr type);
|
||||||
@ -31,11 +31,11 @@ class CustomStruct : public CustomTypeBase
|
|||||||
{
|
{
|
||||||
typedef CustomTypeBase Base;
|
typedef CustomTypeBase Base;
|
||||||
public:
|
public:
|
||||||
static TypeInfoPtr create(const std::string &name, ULONG align = 0);
|
static TypeInfoPtr create(const std::string &name, ULONG align = 0, ULONG pointerSize = 0);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CustomStruct(const std::string &name, ULONG align)
|
CustomStruct(const std::string &name, ULONG align, ULONG pointerSize)
|
||||||
: Base(name), m_name(name), m_align(align)
|
: Base(name, pointerSize), m_name(name), m_align(align)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,10 +62,13 @@ class CustomUnion : public CustomTypeBase
|
|||||||
{
|
{
|
||||||
typedef CustomTypeBase Base;
|
typedef CustomTypeBase Base;
|
||||||
public:
|
public:
|
||||||
static TypeInfoPtr create(const std::string &name);
|
static TypeInfoPtr create(const std::string &name, ULONG pointerSize = 0);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CustomUnion(const std::string &name) : Base(name) {}
|
CustomUnion(const std::string &name, ULONG pointerSize)
|
||||||
|
: Base(name, pointerSize)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
virtual ULONG getSize() override;
|
virtual ULONG getSize() override;
|
||||||
|
|
||||||
@ -85,10 +88,6 @@ TypeInfoPtr PtrToVoid();
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TypeInfoPtr PtrTo(TypeInfoPtr type);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
} // namespace pykd
|
} // namespace pykd
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -60,7 +60,8 @@ BOOST_PYTHON_FUNCTION_OVERLOADS( getSourceFile_, getSourceFile, 0, 1 );
|
|||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( setSoftwareBp_, setSoftwareBp, 1, 2 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( setSoftwareBp_, setSoftwareBp, 1, 2 );
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( setHardwareBp_, setHardwareBp, 3, 4 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( setHardwareBp_, setHardwareBp, 3, 4 );
|
||||||
|
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( CustomStruct_create, CustomStruct::create, 1, 2 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( CustomStruct_create, CustomStruct::create, 1, 3 );
|
||||||
|
BOOST_PYTHON_FUNCTION_OVERLOADS( CustomUnion_create, CustomUnion::create, 1, 2 );
|
||||||
|
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( findSymbol_, TypeInfo::findSymbol, 1, 2 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( findSymbol_, TypeInfo::findSymbol, 1, 2 );
|
||||||
|
|
||||||
@ -274,14 +275,11 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
python::def( "appendSymbolPath", &appendSymbolPath, "Append current symbol path");
|
python::def( "appendSymbolPath", &appendSymbolPath, "Append current symbol path");
|
||||||
|
|
||||||
// custom types
|
// custom types
|
||||||
python::def( "createStruct", &CustomStruct::create, CustomStruct_create( python::args( "name", "align" ),
|
python::def( "createStruct", &CustomStruct::create, CustomStruct_create( python::args( "name", "align", "ptrSize" ),
|
||||||
"Create empty structure. Use append() method for building" ) );
|
"Create empty structure. Use append() method for building" ) );
|
||||||
python::def( "createUnion", &CustomUnion::create,
|
python::def( "createUnion", &CustomUnion::create, CustomUnion_create( python::args( "name", "ptrSize" ),
|
||||||
"Create empty union. Use append() method for building" );
|
"Create empty union. Use append() method for building" ) );
|
||||||
python::def( "pVoid", &PtrToVoid,
|
python::def( "pVoid", &PtrToVoid, "Create \"Void*\" type" );
|
||||||
"Create \"Void *\" type" );
|
|
||||||
python::def( "ptrTo", &PtrTo,
|
|
||||||
"Create pointer to target type" );
|
|
||||||
|
|
||||||
python::class_<intBase>( "intBase", "intBase", python::no_init )
|
python::class_<intBase>( "intBase", "intBase", python::no_init )
|
||||||
.def( python::init<python::object&>() )
|
.def( python::init<python::object&>() )
|
||||||
@ -391,6 +389,7 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
.def( "asMap", &TypeInfo::asMap )
|
.def( "asMap", &TypeInfo::asMap )
|
||||||
.def( "deref", &TypeInfo::deref )
|
.def( "deref", &TypeInfo::deref )
|
||||||
.def( "append", &TypeInfo::appendField )
|
.def( "append", &TypeInfo::appendField )
|
||||||
|
.def( "ptrTo", &TypeInfo::ptrTo )
|
||||||
.def( "__str__", &TypeInfo::print )
|
.def( "__str__", &TypeInfo::print )
|
||||||
.def( "__getattr__", &TypeInfo::getField )
|
.def( "__getattr__", &TypeInfo::getField )
|
||||||
.def("__len__", &TypeInfo::getElementCount )
|
.def("__len__", &TypeInfo::getElementCount )
|
||||||
|
@ -602,6 +602,13 @@ TypeInfoPtr TypeInfo::getRecurciveComplexType( TypeInfoPtr &lowestType, std::str
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
TypeInfoPtr TypeInfo::ptrTo()
|
||||||
|
{
|
||||||
|
return TypeInfoPtr( new PointerTypeInfo(shared_from_this(), m_ptrSize) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
ULONG64 TypeInfo::getStaticOffset()
|
ULONG64 TypeInfo::getStaticOffset()
|
||||||
{
|
{
|
||||||
if ( !m_staticMember )
|
if ( !m_staticMember )
|
||||||
|
@ -162,6 +162,8 @@ public:
|
|||||||
throw TypeException( getName(), "type is not is not extensible" );
|
throw TypeException( getName(), "type is not is not extensible" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TypeInfoPtr ptrTo();
|
||||||
|
|
||||||
virtual ULONG getAlignReq() {
|
virtual ULONG getAlignReq() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -32,18 +32,21 @@ class TypedVarTest( unittest.TestCase ):
|
|||||||
self.assertEqual( -8, target.module.typedVar( "g_longlongValue" ) )
|
self.assertEqual( -8, target.module.typedVar( "g_longlongValue" ) )
|
||||||
|
|
||||||
def testPtrTo(self):
|
def testPtrTo(self):
|
||||||
tv1 = target.module.typedVar( "g_ulonglongValue" )
|
tvBaseType = pykd.typedVar( pykd.typeInfo("UInt8B").ptrTo(),
|
||||||
tv2 = pykd.typedVar( pykd.ptrTo(tv1.type()),
|
|
||||||
target.module.offset("g_pUlonglongValue") )
|
target.module.offset("g_pUlonglongValue") )
|
||||||
self.assertEqual( tv1, tv2.deref() )
|
self.assertEqual( target.module.typedVar( "g_ulonglongValue" ),
|
||||||
|
tvBaseType.deref() )
|
||||||
|
|
||||||
tv3 = pykd.typedVar( pykd.ptrTo( target.module.type("structTest") ).deref(),
|
tvDiaStruct = pykd.typedVar( target.module.type("structTest").ptrTo(),
|
||||||
target.module.offset("g_structTest") )
|
|
||||||
self.assertEqual( 500, tv3.m_field1 )
|
|
||||||
|
|
||||||
tv4 = pykd.typedVar( pykd.ptrTo( target.module.type("structTest") ),
|
|
||||||
target.module.offset("g_structTestPtr") )
|
target.module.offset("g_structTestPtr") )
|
||||||
self.assertEqual( 500, tv4.deref().m_field1 )
|
self.assertEqual( 500, tvDiaStruct.deref().m_field1 )
|
||||||
|
|
||||||
|
customStructTest = pykd.createStruct("customStructTest")
|
||||||
|
customStructTest.append("m_field0", pykd.typeInfo("UInt4B"))
|
||||||
|
customStructTest.append("m_field1", pykd.typeInfo("UInt8B"))
|
||||||
|
tvCustomStruct = pykd.typedVar( customStructTest.ptrTo(),
|
||||||
|
target.module.offset("g_structTestPtr") )
|
||||||
|
self.assertEqual( 500, tvCustomStruct.deref().m_field1 )
|
||||||
|
|
||||||
def testConst(self):
|
def testConst(self):
|
||||||
self.assertEqual( True, target.module.typedVar( "g_constBoolValue" ) )
|
self.assertEqual( True, target.module.typedVar( "g_constBoolValue" ) )
|
||||||
|
Loading…
Reference in New Issue
Block a user