From 93cdad40e0147b50339be0aa47121f92723c3dce Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Fri, 2 Jan 2015 21:09:23 +0000 Subject: [PATCH] Added bit field support to the AST. --- src/AST/Field.cs | 6 +++ src/Core/Parser/ASTConverter.cs | 2 + src/CppParser/AST.cpp | 3 +- src/CppParser/AST.h | 2 + src/CppParser/Bindings/CLI/AST.cpp | 20 +++++++++ src/CppParser/Bindings/CLI/AST.h | 12 ++++++ .../CSharp/i686-apple-darwin12.4.0/AST.cs | 42 +++++++++++++++++-- .../Bindings/CSharp/i686-pc-win32-msvc/AST.cs | 42 +++++++++++++++++-- .../Bindings/CSharp/x86_64-linux-gnu/AST.cs | 42 +++++++++++++++++-- src/CppParser/Parser.cpp | 6 ++- 10 files changed, 165 insertions(+), 12 deletions(-) diff --git a/src/AST/Field.cs b/src/AST/Field.cs index 0ff2b4aa..1a36b824 100644 --- a/src/AST/Field.cs +++ b/src/AST/Field.cs @@ -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 Offset = field.Offset; Class = field.Class; Expression = field.Expression; + IsBitField = field.IsBitField; + BitWidth = field.BitWidth; } public override T Visit(IDeclVisitor visitor) diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 1da4b260..574b7409 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -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; } diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index 0f0ce331..2ac1a3b0 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -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) {} diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index f983be80..9c4cdd10 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -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 diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 353a0af3..6776813b 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/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; } +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) { diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index befbe892..487310d9 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -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 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 89ae84c0..484e5df1 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 @@ -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 [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 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 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 __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 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 7f01d50a..73e4ecf3 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs +++ b/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 { - [StructLayout(LayoutKind.Explicit, Size = 136)] + [StructLayout(LayoutKind.Explicit, Size = 144)] public new partial struct Internal { [FieldOffset(0)] @@ -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 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 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 __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 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 957a63fa..9bc64949 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs +++ b/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 { - [StructLayout(LayoutKind.Explicit, Size = 144)] + [StructLayout(LayoutKind.Explicit, Size = 152)] public new partial struct Internal { [FieldOffset(0)] @@ -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 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 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 __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 diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index faa510f0..8740cf34 100644 --- a/src/CppParser/Parser.cpp +++ b/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->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( Entity = new MacroExpansion(); std::string Text; - if (!GetDeclText(PPEntity->getSourceRange(), Text)) - return nullptr; + GetDeclText(PPEntity->getSourceRange(), Text); static_cast(Entity)->Text = Text; break;