diff --git a/src/AST/Class.cs b/src/AST/Class.cs index f87fec7a..45b535f5 100644 --- a/src/AST/Class.cs +++ b/src/AST/Class.cs @@ -28,6 +28,7 @@ namespace CppSharp.AST public AccessSpecifier Access { get; set; } public bool IsVirtual { get; set; } public Type Type { get; set; } + public int Offset { get; set; } public Class Class { diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 5e84e342..ab853bce 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -655,7 +655,8 @@ namespace CppSharp { IsVirtual = @base.IsVirtual, Access = VisitAccessSpecifier(@base.Access), - Type = typeConverter.Visit(@base.Type) + Type = typeConverter.Visit(@base.Type), + Offset = @base.Offset }; return _base; diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index b1f91a28..c35959b4 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -531,7 +531,7 @@ Variable::Variable() : Declaration(DeclarationKind::Variable) {} DEF_STRING(Variable, Mangled) -BaseClassSpecifier::BaseClassSpecifier() : Type(0) {} +BaseClassSpecifier::BaseClassSpecifier() : Type(0), Offset(0) {} Field::Field() : Declaration(DeclarationKind::Field), Class(0), IsBitField(false), BitWidth(0) {} diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index d52f5cfc..698ffcfd 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -664,6 +664,7 @@ struct CS_API BaseClassSpecifier AccessSpecifier Access; bool IsVirtual; CppSharp::CppParser::AST::Type* Type; + int Offset; }; class Class; diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 43669977..bf22274f 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/src/CppParser/Bindings/CLI/AST.cpp @@ -2202,6 +2202,16 @@ void CppSharp::Parser::AST::BaseClassSpecifier::Type::set(CppSharp::Parser::AST: ((::CppSharp::CppParser::AST::BaseClassSpecifier*)NativePtr)->Type = (::CppSharp::CppParser::AST::Type*)value->NativePtr; } +int CppSharp::Parser::AST::BaseClassSpecifier::Offset::get() +{ + return ((::CppSharp::CppParser::AST::BaseClassSpecifier*)NativePtr)->Offset; +} + +void CppSharp::Parser::AST::BaseClassSpecifier::Offset::set(int value) +{ + ((::CppSharp::CppParser::AST::BaseClassSpecifier*)NativePtr)->Offset = value; +} + CppSharp::Parser::AST::Field::Field(::CppSharp::CppParser::AST::Field* native) : CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)native) { diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index 602bd529..339f42e6 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -1582,6 +1582,12 @@ namespace CppSharp CppSharp::Parser::AST::Type^ get(); void set(CppSharp::Parser::AST::Type^); } + + property int Offset + { + int get(); + void set(int); + } }; public ref class Field : CppSharp::Parser::AST::Declaration diff --git a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs index 6d7188aa..3ff187f8 100644 --- a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs @@ -5641,7 +5641,7 @@ namespace CppSharp public unsafe partial class BaseClassSpecifier : IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 12)] + [StructLayout(LayoutKind.Explicit, Size = 16)] public partial struct Internal { [FieldOffset(0)] @@ -5653,6 +5653,9 @@ namespace CppSharp [FieldOffset(8)] public global::System.IntPtr Type; + [FieldOffset(12)] + public int Offset; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST18BaseClassSpecifierC2Ev")] @@ -5680,7 +5683,7 @@ namespace CppSharp private static BaseClassSpecifier.Internal* __CopyValue(BaseClassSpecifier.Internal native) { - var ret = (BaseClassSpecifier.Internal*) Marshal.AllocHGlobal(12); + var ret = (BaseClassSpecifier.Internal*) Marshal.AllocHGlobal(16); *ret = native; return ret; } @@ -5698,7 +5701,7 @@ namespace CppSharp public BaseClassSpecifier() { - __Instance = Marshal.AllocHGlobal(12); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; Internal.ctor_0(__Instance); } @@ -5755,6 +5758,19 @@ namespace CppSharp ((Internal*) __Instance)->Type = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; } } + + public int Offset + { + get + { + return ((Internal*) __Instance)->Offset; + } + + set + { + ((Internal*) __Instance)->Offset = value; + } + } } public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs index d520aac4..8e556ad4 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs @@ -5641,7 +5641,7 @@ namespace CppSharp public unsafe partial class BaseClassSpecifier : IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 12)] + [StructLayout(LayoutKind.Explicit, Size = 16)] public partial struct Internal { [FieldOffset(0)] @@ -5653,6 +5653,9 @@ namespace CppSharp [FieldOffset(8)] public global::System.IntPtr Type; + [FieldOffset(12)] + public int Offset; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, EntryPoint="??0BaseClassSpecifier@AST@CppParser@CppSharp@@QAE@XZ")] @@ -5680,7 +5683,7 @@ namespace CppSharp private static BaseClassSpecifier.Internal* __CopyValue(BaseClassSpecifier.Internal native) { - var ret = (BaseClassSpecifier.Internal*) Marshal.AllocHGlobal(12); + var ret = (BaseClassSpecifier.Internal*) Marshal.AllocHGlobal(16); *ret = native; return ret; } @@ -5698,7 +5701,7 @@ namespace CppSharp public BaseClassSpecifier() { - __Instance = Marshal.AllocHGlobal(12); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; Internal.ctor_0(__Instance); } @@ -5755,6 +5758,19 @@ namespace CppSharp ((Internal*) __Instance)->Type = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; } } + + public int Offset + { + get + { + return ((Internal*) __Instance)->Offset; + } + + set + { + ((Internal*) __Instance)->Offset = value; + } + } } public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs index 88854053..dc8365ef 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs @@ -5640,7 +5640,7 @@ namespace CppSharp public unsafe partial class BaseClassSpecifier : IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 16)] + [StructLayout(LayoutKind.Explicit, Size = 24)] public partial struct Internal { [FieldOffset(0)] @@ -5652,6 +5652,9 @@ namespace CppSharp [FieldOffset(8)] public global::System.IntPtr Type; + [FieldOffset(16)] + public int Offset; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST18BaseClassSpecifierC2Ev")] @@ -5679,7 +5682,7 @@ namespace CppSharp private static BaseClassSpecifier.Internal* __CopyValue(BaseClassSpecifier.Internal native) { - var ret = (BaseClassSpecifier.Internal*) Marshal.AllocHGlobal(16); + var ret = (BaseClassSpecifier.Internal*) Marshal.AllocHGlobal(24); *ret = native; return ret; } @@ -5697,7 +5700,7 @@ namespace CppSharp public BaseClassSpecifier() { - __Instance = Marshal.AllocHGlobal(16); + __Instance = Marshal.AllocHGlobal(24); __ownsNativeInstance = true; Internal.ctor_0(__Instance); } @@ -5754,6 +5757,19 @@ namespace CppSharp ((Internal*) __Instance)->Type = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; } } + + public int Offset + { + get + { + return ((Internal*) __Instance)->Offset; + } + + set + { + ((Internal*) __Instance)->Offset = value; + } + } } public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 80e92628..6d28cce3 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -794,6 +794,10 @@ void Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, Class* RC) auto BSTL = BS.getTypeSourceInfo()->getTypeLoc(); Base->Type = WalkType(BS.getType(), &BSTL); + auto BaseDecl = BS.getType()->getAsCXXRecordDecl(); + auto Offset = Layout->getBaseClassOffset(BaseDecl); + Base->Offset = Offset.getQuantity(); + RC->Bases.push_back(Base); }