Browse Source

Added parsing of base classes offsets data to the AST.

This data will be used to solve some multiple inheritance bugs.
pull/404/head
triton 11 years ago
parent
commit
d2d941638a
  1. 1
      src/AST/Class.cs
  2. 3
      src/Core/Parser/ASTConverter.cs
  3. 2
      src/CppParser/AST.cpp
  4. 1
      src/CppParser/AST.h
  5. 10
      src/CppParser/Bindings/CLI/AST.cpp
  6. 6
      src/CppParser/Bindings/CLI/AST.h
  7. 22
      src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs
  8. 22
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs
  9. 22
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs
  10. 4
      src/CppParser/Parser.cpp

1
src/AST/Class.cs

@ -28,6 +28,7 @@ namespace CppSharp.AST @@ -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
{

3
src/Core/Parser/ASTConverter.cs

@ -655,7 +655,8 @@ namespace CppSharp @@ -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;

2
src/CppParser/AST.cpp

@ -531,7 +531,7 @@ Variable::Variable() : Declaration(DeclarationKind::Variable) {} @@ -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) {}

1
src/CppParser/AST.h

@ -664,6 +664,7 @@ struct CS_API BaseClassSpecifier @@ -664,6 +664,7 @@ struct CS_API BaseClassSpecifier
AccessSpecifier Access;
bool IsVirtual;
CppSharp::CppParser::AST::Type* Type;
int Offset;
};
class Class;

10
src/CppParser/Bindings/CLI/AST.cpp

@ -2202,6 +2202,16 @@ void CppSharp::Parser::AST::BaseClassSpecifier::Type::set(CppSharp::Parser::AST: @@ -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)
{

6
src/CppParser/Bindings/CLI/AST.h

@ -1582,6 +1582,12 @@ namespace CppSharp @@ -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

22
src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs

@ -5641,7 +5641,7 @@ namespace CppSharp @@ -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 @@ -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 @@ -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 @@ -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 @@ -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

22
src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs

@ -5641,7 +5641,7 @@ namespace CppSharp @@ -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 @@ -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 @@ -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 @@ -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 @@ -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

22
src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs

@ -5640,7 +5640,7 @@ namespace CppSharp @@ -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 @@ -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 @@ -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 @@ -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 @@ -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

4
src/CppParser/Parser.cpp

@ -794,6 +794,10 @@ void Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, Class* RC) @@ -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);
}

Loading…
Cancel
Save