Browse Source

Initialized some previously uninitialized memory fields on the parser.

pull/222/head
triton 11 years ago
parent
commit
83be8a7153
  1. 11
      src/CppParser/AST.cpp
  2. 3
      src/CppParser/AST.h
  3. 19
      src/CppParser/Parser.cpp

11
src/CppParser/AST.cpp

@ -84,7 +84,11 @@ VTableComponent::VTableComponent() : Offset(0), Declaration(0) {} @@ -84,7 +84,11 @@ VTableComponent::VTableComponent() : Offset(0), Declaration(0) {}
VTableLayout::VTableLayout() {}
DEF_VECTOR(VTableLayout, VTableComponent, Components)
ClassLayout::ClassLayout() : ABI(CppAbi::Itanium) {}
VFTableInfo::VFTableInfo() : VBTableIndex(0), VFPtrOffset(0), VFPtrFullOffset(0) {}
ClassLayout::ClassLayout() : ABI(CppAbi::Itanium), HasOwnVFPtr(false),
VBPtrOffset(0), Alignment(0), Size(0), DataSize(0) {}
DEF_VECTOR(ClassLayout, VFTableInfo, VFTables)
Declaration::Declaration(DeclarationKind kind)
@ -373,14 +377,15 @@ Field::Field() : Declaration(DeclarationKind::Field), Class(0) {} @@ -373,14 +377,15 @@ Field::Field() : Declaration(DeclarationKind::Field), Class(0) {}
AccessSpecifierDecl::AccessSpecifierDecl()
: Declaration(DeclarationKind::AccessSpecifier) {}
Class::Class() { Kind = DeclarationKind::Class; }
Class::Class() : Layout(0) { Kind = DeclarationKind::Class; }
DEF_VECTOR(Class, BaseClassSpecifier*, Bases)
DEF_VECTOR(Class, Field*, Fields)
DEF_VECTOR(Class, Method*, Methods)
DEF_VECTOR(Class, AccessSpecifierDecl*, Specifiers)
Template::Template() : Declaration(DeclarationKind::Template) {}
Template::Template() : Declaration(DeclarationKind::Template),
TemplatedDecl(0) {}
DEF_VECTOR(Template, TemplateParameter, Parameters)

3
src/CppParser/AST.h

@ -283,6 +283,7 @@ struct CS_API VTableLayout @@ -283,6 +283,7 @@ struct CS_API VTableLayout
struct CS_API VFTableInfo
{
VFTableInfo();
uint64_t VBTableIndex;
uint32_t VFPtrOffset;
uint32_t VFPtrFullOffset;
@ -598,7 +599,7 @@ struct CS_API Class : public DeclarationContext @@ -598,7 +599,7 @@ struct CS_API Class : public DeclarationContext
bool HasNonTrivialDestructor;
bool IsExternCContext;
ClassLayout Layout;
ClassLayout* Layout;
};
struct CS_API Template : public Declaration

19
src/CppParser/Parser.cpp

@ -499,7 +499,8 @@ void Parser::WalkVTable(clang::CXXRecordDecl* RD, Class* C) @@ -499,7 +499,8 @@ void Parser::WalkVTable(clang::CXXRecordDecl* RD, Class* C)
{
case TargetCXXABI::Microsoft:
{
C->Layout.ABI = CppAbi::Microsoft;
C->Layout = new ClassLayout();
C->Layout->ABI = CppAbi::Microsoft;
MicrosoftVTableContext VTContext(*AST);
auto VFPtrs = VTContext.getVFPtrOffsets(RD);
@ -514,17 +515,17 @@ void Parser::WalkVTable(clang::CXXRecordDecl* RD, Class* C) @@ -514,17 +515,17 @@ void Parser::WalkVTable(clang::CXXRecordDecl* RD, Class* C)
auto& VTLayout = VTContext.getVFTableLayout(RD, VFPtrInfo->FullOffsetInMDC);
Info.Layout = WalkVTableLayout(VTLayout);
C->Layout.VFTables.push_back(Info);
C->Layout->VFTables.push_back(Info);
}
break;
}
case TargetCXXABI::GenericItanium:
{
C->Layout.ABI = CppAbi::Itanium;
C->Layout->ABI = CppAbi::Itanium;
ItaniumVTableContext VTContext(*AST);
auto& VTLayout = VTContext.getVTableLayout(RD);
C->Layout.Layout = WalkVTableLayout(VTLayout);
C->Layout->Layout = WalkVTableLayout(VTLayout);
break;
}
default:
@ -612,11 +613,11 @@ void Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, Class* RC) @@ -612,11 +613,11 @@ void Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, Class* RC)
if (hasLayout)
{
Layout = &C->getASTContext().getASTRecordLayout(Record);
RC->Layout.Alignment = (int)Layout-> getAlignment().getQuantity();
RC->Layout.Size = (int)Layout->getSize().getQuantity();
RC->Layout.DataSize = (int)Layout->getDataSize().getQuantity();
RC->Layout.HasOwnVFPtr = Layout->hasOwnVFPtr();
RC->Layout.VBPtrOffset = Layout->getVBPtrOffset().getQuantity();
RC->Layout->Alignment = (int)Layout-> getAlignment().getQuantity();
RC->Layout->Size = (int)Layout->getSize().getQuantity();
RC->Layout->DataSize = (int)Layout->getDataSize().getQuantity();
RC->Layout->HasOwnVFPtr = Layout->hasOwnVFPtr();
RC->Layout->VBPtrOffset = Layout->getVBPtrOffset().getQuantity();
}
AccessSpecifierDecl* AccessDecl = nullptr;

Loading…
Cancel
Save