[0.2.x] ~fix: size of basic type ptr

git-svn-id: https://pykd.svn.codeplex.com/svn@82228 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\EreTIk_cp 2013-01-10 12:28:24 +00:00 committed by Mikhail I. Izmestev
parent 30837343b3
commit 310d1e9c7d
3 changed files with 51 additions and 42 deletions

View File

@ -21,19 +21,19 @@ public:
m_ptrSize = pointerSize ? pointerSize : ptrSize();
}
TypeInfoPtr getUInt1B() { return TypeInfo::getBaseTypeInfo( "UInt1B" ); }
TypeInfoPtr getUInt2B() { return TypeInfo::getBaseTypeInfo( "UInt2B" ); }
TypeInfoPtr getUInt4B() { return TypeInfo::getBaseTypeInfo( "UInt4B" ); }
TypeInfoPtr getUInt8B() { return TypeInfo::getBaseTypeInfo( "UInt8B" ); }
TypeInfoPtr getInt1B() { return TypeInfo::getBaseTypeInfo( "Int1B" ); }
TypeInfoPtr getInt2B() { return TypeInfo::getBaseTypeInfo( "Int2B" ); }
TypeInfoPtr getInt4B() { return TypeInfo::getBaseTypeInfo( "Int4B" ); }
TypeInfoPtr getInt8B() { return TypeInfo::getBaseTypeInfo( "Int8B" ); }
TypeInfoPtr getLong() { return TypeInfo::getBaseTypeInfo( "Long" ); }
TypeInfoPtr getULong() { return TypeInfo::getBaseTypeInfo( "ULong" ); }
TypeInfoPtr getBool() { return TypeInfo::getBaseTypeInfo( "Bool" ); }
TypeInfoPtr getChar() { return TypeInfo::getBaseTypeInfo( "Char" ); }
TypeInfoPtr getWChar() { return TypeInfo::getBaseTypeInfo( "WChar" ); }
TypeInfoPtr getUInt1B() { return TypeInfo::getBaseTypeInfo( "UInt1B", m_ptrSize ); }
TypeInfoPtr getUInt2B() { return TypeInfo::getBaseTypeInfo( "UInt2B", m_ptrSize ); }
TypeInfoPtr getUInt4B() { return TypeInfo::getBaseTypeInfo( "UInt4B", m_ptrSize ); }
TypeInfoPtr getUInt8B() { return TypeInfo::getBaseTypeInfo( "UInt8B", m_ptrSize ); }
TypeInfoPtr getInt1B() { return TypeInfo::getBaseTypeInfo( "Int1B", m_ptrSize ); }
TypeInfoPtr getInt2B() { return TypeInfo::getBaseTypeInfo( "Int2B", m_ptrSize ); }
TypeInfoPtr getInt4B() { return TypeInfo::getBaseTypeInfo( "Int4B", m_ptrSize ); }
TypeInfoPtr getInt8B() { return TypeInfo::getBaseTypeInfo( "Int8B", m_ptrSize ); }
TypeInfoPtr getLong() { return TypeInfo::getBaseTypeInfo( "Long", m_ptrSize ); }
TypeInfoPtr getULong() { return TypeInfo::getBaseTypeInfo( "ULong", m_ptrSize ); }
TypeInfoPtr getBool() { return TypeInfo::getBaseTypeInfo( "Bool", m_ptrSize ); }
TypeInfoPtr getChar() { return TypeInfo::getBaseTypeInfo( "Char", m_ptrSize ); }
TypeInfoPtr getWChar() { return TypeInfo::getBaseTypeInfo( "WChar", m_ptrSize ); }
TypeInfoPtr getVoidPtr() {
return TypeInfoPtr( new PointerTypeInfo(m_ptrSize) );

View File

@ -46,7 +46,7 @@ TypeInfoPtr TypeInfo::getTypeInfoByName( const std::string &typeName )
std::string symName;
if ( TypeInfo::isBaseType( typeName ) )
return TypeInfo::getBaseTypeInfo( typeName );
return TypeInfo::getBaseTypeInfo( typeName, pykd::ptrSize() );
splitSymName( typeName, moduleName, symName );
@ -63,7 +63,7 @@ ULONG64 TypeInfo::getSymbolSize( const std::string &fullName )
std::string symName;
if ( TypeInfo::isBaseType( fullName ) )
return TypeInfo::getBaseTypeInfo( fullName )->getSize();
return TypeInfo::getBaseTypeInfo( fullName, pykd::ptrSize() )->getSize();
splitSymName( fullName, moduleName, symName );
@ -124,6 +124,13 @@ ULONG64 TypeInfo::getOffset( const std::string &fullName )
/////////////////////////////////////////////////////////////////////////////////////
inline ULONG getTypePointerSize( SymbolPtr &typeSym )
{
return (typeSym->getMachineType() == IMAGE_FILE_MACHINE_AMD64) ? 8 : 4;
}
/////////////////////////////////////////////////////////////////////////////////////
TypeInfoPtr TypeInfo::getTypeInfo( SymbolPtr &typeSym )
{
ULONG symTag = typeSym->getSymTag();
@ -185,7 +192,7 @@ TypeInfoPtr TypeInfo::getTypeInfo( SymbolPtr &typeSym )
}
if ( ptr )
ptr->m_ptrSize = (typeSym->getMachineType() == IMAGE_FILE_MACHINE_AMD64) ? 8 : 4;
ptr->m_ptrSize = getTypePointerSize(typeSym);
return ptr;
}
@ -208,7 +215,7 @@ TypeInfoPtr TypeInfo::getTypeInfo( SymbolPtr &symScope, const std::string &symN
if ( pos == std::string::npos )
{
TypeInfoPtr basePtr = getBaseTypeInfo( symName );
TypeInfoPtr basePtr = getBaseTypeInfo( symName, getTypePointerSize(symScope) );
if ( basePtr != 0 )
return basePtr;
@ -252,56 +259,56 @@ TypeInfo::isBaseType( const std::string &symName )
}
TypeInfoPtr
TypeInfo::getBaseTypeInfo( const std::string &symName )
TypeInfo::getBaseTypeInfo( const std::string &symName, ULONG pointerSize )
{
boost::cmatch baseMatchResult;
if ( boost::regex_match( symName.c_str(), baseMatchResult, baseMatch ) )
{
if ( baseMatchResult[1].matched )
return TypeInfoPtr( new TypeInfoWrapper<char>("Char") );
return TypeInfoPtr( new TypeInfoWrapper<char>("Char", pointerSize) );
if ( baseMatchResult[2].matched )
return TypeInfoPtr( new TypeInfoWrapper<wchar_t>("WChar") );
return TypeInfoPtr( new TypeInfoWrapper<wchar_t>("WChar", pointerSize) );
if ( baseMatchResult[3].matched )
return TypeInfoPtr( new TypeInfoWrapper<char>("Int1B") );
return TypeInfoPtr( new TypeInfoWrapper<char>("Int1B", pointerSize) );
if ( baseMatchResult[4].matched )
return TypeInfoPtr( new TypeInfoWrapper<unsigned char>("UInt1B") );
return TypeInfoPtr( new TypeInfoWrapper<unsigned char>("UInt1B", pointerSize) );
if ( baseMatchResult[5].matched )
return TypeInfoPtr( new TypeInfoWrapper<short>("Int2B") );
return TypeInfoPtr( new TypeInfoWrapper<short>("Int2B", pointerSize) );
if ( baseMatchResult[6].matched )
return TypeInfoPtr( new TypeInfoWrapper<unsigned short>("UInt2B") );
return TypeInfoPtr( new TypeInfoWrapper<unsigned short>("UInt2B", pointerSize) );
if ( baseMatchResult[7].matched )
return TypeInfoPtr( new TypeInfoWrapper<long>("Int4B") );
return TypeInfoPtr( new TypeInfoWrapper<long>("Int4B", pointerSize) );
if ( baseMatchResult[8].matched )
return TypeInfoPtr( new TypeInfoWrapper<unsigned long>("UInt4B") );
return TypeInfoPtr( new TypeInfoWrapper<unsigned long>("UInt4B", pointerSize) );
if ( baseMatchResult[9].matched )
return TypeInfoPtr( new TypeInfoWrapper<__int64>("Int8B") );
return TypeInfoPtr( new TypeInfoWrapper<__int64>("Int8B", pointerSize) );
if ( baseMatchResult[10].matched )
return TypeInfoPtr( new TypeInfoWrapper<unsigned __int64>("UInt8B") );
return TypeInfoPtr( new TypeInfoWrapper<unsigned __int64>("UInt8B", pointerSize) );
if ( baseMatchResult[11].matched )
return TypeInfoPtr( new TypeInfoWrapper<long>("Long") );
return TypeInfoPtr( new TypeInfoWrapper<long>("Long", pointerSize) );
if ( baseMatchResult[12].matched )
return TypeInfoPtr( new TypeInfoWrapper<unsigned long>("ULong") );
return TypeInfoPtr( new TypeInfoWrapper<unsigned long>("ULong", pointerSize) );
if ( baseMatchResult[13].matched )
return TypeInfoPtr( new TypeInfoWrapper<float>("Float") );
return TypeInfoPtr( new TypeInfoWrapper<float>("Float", pointerSize) );
if ( baseMatchResult[14].matched )
return TypeInfoPtr( new TypeInfoWrapper<bool>("Bool") );
return TypeInfoPtr( new TypeInfoWrapper<bool>("Bool", pointerSize) );
if ( baseMatchResult[15].matched )
return TypeInfoPtr( new TypeInfoWrapper<double>("Double") );
return TypeInfoPtr( new TypeInfoWrapper<double>("Double", pointerSize) );
}
return TypeInfoPtr();
@ -319,7 +326,7 @@ TypeInfo::getBaseTypeInfo( SymbolPtr &symbol )
std::stringstream sstr;
sstr << symName << symbol->getSize() << "B";
return getBaseTypeInfo( sstr.str() );
return getBaseTypeInfo( sstr.str(), getTypePointerSize(symbol) );
}
if ( symName == "Float" && symbol->getSize() == 8 )
@ -327,7 +334,7 @@ TypeInfo::getBaseTypeInfo( SymbolPtr &symbol )
symName = "Double";
}
return getBaseTypeInfo( symName );
return getBaseTypeInfo( symName, getTypePointerSize(symbol) );
}
/////////////////////////////////////////////////////////////////////////////////////
@ -401,7 +408,7 @@ PointerTypeInfo::PointerTypeInfo( SymbolPtr &symScope, const std::string &symNam
{
m_derefType.swap( TypeInfoPtr() );
}
m_size = (symScope->getMachineType() == IMAGE_FILE_MACHINE_AMD64) ? 8 : 4;
m_size = getTypePointerSize(symScope);
}
/////////////////////////////////////////////////////////////////////////////////////
@ -531,7 +538,7 @@ static const boost::regex symbolMatch("^([\\*]*)([^\\(\\)\\*\\[\\]]*)([\\(\\)\\*
TypeInfoPtr TypeInfo::getComplexType( SymbolPtr &symScope, const std::string &symName )
{
ULONG ptrSize = (symScope->getMachineType() == IMAGE_FILE_MACHINE_AMD64) ? 8 : 4;
ULONG ptrSize = getTypePointerSize(symScope);
boost::cmatch matchResult;
@ -540,7 +547,7 @@ TypeInfoPtr TypeInfo::getComplexType( SymbolPtr &symScope, const std::string &sy
std::string innerSymName = std::string( matchResult[2].first, matchResult[2].second );
TypeInfoPtr basePtr = getBaseTypeInfo( innerSymName );
TypeInfoPtr basePtr = getBaseTypeInfo( innerSymName, getTypePointerSize(symScope) );
if ( basePtr != 0 )
{
return getRecurciveComplexType( basePtr, std::string( matchResult[3].first, matchResult[3].second ), ptrSize );

View File

@ -41,7 +41,7 @@ public:
TypeInfoPtr getTypeInfo( SymbolPtr &symbol );
static
TypeInfoPtr getBaseTypeInfo( const std::string &name );
TypeInfoPtr getBaseTypeInfo( const std::string &name, ULONG pointerSize );
static
TypeInfoPtr getBaseTypeInfo( SymbolPtr &symbol );
@ -248,9 +248,11 @@ template<typename T>
class TypeInfoWrapper : public TypeInfo
{
public:
TypeInfoWrapper( const std::string &name ) :
m_name(name)
{}
TypeInfoWrapper( const std::string &name, ULONG pointerSize )
: m_name(name)
{
m_ptrSize = pointerSize;
}
private: