diff --git a/src/Bridge/Class.cs b/src/Bridge/Class.cs index 71ad40a5..1ac652fd 100644 --- a/src/Bridge/Class.cs +++ b/src/Bridge/Class.cs @@ -62,9 +62,15 @@ namespace Cxxi public class ClassLayout { public CppAbi ABI { get; set; } - public bool HasOwnVFTable { get; set; } public VFTable VirtualFunctions { get; set; } public VBTable VirtualBases { get; set; } + + public bool HasOwnVFTable; + public bool HasVirtualBases; + + public int Alignment; + public int Size; + public int DataSize; } public enum ClassType @@ -93,7 +99,7 @@ namespace Cxxi public ClassType Type; // ABI-specific class layout. - public List Layouts { get; set; } + public ClassLayout Layout; // True if class provides pure virtual methods. public bool IsAbstract; @@ -120,6 +126,7 @@ namespace Cxxi IsOpaque = false; IsPOD = false; Type = ClassType.RefType; + Layout = new ClassLayout(); } public bool HasBase diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 332f4528..e6a3c5a2 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -364,7 +364,12 @@ Cxxi::Class^ Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, bool IsDependen // Get the record layout information. const ASTRecordLayout* Layout = 0; if (!IsDependent) + { 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(); + } // Iterate through the record fields. for(auto it = Record->field_begin(); it != Record->field_end(); ++it)