Browse Source

Initialized some previously uninitialized memory fields on the parser.

pull/222/head
triton 12 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) {}
VTableLayout::VTableLayout() {} VTableLayout::VTableLayout() {}
DEF_VECTOR(VTableLayout, VTableComponent, Components) 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) DEF_VECTOR(ClassLayout, VFTableInfo, VFTables)
Declaration::Declaration(DeclarationKind kind) Declaration::Declaration(DeclarationKind kind)
@ -373,14 +377,15 @@ Field::Field() : Declaration(DeclarationKind::Field), Class(0) {}
AccessSpecifierDecl::AccessSpecifierDecl() AccessSpecifierDecl::AccessSpecifierDecl()
: Declaration(DeclarationKind::AccessSpecifier) {} : Declaration(DeclarationKind::AccessSpecifier) {}
Class::Class() { Kind = DeclarationKind::Class; } Class::Class() : Layout(0) { Kind = DeclarationKind::Class; }
DEF_VECTOR(Class, BaseClassSpecifier*, Bases) DEF_VECTOR(Class, BaseClassSpecifier*, Bases)
DEF_VECTOR(Class, Field*, Fields) DEF_VECTOR(Class, Field*, Fields)
DEF_VECTOR(Class, Method*, Methods) DEF_VECTOR(Class, Method*, Methods)
DEF_VECTOR(Class, AccessSpecifierDecl*, Specifiers) DEF_VECTOR(Class, AccessSpecifierDecl*, Specifiers)
Template::Template() : Declaration(DeclarationKind::Template) {} Template::Template() : Declaration(DeclarationKind::Template),
TemplatedDecl(0) {}
DEF_VECTOR(Template, TemplateParameter, Parameters) DEF_VECTOR(Template, TemplateParameter, Parameters)

3
src/CppParser/AST.h

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

19
src/CppParser/Parser.cpp

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

Loading…
Cancel
Save