Browse Source

Added bit field support to the AST.

pull/395/merge
Joao Matos 11 years ago
parent
commit
93cdad40e0
  1. 6
      src/AST/Field.cs
  2. 2
      src/Core/Parser/ASTConverter.cs
  3. 3
      src/CppParser/AST.cpp
  4. 2
      src/CppParser/AST.h
  5. 20
      src/CppParser/Bindings/CLI/AST.cpp
  6. 12
      src/CppParser/Bindings/CLI/AST.h
  7. 42
      src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs
  8. 42
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs
  9. 42
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs
  10. 6
      src/CppParser/Parser.cpp

6
src/AST/Field.cs

@ -18,6 +18,10 @@ namespace CppSharp.AST
public Expression Expression { get; set; } public Expression Expression { get; set; }
public bool IsBitField { get; set; }
public uint BitWidth { get; set; }
public Field() public Field()
{ {
Offset = 0; Offset = 0;
@ -37,6 +41,8 @@ namespace CppSharp.AST
Offset = field.Offset; Offset = field.Offset;
Class = field.Class; Class = field.Class;
Expression = field.Expression; Expression = field.Expression;
IsBitField = field.IsBitField;
BitWidth = field.BitWidth;
} }
public override T Visit<T>(IDeclVisitor<T> visitor) public override T Visit<T>(IDeclVisitor<T> visitor)

2
src/Core/Parser/ASTConverter.cs

@ -1149,6 +1149,8 @@ namespace CppSharp
_field.Access = VisitAccessSpecifier(decl.Access); _field.Access = VisitAccessSpecifier(decl.Access);
_field.Offset = decl.Offset; _field.Offset = decl.Offset;
_field.Class = Visit(decl.Class) as AST.Class; _field.Class = Visit(decl.Class) as AST.Class;
_field.IsBitField = decl.IsBitField;
_field.BitWidth = decl.BitWidth;
return _field; return _field;
} }

3
src/CppParser/AST.cpp

@ -519,7 +519,8 @@ DEF_STRING(Variable, Mangled)
BaseClassSpecifier::BaseClassSpecifier() : Type(0) {} BaseClassSpecifier::BaseClassSpecifier() : Type(0) {}
Field::Field() : Declaration(DeclarationKind::Field), Class(0) {} Field::Field() : Declaration(DeclarationKind::Field), Class(0),
IsBitField(false), BitWidth(0) {}
AccessSpecifierDecl::AccessSpecifierDecl() AccessSpecifierDecl::AccessSpecifierDecl()
: Declaration(DeclarationKind::AccessSpecifier) {} : Declaration(DeclarationKind::AccessSpecifier) {}

2
src/CppParser/AST.h

@ -662,6 +662,8 @@ public:
CppSharp::CppParser::AST::QualifiedType QualifiedType; CppSharp::CppParser::AST::QualifiedType QualifiedType;
unsigned Offset; unsigned Offset;
CppSharp::CppParser::AST::Class* Class; CppSharp::CppParser::AST::Class* Class;
bool IsBitField;
unsigned BitWidth;
}; };
class CS_API AccessSpecifierDecl : public Declaration class CS_API AccessSpecifierDecl : public Declaration

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

@ -2198,6 +2198,26 @@ void CppSharp::Parser::AST::Field::Class::set(CppSharp::Parser::AST::Class^ valu
((::CppSharp::CppParser::AST::Field*)NativePtr)->Class = (::CppSharp::CppParser::AST::Class*)value->NativePtr; ((::CppSharp::CppParser::AST::Field*)NativePtr)->Class = (::CppSharp::CppParser::AST::Class*)value->NativePtr;
} }
bool CppSharp::Parser::AST::Field::IsBitField::get()
{
return ((::CppSharp::CppParser::AST::Field*)NativePtr)->IsBitField;
}
void CppSharp::Parser::AST::Field::IsBitField::set(bool value)
{
((::CppSharp::CppParser::AST::Field*)NativePtr)->IsBitField = value;
}
unsigned int CppSharp::Parser::AST::Field::BitWidth::get()
{
return ((::CppSharp::CppParser::AST::Field*)NativePtr)->BitWidth;
}
void CppSharp::Parser::AST::Field::BitWidth::set(unsigned int value)
{
((::CppSharp::CppParser::AST::Field*)NativePtr)->BitWidth = value;
}
CppSharp::Parser::AST::AccessSpecifierDecl::AccessSpecifierDecl(::CppSharp::CppParser::AST::AccessSpecifierDecl* native) CppSharp::Parser::AST::AccessSpecifierDecl::AccessSpecifierDecl(::CppSharp::CppParser::AST::AccessSpecifierDecl* native)
: CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)native) : CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)native)
{ {

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

@ -1581,6 +1581,18 @@ namespace CppSharp
CppSharp::Parser::AST::Class^ get(); CppSharp::Parser::AST::Class^ get();
void set(CppSharp::Parser::AST::Class^); void set(CppSharp::Parser::AST::Class^);
} }
property bool IsBitField
{
bool get();
void set(bool);
}
property unsigned int BitWidth
{
unsigned int get();
void set(unsigned int);
}
}; };
public ref class AccessSpecifierDecl : CppSharp::Parser::AST::Declaration public ref class AccessSpecifierDecl : CppSharp::Parser::AST::Declaration

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

@ -5798,7 +5798,7 @@ namespace CppSharp
public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 100)] [StructLayout(LayoutKind.Explicit, Size = 108)]
public new partial struct Internal public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5840,6 +5840,12 @@ namespace CppSharp
[FieldOffset(96)] [FieldOffset(96)]
public global::System.IntPtr Class; public global::System.IntPtr Class;
[FieldOffset(100)]
public bool IsBitField;
[FieldOffset(104)]
public uint BitWidth;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST5FieldC2Ev")] EntryPoint="_ZN8CppSharp9CppParser3AST5FieldC2Ev")]
@ -5870,7 +5876,7 @@ namespace CppSharp
private static Field.Internal* __CopyValue(Field.Internal native) private static Field.Internal* __CopyValue(Field.Internal native)
{ {
var ret = Marshal.AllocHGlobal(100); var ret = Marshal.AllocHGlobal(108);
CppSharp.Parser.AST.Field.Internal.cctor_2(ret, new global::System.IntPtr(&native)); CppSharp.Parser.AST.Field.Internal.cctor_2(ret, new global::System.IntPtr(&native));
return (Field.Internal*) ret; return (Field.Internal*) ret;
} }
@ -5889,7 +5895,7 @@ namespace CppSharp
public Field() public Field()
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(100); __Instance = Marshal.AllocHGlobal(108);
__ownsNativeInstance = true; __ownsNativeInstance = true;
Internal.ctor_0(__Instance); Internal.ctor_0(__Instance);
} }
@ -5947,6 +5953,36 @@ namespace CppSharp
__ptr->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; __ptr->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
} }
} }
public bool IsBitField
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->IsBitField;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->IsBitField = value;
}
}
public uint BitWidth
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->BitWidth;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->BitWidth = value;
}
}
} }
public unsafe partial class AccessSpecifierDecl : CppSharp.Parser.AST.Declaration, IDisposable public unsafe partial class AccessSpecifierDecl : CppSharp.Parser.AST.Declaration, IDisposable

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

@ -5798,7 +5798,7 @@ namespace CppSharp
public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 136)] [StructLayout(LayoutKind.Explicit, Size = 144)]
public new partial struct Internal public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5840,6 +5840,12 @@ namespace CppSharp
[FieldOffset(132)] [FieldOffset(132)]
public global::System.IntPtr Class; public global::System.IntPtr Class;
[FieldOffset(136)]
public bool IsBitField;
[FieldOffset(140)]
public uint BitWidth;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall,
EntryPoint="??0Field@AST@CppParser@CppSharp@@QAE@XZ")] EntryPoint="??0Field@AST@CppParser@CppSharp@@QAE@XZ")]
@ -5870,7 +5876,7 @@ namespace CppSharp
private static Field.Internal* __CopyValue(Field.Internal native) private static Field.Internal* __CopyValue(Field.Internal native)
{ {
var ret = Marshal.AllocHGlobal(136); var ret = Marshal.AllocHGlobal(144);
CppSharp.Parser.AST.Field.Internal.cctor_2(ret, new global::System.IntPtr(&native)); CppSharp.Parser.AST.Field.Internal.cctor_2(ret, new global::System.IntPtr(&native));
return (Field.Internal*) ret; return (Field.Internal*) ret;
} }
@ -5889,7 +5895,7 @@ namespace CppSharp
public Field() public Field()
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(136); __Instance = Marshal.AllocHGlobal(144);
__ownsNativeInstance = true; __ownsNativeInstance = true;
Internal.ctor_0(__Instance); Internal.ctor_0(__Instance);
} }
@ -5947,6 +5953,36 @@ namespace CppSharp
__ptr->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; __ptr->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
} }
} }
public bool IsBitField
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->IsBitField;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->IsBitField = value;
}
}
public uint BitWidth
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->BitWidth;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->BitWidth = value;
}
}
} }
public unsafe partial class AccessSpecifierDecl : CppSharp.Parser.AST.Declaration, IDisposable public unsafe partial class AccessSpecifierDecl : CppSharp.Parser.AST.Declaration, IDisposable

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

@ -5797,7 +5797,7 @@ namespace CppSharp
public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 144)] [StructLayout(LayoutKind.Explicit, Size = 152)]
public new partial struct Internal public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5839,6 +5839,12 @@ namespace CppSharp
[FieldOffset(136)] [FieldOffset(136)]
public global::System.IntPtr Class; public global::System.IntPtr Class;
[FieldOffset(144)]
public bool IsBitField;
[FieldOffset(148)]
public uint BitWidth;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST5FieldC2Ev")] EntryPoint="_ZN8CppSharp9CppParser3AST5FieldC2Ev")]
@ -5869,7 +5875,7 @@ namespace CppSharp
private static Field.Internal* __CopyValue(Field.Internal native) private static Field.Internal* __CopyValue(Field.Internal native)
{ {
var ret = Marshal.AllocHGlobal(144); var ret = Marshal.AllocHGlobal(152);
CppSharp.Parser.AST.Field.Internal.cctor_1(ret, new global::System.IntPtr(&native)); CppSharp.Parser.AST.Field.Internal.cctor_1(ret, new global::System.IntPtr(&native));
return (Field.Internal*) ret; return (Field.Internal*) ret;
} }
@ -5888,7 +5894,7 @@ namespace CppSharp
public Field() public Field()
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(144); __Instance = Marshal.AllocHGlobal(152);
__ownsNativeInstance = true; __ownsNativeInstance = true;
Internal.ctor_0(__Instance); Internal.ctor_0(__Instance);
} }
@ -5946,6 +5952,36 @@ namespace CppSharp
__ptr->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; __ptr->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
} }
} }
public bool IsBitField
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->IsBitField;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->IsBitField = value;
}
}
public uint BitWidth
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->BitWidth;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->BitWidth = value;
}
}
} }
public unsafe partial class AccessSpecifierDecl : CppSharp.Parser.AST.Declaration, IDisposable public unsafe partial class AccessSpecifierDecl : CppSharp.Parser.AST.Declaration, IDisposable

6
src/CppParser/Parser.cpp

@ -1250,6 +1250,9 @@ Field* Parser::WalkFieldCXX(clang::FieldDecl* FD, Class* Class)
F->QualifiedType = GetQualifiedType(FD->getType(), WalkType(FD->getType(), &TL)); F->QualifiedType = GetQualifiedType(FD->getType(), WalkType(FD->getType(), &TL));
F->Access = ConvertToAccess(FD->getAccess()); F->Access = ConvertToAccess(FD->getAccess());
F->Class = Class; F->Class = Class;
F->IsBitField = FD->isBitField();
if (F->IsBitField)
F->BitWidth = FD->getBitWidthValue(C->getASTContext());
Class->Fields.push_back(F); Class->Fields.push_back(F);
@ -2408,8 +2411,7 @@ PreprocessedEntity* Parser::WalkPreprocessedEntity(
Entity = new MacroExpansion(); Entity = new MacroExpansion();
std::string Text; std::string Text;
if (!GetDeclText(PPEntity->getSourceRange(), Text)) GetDeclText(PPEntity->getSourceRange(), Text);
return nullptr;
static_cast<MacroExpansion*>(Entity)->Text = Text; static_cast<MacroExpansion*>(Entity)->Text = Text;
break; break;

Loading…
Cancel
Save