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

2
src/Core/Parser/ASTConverter.cs

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

3
src/CppParser/AST.cpp

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

2
src/CppParser/AST.h

@ -662,6 +662,8 @@ public: @@ -662,6 +662,8 @@ public:
CppSharp::CppParser::AST::QualifiedType QualifiedType;
unsigned Offset;
CppSharp::CppParser::AST::Class* Class;
bool IsBitField;
unsigned BitWidth;
};
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 @@ -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;
}
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::Declaration((::CppSharp::CppParser::AST::Declaration*)native)
{

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

@ -1581,6 +1581,18 @@ namespace CppSharp @@ -1581,6 +1581,18 @@ namespace CppSharp
CppSharp::Parser::AST::Class^ get();
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

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

@ -5798,7 +5798,7 @@ namespace CppSharp @@ -5798,7 +5798,7 @@ namespace CppSharp
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
{
[FieldOffset(0)]
@ -5840,6 +5840,12 @@ namespace CppSharp @@ -5840,6 +5840,12 @@ namespace CppSharp
[FieldOffset(96)]
public global::System.IntPtr Class;
[FieldOffset(100)]
public bool IsBitField;
[FieldOffset(104)]
public uint BitWidth;
[SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST5FieldC2Ev")]
@ -5870,7 +5876,7 @@ namespace CppSharp @@ -5870,7 +5876,7 @@ namespace CppSharp
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));
return (Field.Internal*) ret;
}
@ -5889,7 +5895,7 @@ namespace CppSharp @@ -5889,7 +5895,7 @@ namespace CppSharp
public Field()
: this((Internal*) null)
{
__Instance = Marshal.AllocHGlobal(100);
__Instance = Marshal.AllocHGlobal(108);
__ownsNativeInstance = true;
Internal.ctor_0(__Instance);
}
@ -5947,6 +5953,36 @@ namespace CppSharp @@ -5947,6 +5953,36 @@ namespace CppSharp
__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

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

@ -5798,7 +5798,7 @@ namespace CppSharp @@ -5798,7 +5798,7 @@ namespace CppSharp
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
{
[FieldOffset(0)]
@ -5840,6 +5840,12 @@ namespace CppSharp @@ -5840,6 +5840,12 @@ namespace CppSharp
[FieldOffset(132)]
public global::System.IntPtr Class;
[FieldOffset(136)]
public bool IsBitField;
[FieldOffset(140)]
public uint BitWidth;
[SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall,
EntryPoint="??0Field@AST@CppParser@CppSharp@@QAE@XZ")]
@ -5870,7 +5876,7 @@ namespace CppSharp @@ -5870,7 +5876,7 @@ namespace CppSharp
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));
return (Field.Internal*) ret;
}
@ -5889,7 +5895,7 @@ namespace CppSharp @@ -5889,7 +5895,7 @@ namespace CppSharp
public Field()
: this((Internal*) null)
{
__Instance = Marshal.AllocHGlobal(136);
__Instance = Marshal.AllocHGlobal(144);
__ownsNativeInstance = true;
Internal.ctor_0(__Instance);
}
@ -5947,6 +5953,36 @@ namespace CppSharp @@ -5947,6 +5953,36 @@ namespace CppSharp
__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

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

@ -5797,7 +5797,7 @@ namespace CppSharp @@ -5797,7 +5797,7 @@ namespace CppSharp
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
{
[FieldOffset(0)]
@ -5839,6 +5839,12 @@ namespace CppSharp @@ -5839,6 +5839,12 @@ namespace CppSharp
[FieldOffset(136)]
public global::System.IntPtr Class;
[FieldOffset(144)]
public bool IsBitField;
[FieldOffset(148)]
public uint BitWidth;
[SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST5FieldC2Ev")]
@ -5869,7 +5875,7 @@ namespace CppSharp @@ -5869,7 +5875,7 @@ namespace CppSharp
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));
return (Field.Internal*) ret;
}
@ -5888,7 +5894,7 @@ namespace CppSharp @@ -5888,7 +5894,7 @@ namespace CppSharp
public Field()
: this((Internal*) null)
{
__Instance = Marshal.AllocHGlobal(144);
__Instance = Marshal.AllocHGlobal(152);
__ownsNativeInstance = true;
Internal.ctor_0(__Instance);
}
@ -5946,6 +5952,36 @@ namespace CppSharp @@ -5946,6 +5952,36 @@ namespace CppSharp
__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

6
src/CppParser/Parser.cpp

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

Loading…
Cancel
Save