diff --git a/src/AST/Expression.cs b/src/AST/Expression.cs index 61ebcd14..865f54a1 100644 --- a/src/AST/Expression.cs +++ b/src/AST/Expression.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace CppSharp.AST { public abstract class Expression : Statement @@ -40,19 +42,14 @@ namespace CppSharp.AST } } - public class CastExpr : Expression + public class CXXConstructExpr : Expression { - public Expression SubExpression; - - public override T Visit(IExpressionVisitor visitor) + public CXXConstructExpr() { - return visitor.VisitExpression(this); + Arguments = new List(); } - } - public class CtorExpr : Expression - { - public Expression SubExpression; + public List Arguments { get; private set; } public override T Visit(IExpressionVisitor visitor) { diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 325e7a80..cf12b0e9 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -921,34 +921,20 @@ namespace CppSharp expression.Class = AST.StatementClass.CXXOperatorCall; break; case StatementClass.CXXConstructExprClass: + var constructorExpression = new AST.CXXConstructExpr(); + var constructorExpr = CXXConstructExpr.__CreateInstance(statement.__Instance); + for (uint i = 0; i < constructorExpr.ArgumentsCount; i++) { - var ctorExp = new AST.CtorExpr(); - ctorExp.SubExpression = VisitStatement(((Expression) statement).Subexpression); - expression = ctorExp; - expression.Class = AST.StatementClass.ConstructorReference; - break; - } - case StatementClass.ImplicitCastExpr: - { - var castExp = new AST.CastExpr(); - castExp.SubExpression = VisitStatement(((Expression) statement).Subexpression); - expression = castExp; - expression.Class = AST.StatementClass.ImplicitCast; - break; - } - case StatementClass.ExplicitCastExpr: - { - var castExp = new AST.CastExpr(); - castExp.SubExpression = VisitStatement(((Expression) statement).Subexpression); - expression = castExp; - expression.Class = AST.StatementClass.ExplicitCast; - break; + var argument = VisitStatement(constructorExpr.getArguments(i)); + constructorExpression.Arguments.Add(argument); } + expression = constructorExpression; + break; default: expression = new AST.BuiltinTypeExpression(); break; } - expression.Declaration = this.typeConverter.declConverter.Visit(statement.Decl); + expression.Declaration = typeConverter.declConverter.Visit(statement.Decl); expression.String = statement.String; return expression; } diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index 77e8ecb4..932f9463 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -475,14 +475,19 @@ DEF_STRING(Statement, String) Statement::Statement(const std::string& str, StatementClass stmtClass, Declaration* decl) : String(str), Class(stmtClass), Decl(decl) {} -Expression::Expression(const std::string& str, StatementClass stmtClass, Declaration* decl, Expression* subexpr) -:Statement(str, stmtClass, decl), Subexpression(subexpr) {} +Expression::Expression(const std::string& str, StatementClass stmtClass, Declaration* decl) + : Statement(str, stmtClass, decl) {} BinaryOperator::BinaryOperator(const std::string& str, Expression* lhs, Expression* rhs, const std::string& opcodeStr) : Expression(str, StatementClass::BinaryOperator), LHS(lhs), RHS(rhs), OpcodeStr(opcodeStr) {} DEF_STRING(BinaryOperator, OpcodeStr) +CXXConstructExpr::CXXConstructExpr(const std::string& str, Declaration* decl) + : Expression(str, StatementClass::CXXConstructExprClass, decl) {} + +DEF_VECTOR(CXXConstructExpr, Expression*, Arguments) + Parameter::Parameter() : Declaration(DeclarationKind::Parameter), IsIndirect(false), HasDefaultValue(false), DefaultArgument(0) {} diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 5994b9b8..a87670da 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -497,8 +497,7 @@ public: class CS_API Expression : public Statement { public: - Expression(const std::string& str, StatementClass Class = StatementClass::Any, Declaration* decl = 0, Expression* subexpr = 0); - Expression* Subexpression; + Expression(const std::string& str, StatementClass Class = StatementClass::Any, Declaration* decl = 0); }; class CS_API BinaryOperator : public Expression @@ -510,6 +509,13 @@ public: STRING(OpcodeStr) }; +class CS_API CXXConstructExpr : public Expression +{ +public: + CXXConstructExpr(const std::string& str, Declaration* decl = 0); + VECTOR(Expression*, Arguments) +}; + class CS_API Parameter : public Declaration { public: diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 1f028551..85b86416 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/src/CppParser/Bindings/CLI/AST.cpp @@ -1836,16 +1836,6 @@ CppSharp::Parser::AST::Expression::Expression(CppSharp::Parser::AST::Expression^ NativePtr = new ::CppSharp::CppParser::AST::Expression(arg0); } -CppSharp::Parser::AST::Expression^ CppSharp::Parser::AST::Expression::Subexpression::get() -{ - return (((::CppSharp::CppParser::AST::Expression*)NativePtr)->Subexpression == nullptr) ? nullptr : gcnew CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)((::CppSharp::CppParser::AST::Expression*)NativePtr)->Subexpression); -} - -void CppSharp::Parser::AST::Expression::Subexpression::set(CppSharp::Parser::AST::Expression^ value) -{ - ((::CppSharp::CppParser::AST::Expression*)NativePtr)->Subexpression = (::CppSharp::CppParser::AST::Expression*)value->NativePtr; -} - CppSharp::Parser::AST::BinaryOperator::BinaryOperator(::CppSharp::CppParser::AST::BinaryOperator* native) : CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)native) { @@ -1897,6 +1887,47 @@ void CppSharp::Parser::AST::BinaryOperator::RHS::set(CppSharp::Parser::AST::Expr ((::CppSharp::CppParser::AST::BinaryOperator*)NativePtr)->RHS = (::CppSharp::CppParser::AST::Expression*)value->NativePtr; } +CppSharp::Parser::AST::CXXConstructExpr::CXXConstructExpr(::CppSharp::CppParser::AST::CXXConstructExpr* native) + : CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)native) +{ +} + +CppSharp::Parser::AST::CXXConstructExpr^ CppSharp::Parser::AST::CXXConstructExpr::__CreateInstance(::System::IntPtr native) +{ + return gcnew ::CppSharp::Parser::AST::CXXConstructExpr((::CppSharp::CppParser::AST::CXXConstructExpr*) native.ToPointer()); +} + +CppSharp::Parser::AST::Expression^ CppSharp::Parser::AST::CXXConstructExpr::getArguments(unsigned int i) +{ + auto __ret = ((::CppSharp::CppParser::AST::CXXConstructExpr*)NativePtr)->getArguments(i); + if (__ret == nullptr) return nullptr; + return (__ret == nullptr) ? nullptr : gcnew CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)__ret); +} + +void CppSharp::Parser::AST::CXXConstructExpr::addArguments(CppSharp::Parser::AST::Expression^ s) +{ + auto arg0 = (::CppSharp::CppParser::AST::Expression*)s->NativePtr; + ((::CppSharp::CppParser::AST::CXXConstructExpr*)NativePtr)->addArguments(arg0); +} + +void CppSharp::Parser::AST::CXXConstructExpr::clearArguments() +{ + ((::CppSharp::CppParser::AST::CXXConstructExpr*)NativePtr)->clearArguments(); +} + +CppSharp::Parser::AST::CXXConstructExpr::CXXConstructExpr(CppSharp::Parser::AST::CXXConstructExpr^ _0) + : CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)nullptr) +{ + auto &arg0 = *(::CppSharp::CppParser::AST::CXXConstructExpr*)_0->NativePtr; + NativePtr = new ::CppSharp::CppParser::AST::CXXConstructExpr(arg0); +} + +unsigned int CppSharp::Parser::AST::CXXConstructExpr::ArgumentsCount::get() +{ + auto __ret = ((::CppSharp::CppParser::AST::CXXConstructExpr*)NativePtr)->getArgumentsCount(); + return __ret; +} + CppSharp::Parser::AST::Parameter::Parameter(::CppSharp::CppParser::AST::Parameter* native) : CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)native) { @@ -3852,10 +3883,11 @@ unsigned int CppSharp::Parser::AST::TParamCommandComment::getPosition(unsigned i return __ret; } -void CppSharp::Parser::AST::TParamCommandComment::addPosition(unsigned int* s) +void CppSharp::Parser::AST::TParamCommandComment::addPosition([System::Runtime::InteropServices::In, System::Runtime::InteropServices::Out] unsigned int% s) { - auto arg0 = (unsigned int&)s; + unsigned int arg0 = s; ((::CppSharp::CppParser::AST::TParamCommandComment*)NativePtr)->addPosition(arg0); + s = arg0; } void CppSharp::Parser::AST::TParamCommandComment::clearPosition() diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index b4e2a0ac..817bdd48 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -34,6 +34,7 @@ namespace CppSharp ref class BlockCommandComment; ref class BlockContentComment; ref class BuiltinType; + ref class CXXConstructExpr; ref class Class; ref class ClassLayout; ref class ClassTemplate; @@ -1343,12 +1344,6 @@ namespace CppSharp Expression(::CppSharp::CppParser::AST::Expression* native); static Expression^ __CreateInstance(::System::IntPtr native); Expression(CppSharp::Parser::AST::Expression^ _0); - - property CppSharp::Parser::AST::Expression^ Subexpression - { - CppSharp::Parser::AST::Expression^ get(); - void set(CppSharp::Parser::AST::Expression^); - } }; public ref class BinaryOperator : CppSharp::Parser::AST::Expression @@ -1378,6 +1373,26 @@ namespace CppSharp } }; + public ref class CXXConstructExpr : CppSharp::Parser::AST::Expression + { + public: + + CXXConstructExpr(::CppSharp::CppParser::AST::CXXConstructExpr* native); + static CXXConstructExpr^ __CreateInstance(::System::IntPtr native); + CXXConstructExpr(CppSharp::Parser::AST::CXXConstructExpr^ _0); + + property unsigned int ArgumentsCount + { + unsigned int get(); + } + + CppSharp::Parser::AST::Expression^ getArguments(unsigned int i); + + void addArguments(CppSharp::Parser::AST::Expression^ s); + + void clearArguments(); + }; + public ref class Parameter : CppSharp::Parser::AST::Declaration { public: @@ -2414,7 +2429,7 @@ namespace CppSharp unsigned int getPosition(unsigned int i); - void addPosition(unsigned int* s); + void addPosition([System::Runtime::InteropServices::In, System::Runtime::InteropServices::Out] unsigned int% s); void clearPosition(); }; 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 a9cc27cc..e4075fb9 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 @@ -5012,7 +5012,7 @@ namespace CppSharp public unsafe partial class Expression : CppSharp.Parser.AST.Statement, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 24)] + [StructLayout(LayoutKind.Explicit, Size = 20)] public new partial struct Internal { [FieldOffset(0)] @@ -5021,9 +5021,6 @@ namespace CppSharp [FieldOffset(4)] public global::System.IntPtr Decl; - [FieldOffset(20)] - public global::System.IntPtr Subexpression; - [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")] @@ -5049,7 +5046,7 @@ namespace CppSharp private static Expression.Internal* __CopyValue(Expression.Internal native) { - var ret = Marshal.AllocHGlobal(24); + var ret = Marshal.AllocHGlobal(20); CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native)); return (Expression.Internal*) ret; } @@ -5069,7 +5066,7 @@ namespace CppSharp public Expression(CppSharp.Parser.AST.Expression _0) : this((Internal*) null) { - __Instance = Marshal.AllocHGlobal(24); + __Instance = Marshal.AllocHGlobal(20); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; @@ -5094,29 +5091,11 @@ namespace CppSharp if (__ownsNativeInstance) Marshal.FreeHGlobal(__Instance); } - - public CppSharp.Parser.AST.Expression Subexpression - { - get - { - CppSharp.Parser.AST.Expression __result0; - if (((Internal*) __Instance)->Subexpression == IntPtr.Zero) __result0 = null; - else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Subexpression)) - __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[((Internal*) __Instance)->Subexpression]; - else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(((Internal*) __Instance)->Subexpression); - return __result0; - } - - set - { - ((Internal*) __Instance)->Subexpression = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; - } - } } public unsafe partial class BinaryOperator : CppSharp.Parser.AST.Expression, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 44)] + [StructLayout(LayoutKind.Explicit, Size = 40)] public new partial struct Internal { [FieldOffset(0)] @@ -5126,12 +5105,9 @@ namespace CppSharp public global::System.IntPtr Decl; [FieldOffset(20)] - public global::System.IntPtr Subexpression; - - [FieldOffset(24)] public global::System.IntPtr LHS; - [FieldOffset(28)] + [FieldOffset(24)] public global::System.IntPtr RHS; [SuppressUnmanagedCodeSecurity] @@ -5169,7 +5145,7 @@ namespace CppSharp private static BinaryOperator.Internal* __CopyValue(BinaryOperator.Internal native) { - var ret = Marshal.AllocHGlobal(44); + var ret = Marshal.AllocHGlobal(40); CppSharp.Parser.AST.BinaryOperator.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return (BinaryOperator.Internal*) ret; } @@ -5189,7 +5165,7 @@ namespace CppSharp public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0) : this((Internal*) null) { - __Instance = Marshal.AllocHGlobal(44); + __Instance = Marshal.AllocHGlobal(40); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; @@ -5268,6 +5244,140 @@ namespace CppSharp } } + public unsafe partial class CXXConstructExpr : CppSharp.Parser.AST.Expression, IDisposable + { + [StructLayout(LayoutKind.Explicit, Size = 32)] + public new partial struct Internal + { + [FieldOffset(0)] + public CppSharp.Parser.AST.StatementClass Class; + + [FieldOffset(4)] + public global::System.IntPtr Decl; + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExprC2ERKS2_")] + internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExprD2Ev")] + internal static extern void dtor_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr12getArgumentsEj")] + internal static extern global::System.IntPtr getArguments_0(global::System.IntPtr instance, uint i); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr12addArgumentsERPNS1_10ExpressionE")] + internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr14clearArgumentsEv")] + internal static extern void clearArguments_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr17getArgumentsCountEv")] + internal static extern uint getArgumentsCount_0(global::System.IntPtr instance); + } + + private readonly bool __ownsNativeInstance; + + public static new CXXConstructExpr __CreateInstance(global::System.IntPtr native) + { + return new CXXConstructExpr((CXXConstructExpr.Internal*) native); + } + + public static CXXConstructExpr __CreateInstance(CXXConstructExpr.Internal native) + { + return new CXXConstructExpr(native); + } + + private static CXXConstructExpr.Internal* __CopyValue(CXXConstructExpr.Internal native) + { + var ret = Marshal.AllocHGlobal(32); + CppSharp.Parser.AST.CXXConstructExpr.Internal.cctor_2(ret, new global::System.IntPtr(&native)); + return (CXXConstructExpr.Internal*) ret; + } + + private CXXConstructExpr(CXXConstructExpr.Internal native) + : this(__CopyValue(native)) + { + __ownsNativeInstance = true; + NativeToManagedMap[__Instance] = this; + } + + protected CXXConstructExpr(CXXConstructExpr.Internal* native, bool isInternalImpl = false) + : base((CppSharp.Parser.AST.Expression.Internal*) native) + { + } + + public CXXConstructExpr(CppSharp.Parser.AST.CXXConstructExpr _0) + : this((Internal*) null) + { + __Instance = Marshal.AllocHGlobal(32); + __ownsNativeInstance = true; + NativeToManagedMap[__Instance] = this; + var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; + Internal.cctor_2(__Instance, arg0); + } + + protected override void Dispose(bool disposing) + { + DestroyNativeInstance(false); + base.Dispose(disposing); + } + + public override void DestroyNativeInstance() + { + DestroyNativeInstance(true); + } + + private void DestroyNativeInstance(bool force) + { + CppSharp.Parser.AST.Statement __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + } + + public CppSharp.Parser.AST.Expression getArguments(uint i) + { + var __ret = Internal.getArguments_0(__Instance, i); + CppSharp.Parser.AST.Expression __result0; + if (__ret == IntPtr.Zero) __result0 = null; + else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(__ret)) + __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[__ret]; + else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(__ret); + return __result0; + } + + public void addArguments(CppSharp.Parser.AST.Expression s) + { + var arg0 = ReferenceEquals(s, null) ? global::System.IntPtr.Zero : s.__Instance; + Internal.addArguments_0(__Instance, arg0); + } + + public void clearArguments() + { + Internal.clearArguments_0(__Instance); + } + + public uint ArgumentsCount + { + get + { + var __ret = Internal.getArgumentsCount_0(__Instance); + return __ret; + } + } + } + public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable { [StructLayout(LayoutKind.Explicit, Size = 112)] @@ -11132,10 +11242,12 @@ namespace CppSharp return __ret; } - public void addPosition(uint* s) + public void addPosition(ref uint s) { - var arg0 = s; - Internal.addPosition_0(__Instance, arg0); + fixed (uint* arg0 = &s) + { + Internal.addPosition_0(__Instance, arg0); + } } public void clearPosition() 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 33cf1e91..9cdc7870 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs @@ -5012,7 +5012,7 @@ namespace CppSharp public unsafe partial class Expression : CppSharp.Parser.AST.Statement, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 36)] + [StructLayout(LayoutKind.Explicit, Size = 32)] public new partial struct Internal { [FieldOffset(0)] @@ -5021,9 +5021,6 @@ namespace CppSharp [FieldOffset(4)] public global::System.IntPtr Decl; - [FieldOffset(32)] - public global::System.IntPtr Subexpression; - [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, EntryPoint="??0Expression@AST@CppParser@CppSharp@@QAE@ABV0123@@Z")] @@ -5049,7 +5046,7 @@ namespace CppSharp private static Expression.Internal* __CopyValue(Expression.Internal native) { - var ret = Marshal.AllocHGlobal(36); + var ret = Marshal.AllocHGlobal(32); CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native)); return (Expression.Internal*) ret; } @@ -5069,7 +5066,7 @@ namespace CppSharp public Expression(CppSharp.Parser.AST.Expression _0) : this((Internal*) null) { - __Instance = Marshal.AllocHGlobal(36); + __Instance = Marshal.AllocHGlobal(32); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; @@ -5094,29 +5091,11 @@ namespace CppSharp if (__ownsNativeInstance) Marshal.FreeHGlobal(__Instance); } - - public CppSharp.Parser.AST.Expression Subexpression - { - get - { - CppSharp.Parser.AST.Expression __result0; - if (((Internal*) __Instance)->Subexpression == IntPtr.Zero) __result0 = null; - else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Subexpression)) - __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[((Internal*) __Instance)->Subexpression]; - else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(((Internal*) __Instance)->Subexpression); - return __result0; - } - - set - { - ((Internal*) __Instance)->Subexpression = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; - } - } } public unsafe partial class BinaryOperator : CppSharp.Parser.AST.Expression, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 68)] + [StructLayout(LayoutKind.Explicit, Size = 64)] public new partial struct Internal { [FieldOffset(0)] @@ -5126,12 +5105,9 @@ namespace CppSharp public global::System.IntPtr Decl; [FieldOffset(32)] - public global::System.IntPtr Subexpression; - - [FieldOffset(36)] public global::System.IntPtr LHS; - [FieldOffset(40)] + [FieldOffset(36)] public global::System.IntPtr RHS; [SuppressUnmanagedCodeSecurity] @@ -5169,7 +5145,7 @@ namespace CppSharp private static BinaryOperator.Internal* __CopyValue(BinaryOperator.Internal native) { - var ret = Marshal.AllocHGlobal(68); + var ret = Marshal.AllocHGlobal(64); CppSharp.Parser.AST.BinaryOperator.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return (BinaryOperator.Internal*) ret; } @@ -5189,7 +5165,7 @@ namespace CppSharp public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0) : this((Internal*) null) { - __Instance = Marshal.AllocHGlobal(68); + __Instance = Marshal.AllocHGlobal(64); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; @@ -5268,6 +5244,140 @@ namespace CppSharp } } + public unsafe partial class CXXConstructExpr : CppSharp.Parser.AST.Expression, IDisposable + { + [StructLayout(LayoutKind.Explicit, Size = 44)] + public new partial struct Internal + { + [FieldOffset(0)] + public CppSharp.Parser.AST.StatementClass Class; + + [FieldOffset(4)] + public global::System.IntPtr Decl; + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="??0CXXConstructExpr@AST@CppParser@CppSharp@@QAE@ABV0123@@Z")] + internal static extern global::System.IntPtr cctor_2(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="??1CXXConstructExpr@AST@CppParser@CppSharp@@QAE@XZ")] + internal static extern void dtor_0(global::System.IntPtr instance, int delete); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="?getArguments@CXXConstructExpr@AST@CppParser@CppSharp@@QAEPAVExpression@234@I@Z")] + internal static extern global::System.IntPtr getArguments_0(global::System.IntPtr instance, uint i); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="?addArguments@CXXConstructExpr@AST@CppParser@CppSharp@@QAEXAAPAVExpression@234@@Z")] + internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="?clearArguments@CXXConstructExpr@AST@CppParser@CppSharp@@QAEXXZ")] + internal static extern void clearArguments_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="?getArgumentsCount@CXXConstructExpr@AST@CppParser@CppSharp@@QAEIXZ")] + internal static extern uint getArgumentsCount_0(global::System.IntPtr instance); + } + + private readonly bool __ownsNativeInstance; + + public static new CXXConstructExpr __CreateInstance(global::System.IntPtr native) + { + return new CXXConstructExpr((CXXConstructExpr.Internal*) native); + } + + public static CXXConstructExpr __CreateInstance(CXXConstructExpr.Internal native) + { + return new CXXConstructExpr(native); + } + + private static CXXConstructExpr.Internal* __CopyValue(CXXConstructExpr.Internal native) + { + var ret = Marshal.AllocHGlobal(44); + CppSharp.Parser.AST.CXXConstructExpr.Internal.cctor_2(ret, new global::System.IntPtr(&native)); + return (CXXConstructExpr.Internal*) ret; + } + + private CXXConstructExpr(CXXConstructExpr.Internal native) + : this(__CopyValue(native)) + { + __ownsNativeInstance = true; + NativeToManagedMap[__Instance] = this; + } + + protected CXXConstructExpr(CXXConstructExpr.Internal* native, bool isInternalImpl = false) + : base((CppSharp.Parser.AST.Expression.Internal*) native) + { + } + + public CXXConstructExpr(CppSharp.Parser.AST.CXXConstructExpr _0) + : this((Internal*) null) + { + __Instance = Marshal.AllocHGlobal(44); + __ownsNativeInstance = true; + NativeToManagedMap[__Instance] = this; + var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; + Internal.cctor_2(__Instance, arg0); + } + + protected override void Dispose(bool disposing) + { + DestroyNativeInstance(false); + base.Dispose(disposing); + } + + public override void DestroyNativeInstance() + { + DestroyNativeInstance(true); + } + + private void DestroyNativeInstance(bool force) + { + CppSharp.Parser.AST.Statement __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + } + + public CppSharp.Parser.AST.Expression getArguments(uint i) + { + var __ret = Internal.getArguments_0(__Instance, i); + CppSharp.Parser.AST.Expression __result0; + if (__ret == IntPtr.Zero) __result0 = null; + else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(__ret)) + __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[__ret]; + else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(__ret); + return __result0; + } + + public void addArguments(CppSharp.Parser.AST.Expression s) + { + var arg0 = ReferenceEquals(s, null) ? global::System.IntPtr.Zero : s.__Instance; + Internal.addArguments_0(__Instance, arg0); + } + + public void clearArguments() + { + Internal.clearArguments_0(__Instance); + } + + public uint ArgumentsCount + { + get + { + var __ret = Internal.getArgumentsCount_0(__Instance); + return __ret; + } + } + } + public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable { [StructLayout(LayoutKind.Explicit, Size = 148)] @@ -11132,10 +11242,12 @@ namespace CppSharp return __ret; } - public void addPosition(uint* s) + public void addPosition(ref uint s) { - var arg0 = s; - Internal.addPosition_0(__Instance, arg0); + fixed (uint* arg0 = &s) + { + Internal.addPosition_0(__Instance, arg0); + } } public void clearPosition() diff --git a/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/AST.cs b/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/AST.cs index 2a029bb8..86d298da 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/AST.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/AST.cs @@ -5011,7 +5011,7 @@ namespace CppSharp public unsafe partial class Expression : CppSharp.Parser.AST.Statement, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 48)] + [StructLayout(LayoutKind.Explicit, Size = 40)] public new partial struct Internal { [FieldOffset(0)] @@ -5020,9 +5020,6 @@ namespace CppSharp [FieldOffset(8)] public global::System.IntPtr Decl; - [FieldOffset(40)] - public global::System.IntPtr Subexpression; - [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")] @@ -5048,7 +5045,7 @@ namespace CppSharp private static Expression.Internal* __CopyValue(Expression.Internal native) { - var ret = Marshal.AllocHGlobal(48); + var ret = Marshal.AllocHGlobal(40); CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native)); return (Expression.Internal*) ret; } @@ -5068,7 +5065,7 @@ namespace CppSharp public Expression(CppSharp.Parser.AST.Expression _0) : this((Internal*) null) { - __Instance = Marshal.AllocHGlobal(48); + __Instance = Marshal.AllocHGlobal(40); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; @@ -5093,29 +5090,11 @@ namespace CppSharp if (__ownsNativeInstance) Marshal.FreeHGlobal(__Instance); } - - public CppSharp.Parser.AST.Expression Subexpression - { - get - { - CppSharp.Parser.AST.Expression __result0; - if (((Internal*) __Instance)->Subexpression == IntPtr.Zero) __result0 = null; - else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Subexpression)) - __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[((Internal*) __Instance)->Subexpression]; - else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(((Internal*) __Instance)->Subexpression); - return __result0; - } - - set - { - ((Internal*) __Instance)->Subexpression = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; - } - } } public unsafe partial class BinaryOperator : CppSharp.Parser.AST.Expression, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 88)] + [StructLayout(LayoutKind.Explicit, Size = 80)] public new partial struct Internal { [FieldOffset(0)] @@ -5125,12 +5104,9 @@ namespace CppSharp public global::System.IntPtr Decl; [FieldOffset(40)] - public global::System.IntPtr Subexpression; - - [FieldOffset(48)] public global::System.IntPtr LHS; - [FieldOffset(56)] + [FieldOffset(48)] public global::System.IntPtr RHS; [SuppressUnmanagedCodeSecurity] @@ -5168,7 +5144,7 @@ namespace CppSharp private static BinaryOperator.Internal* __CopyValue(BinaryOperator.Internal native) { - var ret = Marshal.AllocHGlobal(88); + var ret = Marshal.AllocHGlobal(80); CppSharp.Parser.AST.BinaryOperator.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return (BinaryOperator.Internal*) ret; } @@ -5188,7 +5164,7 @@ namespace CppSharp public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0) : this((Internal*) null) { - __Instance = Marshal.AllocHGlobal(88); + __Instance = Marshal.AllocHGlobal(80); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; @@ -5267,6 +5243,140 @@ namespace CppSharp } } + public unsafe partial class CXXConstructExpr : CppSharp.Parser.AST.Expression, IDisposable + { + [StructLayout(LayoutKind.Explicit, Size = 64)] + public new partial struct Internal + { + [FieldOffset(0)] + public CppSharp.Parser.AST.StatementClass Class; + + [FieldOffset(8)] + public global::System.IntPtr Decl; + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExprC2ERKS2_")] + internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExprD2Ev")] + internal static extern void dtor_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr12getArgumentsEj")] + internal static extern global::System.IntPtr getArguments_0(global::System.IntPtr instance, uint i); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr12addArgumentsERPNS1_10ExpressionE")] + internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr14clearArgumentsEv")] + internal static extern void clearArguments_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr17getArgumentsCountEv")] + internal static extern uint getArgumentsCount_0(global::System.IntPtr instance); + } + + private readonly bool __ownsNativeInstance; + + public static new CXXConstructExpr __CreateInstance(global::System.IntPtr native) + { + return new CXXConstructExpr((CXXConstructExpr.Internal*) native); + } + + public static CXXConstructExpr __CreateInstance(CXXConstructExpr.Internal native) + { + return new CXXConstructExpr(native); + } + + private static CXXConstructExpr.Internal* __CopyValue(CXXConstructExpr.Internal native) + { + var ret = Marshal.AllocHGlobal(64); + CppSharp.Parser.AST.CXXConstructExpr.Internal.cctor_2(ret, new global::System.IntPtr(&native)); + return (CXXConstructExpr.Internal*) ret; + } + + private CXXConstructExpr(CXXConstructExpr.Internal native) + : this(__CopyValue(native)) + { + __ownsNativeInstance = true; + NativeToManagedMap[__Instance] = this; + } + + protected CXXConstructExpr(CXXConstructExpr.Internal* native, bool isInternalImpl = false) + : base((CppSharp.Parser.AST.Expression.Internal*) native) + { + } + + public CXXConstructExpr(CppSharp.Parser.AST.CXXConstructExpr _0) + : this((Internal*) null) + { + __Instance = Marshal.AllocHGlobal(64); + __ownsNativeInstance = true; + NativeToManagedMap[__Instance] = this; + var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; + Internal.cctor_2(__Instance, arg0); + } + + protected override void Dispose(bool disposing) + { + DestroyNativeInstance(false); + base.Dispose(disposing); + } + + public override void DestroyNativeInstance() + { + DestroyNativeInstance(true); + } + + private void DestroyNativeInstance(bool force) + { + CppSharp.Parser.AST.Statement __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + } + + public CppSharp.Parser.AST.Expression getArguments(uint i) + { + var __ret = Internal.getArguments_0(__Instance, i); + CppSharp.Parser.AST.Expression __result0; + if (__ret == IntPtr.Zero) __result0 = null; + else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(__ret)) + __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[__ret]; + else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(__ret); + return __result0; + } + + public void addArguments(CppSharp.Parser.AST.Expression s) + { + var arg0 = ReferenceEquals(s, null) ? global::System.IntPtr.Zero : s.__Instance; + Internal.addArguments_0(__Instance, arg0); + } + + public void clearArguments() + { + Internal.clearArguments_0(__Instance); + } + + public uint ArgumentsCount + { + get + { + var __ret = Internal.getArgumentsCount_0(__Instance); + return __ret; + } + } + } + public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable { [StructLayout(LayoutKind.Explicit, Size = 200)] @@ -11131,10 +11241,12 @@ namespace CppSharp return __ret; } - public void addPosition(uint* s) + public void addPosition(ref uint s) { - var arg0 = s; - Internal.addPosition_0(__Instance, arg0); + fixed (uint* arg0 = &s) + { + Internal.addPosition_0(__Instance, arg0); + } } public void clearPosition() 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 99205c9b..19e02422 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs @@ -5011,7 +5011,7 @@ namespace CppSharp public unsafe partial class Expression : CppSharp.Parser.AST.Statement, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 32)] + [StructLayout(LayoutKind.Explicit, Size = 24)] public new partial struct Internal { [FieldOffset(0)] @@ -5020,9 +5020,6 @@ namespace CppSharp [FieldOffset(8)] public global::System.IntPtr Decl; - [FieldOffset(24)] - public global::System.IntPtr Subexpression; - [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")] @@ -5048,7 +5045,7 @@ namespace CppSharp private static Expression.Internal* __CopyValue(Expression.Internal native) { - var ret = Marshal.AllocHGlobal(32); + var ret = Marshal.AllocHGlobal(24); CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native)); return (Expression.Internal*) ret; } @@ -5068,7 +5065,7 @@ namespace CppSharp public Expression(CppSharp.Parser.AST.Expression _0) : this((Internal*) null) { - __Instance = Marshal.AllocHGlobal(32); + __Instance = Marshal.AllocHGlobal(24); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; @@ -5093,29 +5090,11 @@ namespace CppSharp if (__ownsNativeInstance) Marshal.FreeHGlobal(__Instance); } - - public CppSharp.Parser.AST.Expression Subexpression - { - get - { - CppSharp.Parser.AST.Expression __result0; - if (((Internal*) __Instance)->Subexpression == IntPtr.Zero) __result0 = null; - else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Subexpression)) - __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[((Internal*) __Instance)->Subexpression]; - else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(((Internal*) __Instance)->Subexpression); - return __result0; - } - - set - { - ((Internal*) __Instance)->Subexpression = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; - } - } } public unsafe partial class BinaryOperator : CppSharp.Parser.AST.Expression, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 56)] + [StructLayout(LayoutKind.Explicit, Size = 48)] public new partial struct Internal { [FieldOffset(0)] @@ -5125,12 +5104,9 @@ namespace CppSharp public global::System.IntPtr Decl; [FieldOffset(24)] - public global::System.IntPtr Subexpression; - - [FieldOffset(32)] public global::System.IntPtr LHS; - [FieldOffset(40)] + [FieldOffset(32)] public global::System.IntPtr RHS; [SuppressUnmanagedCodeSecurity] @@ -5168,7 +5144,7 @@ namespace CppSharp private static BinaryOperator.Internal* __CopyValue(BinaryOperator.Internal native) { - var ret = Marshal.AllocHGlobal(56); + var ret = Marshal.AllocHGlobal(48); CppSharp.Parser.AST.BinaryOperator.Internal.cctor_1(ret, new global::System.IntPtr(&native)); return (BinaryOperator.Internal*) ret; } @@ -5188,7 +5164,7 @@ namespace CppSharp public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0) : this((Internal*) null) { - __Instance = Marshal.AllocHGlobal(56); + __Instance = Marshal.AllocHGlobal(48); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; @@ -5267,6 +5243,140 @@ namespace CppSharp } } + public unsafe partial class CXXConstructExpr : CppSharp.Parser.AST.Expression, IDisposable + { + [StructLayout(LayoutKind.Explicit, Size = 48)] + public new partial struct Internal + { + [FieldOffset(0)] + public CppSharp.Parser.AST.StatementClass Class; + + [FieldOffset(8)] + public global::System.IntPtr Decl; + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExprC2ERKS2_")] + internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExprD2Ev")] + internal static extern void dtor_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr12getArgumentsEj")] + internal static extern global::System.IntPtr getArguments_0(global::System.IntPtr instance, uint i); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr12addArgumentsERPNS1_10ExpressionE")] + internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr14clearArgumentsEv")] + internal static extern void clearArguments_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr17getArgumentsCountEv")] + internal static extern uint getArgumentsCount_0(global::System.IntPtr instance); + } + + private readonly bool __ownsNativeInstance; + + public static new CXXConstructExpr __CreateInstance(global::System.IntPtr native) + { + return new CXXConstructExpr((CXXConstructExpr.Internal*) native); + } + + public static CXXConstructExpr __CreateInstance(CXXConstructExpr.Internal native) + { + return new CXXConstructExpr(native); + } + + private static CXXConstructExpr.Internal* __CopyValue(CXXConstructExpr.Internal native) + { + var ret = Marshal.AllocHGlobal(48); + CppSharp.Parser.AST.CXXConstructExpr.Internal.cctor_1(ret, new global::System.IntPtr(&native)); + return (CXXConstructExpr.Internal*) ret; + } + + private CXXConstructExpr(CXXConstructExpr.Internal native) + : this(__CopyValue(native)) + { + __ownsNativeInstance = true; + NativeToManagedMap[__Instance] = this; + } + + protected CXXConstructExpr(CXXConstructExpr.Internal* native, bool isInternalImpl = false) + : base((CppSharp.Parser.AST.Expression.Internal*) native) + { + } + + public CXXConstructExpr(CppSharp.Parser.AST.CXXConstructExpr _0) + : this((Internal*) null) + { + __Instance = Marshal.AllocHGlobal(48); + __ownsNativeInstance = true; + NativeToManagedMap[__Instance] = this; + var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; + Internal.cctor_1(__Instance, arg0); + } + + protected override void Dispose(bool disposing) + { + DestroyNativeInstance(false); + base.Dispose(disposing); + } + + public override void DestroyNativeInstance() + { + DestroyNativeInstance(true); + } + + private void DestroyNativeInstance(bool force) + { + CppSharp.Parser.AST.Statement __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + } + + public CppSharp.Parser.AST.Expression getArguments(uint i) + { + var __ret = Internal.getArguments_0(__Instance, i); + CppSharp.Parser.AST.Expression __result0; + if (__ret == IntPtr.Zero) __result0 = null; + else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(__ret)) + __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[__ret]; + else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(__ret); + return __result0; + } + + public void addArguments(CppSharp.Parser.AST.Expression s) + { + var arg0 = ReferenceEquals(s, null) ? global::System.IntPtr.Zero : s.__Instance; + Internal.addArguments_0(__Instance, arg0); + } + + public void clearArguments() + { + Internal.clearArguments_0(__Instance); + } + + public uint ArgumentsCount + { + get + { + var __ret = Internal.getArgumentsCount_0(__Instance); + return __ret; + } + } + } + public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable { [StructLayout(LayoutKind.Explicit, Size = 152)] @@ -11131,10 +11241,12 @@ namespace CppSharp return __ret; } - public void addPosition(uint* s) + public void addPosition(ref uint s) { - var arg0 = s; - Internal.addPosition_0(__Instance, arg0); + fixed (uint* arg0 = &s) + { + Internal.addPosition_0(__Instance, arg0); + } } public void clearPosition() diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index b8490b3c..42a57f37 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2624,7 +2624,9 @@ AST::Expression* Parser::WalkExpression(clang::Expr* Expr) case Stmt::CXXConstructExprClass: case Stmt::CXXTemporaryObjectExprClass: { - auto ConstructorExpr = cast(Expr); + auto ConstructorExpr = cast(Expr); + auto ConstructorExpression = new AST::CXXConstructExpr(GetStringFromStatement(Expr), + WalkDeclaration(ConstructorExpr->getConstructor())); if (ConstructorExpr->getNumArgs() == 1) { auto Arg = ConstructorExpr->getArg(0); @@ -2635,78 +2637,19 @@ AST::Expression* Parser::WalkExpression(clang::Expr* Expr) auto Cast = dyn_cast(SubTemporaryExpr); if (!Cast || Cast->getSubExprAsWritten()->getStmtClass() != Stmt::IntegerLiteralClass) return WalkExpression(SubTemporaryExpr); - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::CXXConstructExprClass, - WalkDeclaration(ConstructorExpr->getConstructor()), WalkExpression(SubTemporaryExpr)); } } - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::CXXConstructExprClass, - WalkDeclaration(ConstructorExpr->getConstructor())); - } - case Stmt::MaterializeTemporaryExprClass: - return WalkExpression(cast(Expr)->GetTemporaryExpr()); - default: - break; - } - llvm::APSInt integer; - if (Expr->getStmtClass() != Stmt::CharacterLiteralClass && - Expr->getStmtClass() != Stmt::CXXBoolLiteralExprClass && - Expr->EvaluateAsInt(integer, C->getASTContext())) - return new AST::Expression(integer.toString(10)); - return new AST::Expression(GetStringFromStatement(Expr)); -} - -AST::Expression* Parser::WalkExpressionEx(clang::Expr* Expr) -{ - using namespace clang; - - switch (Expr->getStmtClass()) - { - case Stmt::BinaryOperatorClass: - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::BinaryOperator); - case Stmt::DeclRefExprClass: - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::DeclRefExprClass, - WalkDeclaration(cast(Expr)->getDecl())); - case Stmt::CStyleCastExprClass: - case Stmt::CXXConstCastExprClass: - case Stmt::CXXDynamicCastExprClass: - case Stmt::CXXFunctionalCastExprClass: - case Stmt::CXXReinterpretCastExprClass: - case Stmt::CXXStaticCastExprClass: - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::ExplicitCastExpr, - 0, - WalkExpressionEx(cast(Expr)->getSubExpr())); - case Stmt::ImplicitCastExprClass: - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::ImplicitCastExpr, - 0, - WalkExpressionEx(cast(Expr)->getSubExpr())); - case Stmt::CXXOperatorCallExprClass: - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::CXXOperatorCallExpr, - WalkDeclaration(cast(Expr)->getCalleeDecl())); - case Stmt::CXXConstructExprClass: - case Stmt::CXXTemporaryObjectExprClass: - { - auto ConstructorExpr = cast(Expr); - if (ConstructorExpr->getNumArgs() == 1) + else { - if (ConstructorExpr->isElidable()) + for (clang::Expr* arg : ConstructorExpr->arguments()) { - return WalkExpressionEx(ConstructorExpr->getArg(0)); - } - else - { - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::CXXConstructExprClass, - WalkDeclaration(ConstructorExpr->getConstructor()), - WalkExpressionEx(ConstructorExpr->getArg(0))); + ConstructorExpression->Arguments.push_back(WalkExpression(arg)); } } - else - { - return new AST::Expression(GetStringFromStatement(Expr), StatementClass::CXXConstructExprClass, - WalkDeclaration(ConstructorExpr->getConstructor())); - } + return ConstructorExpression; } case Stmt::MaterializeTemporaryExprClass: - return WalkExpressionEx(cast(Expr)->GetTemporaryExpr()); + return WalkExpression(cast(Expr)->GetTemporaryExpr()); default: break; } diff --git a/src/CppParser/Parser.h b/src/CppParser/Parser.h index 7624a4d1..00a127c0 100644 --- a/src/CppParser/Parser.h +++ b/src/CppParser/Parser.h @@ -99,7 +99,6 @@ protected: PreprocessedEntity* WalkPreprocessedEntity(Declaration* Decl, clang::PreprocessedEntity* PPEntity); AST::Expression* WalkExpression(clang::Expr* Expression); - AST::Expression* WalkExpressionEx(clang::Expr* Expression); std::string GetStringFromStatement(const clang::Stmt* Statement); // Clang helpers diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index 13887bf0..85bfa8b1 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -296,14 +296,15 @@ namespace CppSharp.Generators.CSharp if (!string.IsNullOrWhiteSpace(ctx.SupportBefore)) Context.SupportBefore.WriteLine(ctx.SupportBefore); - if (!string.IsNullOrWhiteSpace(ctx.Return) && !parameter.IsPrimitiveParameterConvertibleToRef()) + if (!string.IsNullOrWhiteSpace(ctx.Return) && + !parameter.Type.IsPrimitiveTypeConvertibleToRef()) { Context.SupportBefore.WriteLine("var _{0} = {1};", parameter.Name, ctx.Return); } Context.Return.Write("{0}{1}", - parameter.IsPrimitiveParameterConvertibleToRef() ? "ref *" : "_", parameter.Name); + parameter.Type.IsPrimitiveTypeConvertibleToRef() ? "ref *" : "_", parameter.Name); return true; } diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 9dc32927..6ba20e24 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -2285,10 +2285,12 @@ namespace CppSharp.Generators.CSharp @interface = paramClass.Namespace.Classes.Find(c => c.OriginalClass == paramClass); var paramName = string.Format("{0}{1}", - method.Parameters[0].IsPrimitiveParameterConvertibleToRef() ? "ref *" : string.Empty, + method.Parameters[0].Type.IsPrimitiveTypeConvertibleToRef() ? + "ref *" : string.Empty, method.Parameters[0].Name); if (@interface != null) - WriteLine("return new {0}(({2}) {1});", method.ConversionType, paramName, @interface.Name); + WriteLine("return new {0}(({2}) {1});", + method.ConversionType, paramName, @interface.Name); else WriteLine("return new {0}({1});", method.ConversionType, paramName); } @@ -2304,10 +2306,14 @@ namespace CppSharp.Generators.CSharp if (method.OperatorKind == CXXOperatorKind.EqualEqual) { - WriteLine("bool {0}Null = ReferenceEquals({0}, null);", method.Parameters[0].Name); - WriteLine("bool {0}Null = ReferenceEquals({0}, null);", method.Parameters[1].Name); - WriteLine("if ({0}Null || {1}Null)", method.Parameters[0].Name, method.Parameters[1].Name); - WriteLineIndent("return {0}Null && {1}Null;", method.Parameters[0].Name, method.Parameters[1].Name); + WriteLine("bool {0}Null = ReferenceEquals({0}, null);", + method.Parameters[0].Name); + WriteLine("bool {0}Null = ReferenceEquals({0}, null);", + method.Parameters[1].Name); + WriteLine("if ({0}Null || {1}Null)", + method.Parameters[0].Name, method.Parameters[1].Name); + WriteLineIndent("return {0}Null && {1}Null;", + method.Parameters[0].Name, method.Parameters[1].Name); } GenerateInternalFunctionCall(method); @@ -2548,7 +2554,7 @@ namespace CppSharp.Generators.CSharp { var param = paramInfo.Param; if (!(param.IsOut || param.IsInOut)) continue; - if (param.IsPrimitiveParameterConvertibleToRef()) + if (param.Type.IsPrimitiveTypeConvertibleToRef()) continue; var nativeVarName = paramInfo.Name; @@ -2633,7 +2639,7 @@ namespace CppSharp.Generators.CSharp paramMarshal.Context = ctx; - if (param.IsPrimitiveParameterConvertibleToRef()) + if (param.Type.IsPrimitiveTypeConvertibleToRef()) { WriteLine("fixed ({0} {1} = &{2})", param.Type.CSharpType(TypePrinter), argName, param.Name); paramMarshal.HasFixedBlock = true; diff --git a/src/Generator/Generators/ExtensionMethods.cs b/src/Generator/Generators/ExtensionMethods.cs index 433d38d7..f629551a 100644 --- a/src/Generator/Generators/ExtensionMethods.cs +++ b/src/Generator/Generators/ExtensionMethods.cs @@ -27,7 +27,7 @@ namespace CppSharp.Generators return Interop.CallingConvention.Winapi; } - public static bool IsPrimitiveParameterConvertibleToRef(this Parameter param) + public static bool IsPrimitiveTypeConvertibleToRef(this Type type) { var allowedToHaveDefaultPtrVals = new List { @@ -43,8 +43,8 @@ namespace CppSharp.Generators PrimitiveType.ULongLong, PrimitiveType.UShort }; - return param.Type.IsPointerToPrimitiveType() - && allowedToHaveDefaultPtrVals.Any(primType => param.Type.IsPointerToPrimitiveType(primType)); + return type.IsPointerToPrimitiveType() && + allowedToHaveDefaultPtrVals.Any(type.IsPointerToPrimitiveType); } } } diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index 2edaaade..a6ae4c2f 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Text; using System.Text.RegularExpressions; using CppSharp.AST; using CppSharp.AST.Extensions; @@ -14,7 +15,6 @@ namespace CppSharp.Passes private static readonly Regex regexFunctionParams = new Regex(@"\(?(.+)\)?", RegexOptions.Compiled); private static readonly Regex regexDoubleColon = new Regex(@"\w+::", RegexOptions.Compiled); private static readonly Regex regexName = new Regex(@"(\w+)", RegexOptions.Compiled); - private static readonly Regex regexCtor = new Regex(@"^([\w<,>:]+)\s*(\([\w, ]*\))$", RegexOptions.Compiled); private readonly Dictionary> overloads = new Dictionary>(); @@ -43,198 +43,218 @@ namespace CppSharp.Passes var overloadIndices = new List(function.Parameters.Count); foreach (var parameter in function.Parameters.Where(p => p.DefaultArgument != null)) { - Type desugared = parameter.Type.Desugar(); - - if (CheckForDefaultPointer(desugared, parameter)) - continue; + var result = parameter.DefaultArgument.String; + if (PrintExpression(parameter.Type, parameter.DefaultArgument, ref result) == null) + overloadIndices.Add(function.Parameters.IndexOf(parameter)); + parameter.DefaultArgument.String = result; + } - CheckFloatSyntax(desugared, parameter); + GenerateOverloads(function, overloadIndices); - bool? defaultConstruct = CheckForDefaultConstruct(desugared, - parameter.DefaultArgument, parameter.QualifiedType.Qualifiers); - if (defaultConstruct == null || - (!Driver.Options.MarshalCharAsManagedChar && - parameter.Type.Desugar().IsPrimitiveType(PrimitiveType.UChar)) || - parameter.IsPrimitiveParameterConvertibleToRef()) - { - overloadIndices.Add(function.Parameters.IndexOf(parameter)); - continue; - } - if (defaultConstruct == true) - continue; + return true; + } - if (CheckForBinaryOperator(parameter.DefaultArgument, desugared)) - continue; + private bool? PrintExpression(Type type, Expression expression, ref string result) + { + var desugared = type.Desugar(); - if (CheckForEnumValue(parameter.DefaultArgument, desugared)) - continue; + if ((!Driver.Options.MarshalCharAsManagedChar && + desugared.IsPrimitiveType(PrimitiveType.UChar)) || + type.IsPrimitiveTypeConvertibleToRef()) + return null; - CheckForDefaultEmptyChar(parameter, desugared); - } + if (CheckForDefaultPointer(desugared, ref result)) + return true; - GenerateOverloads(function, overloadIndices); + var defaultConstruct = CheckForDefaultConstruct(desugared, expression, ref result); + if (defaultConstruct != false) + return defaultConstruct; - return true; + return CheckFloatSyntax(desugared, expression, ref result) || + CheckForBinaryOperator(desugared, expression, ref result) || + CheckForEnumValue(desugared, expression, ref result) || + CheckForDefaultEmptyChar(desugared, expression, ref result); } - private void CheckFloatSyntax(Type desugared, Parameter parameter) + private bool CheckForDefaultPointer(Type desugared, ref string result) { - var builtin = desugared as BuiltinType; - if (builtin != null) + if (!desugared.IsPointer()) + return false; + + // IntPtr.Zero is not a constant + if (desugared.IsPointerToPrimitiveType(PrimitiveType.Void)) { - switch (builtin.Type) - { - case PrimitiveType.Float: - if (parameter.DefaultArgument.String.EndsWith(".F")) - parameter.DefaultArgument.String = - parameter.DefaultArgument.String.Replace(".F", ".0F"); - break; - case PrimitiveType.Double: - if (parameter.DefaultArgument.String.EndsWith(".")) - parameter.DefaultArgument.String += '0'; - break; - } + result = "new global::System.IntPtr()"; + return true; } - } - private bool CheckForDefaultPointer(Type desugared, Parameter parameter) - { - if (desugared.IsPointer()) + if (desugared.IsPrimitiveTypeConvertibleToRef()) + return false; + + Class @class; + if (desugared.GetFinalPointee().TryGetClass(out @class) && @class.IsValueType) { - // IntPtr.Zero is not a constant - if (desugared.IsPointerToPrimitiveType(PrimitiveType.Void)) - { - parameter.DefaultArgument.String = "new global::System.IntPtr()"; - return true; - } - if (parameter.IsPrimitiveParameterConvertibleToRef()) - return false; - Class @class; - if (desugared.GetFinalPointee().TryGetClass(out @class) && @class.IsValueType) - { - parameter.DefaultArgument.String = string.Format("new {0}()", - new CSharpTypePrinter(Driver).VisitClassDecl(@class)); - return true; - } - parameter.DefaultArgument.String = "null"; + result = string.Format("new {0}()", + new CSharpTypePrinter(Driver).VisitClassDecl(@class)); return true; } - return false; + + result = "null"; + return true; } - private bool? CheckForDefaultConstruct(Type desugared, Statement arg, - TypeQualifiers qualifiers) + private bool? CheckForDefaultConstruct(Type desugared, Statement statement, + ref string result) { - // Unwrapping the underlying type behind a possible pointer/reference - Type type = desugared.GetFinalPointee() ?? desugared; + var type = desugared.GetFinalPointee() ?? desugared; Class decl; if (!type.TryGetClass(out decl)) return false; - var ctor = arg.Declaration as Method; + var ctor = statement as CXXConstructExpr; TypeMap typeMap; - var typePrinterContext = new CSharpTypePrinterContext - { - CSharpKind = CSharpTypePrinterContextKind.DefaultExpression, - Type = type - }; - string typePrinterResult = null; + var typePrinter = new CSharpTypePrinter(Driver); + typePrinter.PushContext(CSharpTypePrinterContextKind.DefaultExpression); + var typePrinterResult = type.Visit(typePrinter).Type; if (Driver.TypeDatabase.FindTypeMap(decl, type, out typeMap)) { var typeInSignature = typeMap.CSharpSignatureType( - typePrinterContext).SkipPointerRefs().Desugar(); + typePrinter.Context).SkipPointerRefs().Desugar(); Enumeration @enum; if (typeInSignature.TryGetEnum(out @enum)) + { + if (ctor != null && + (ctor.Arguments.Count == 0 || + HasSingleZeroArgExpression((Function) ctor.Declaration))) + { + result = "0"; + return true; + } return false; + } - if (ctor == null || !ctor.IsConstructor) - return false; - - typePrinterResult = typeMap.CSharpSignature(typePrinterContext); - if (typePrinterResult == "string" && ctor.Parameters.Count == 0) + if (ctor != null && typePrinterResult == "string" && ctor.Arguments.Count == 0) { - arg.String = "\"\""; + result = "\"\""; return true; } } - var match = regexCtor.Match(arg.String); - if (match.Success) + if (ctor == null) + return decl.IsValueType ? (bool?) false : null; + + var method = (Method) statement.Declaration; + var expressionSupported = decl.IsValueType && method.Parameters.Count == 0; + + if (statement.String.Contains('(')) { - if (ctor != null) + var argsBuilder = new StringBuilder("new "); + argsBuilder.Append(typePrinterResult); + argsBuilder.Append('('); + for (var i = 0; i < ctor.Arguments.Count; i++) { - var templateSpecializationType = type as TemplateSpecializationType; - var typePrinter = new CSharpTypePrinter(Driver); - typePrinterResult = typePrinterResult ?? (templateSpecializationType != null - ? typePrinter.VisitTemplateSpecializationType( - templateSpecializationType, qualifiers) - : typePrinter.VisitClassDecl((Class) ctor.Namespace)).Type; - - arg.String = string.Format("new {0}{1}", typePrinterResult, - match.Groups[2].Value); - if (ctor.Parameters.Count > 0 && ctor.Parameters[0].Type.IsAddress()) - arg.String = arg.String.Replace("(0)", "()"); + var argument = ctor.Arguments[i]; + var argResult = argument.String; + expressionSupported &= PrintExpression(method.Parameters[i].Type.Desugar(), + argument, ref argResult) ?? false; + argsBuilder.Append(argResult); + if (i < ctor.Arguments.Count - 1) + argsBuilder.Append(", "); } - else - arg.String = string.Format("new {0}", arg.String); + argsBuilder.Append(')'); + result = argsBuilder.ToString(); } else { - if (ctor != null && ctor.Parameters.Count > 0) + if (method.Parameters.Count > 0) { - var finalPointee = ctor.Parameters[0].Type.SkipPointerRefs().Desugar(); + var paramType = method.Parameters[0].Type.SkipPointerRefs().Desugar(); Enumeration @enum; - if (finalPointee.TryGetEnum(out @enum)) - TranslateEnumExpression(ctor, arg, finalPointee, arg.String); + if (paramType.TryGetEnum(out @enum)) + result = TranslateEnumExpression(method, paramType, statement.String); } } + return expressionSupported ? true : (bool?) null; + } - return decl.IsValueType ? true : (bool?) null; + private static bool CheckFloatSyntax(Type desugared, Statement statement, ref string result) + { + var builtin = desugared as BuiltinType; + if (builtin != null) + { + switch (builtin.Type) + { + case PrimitiveType.Float: + if (statement.String.EndsWith(".F")) + { + result = statement.String.Replace(".F", ".0F"); + return true; + } + break; + case PrimitiveType.Double: + if (statement.String.EndsWith(".")) + { + result = statement.String + '0'; + return true; + } + break; + } + } + return false; } - private bool CheckForBinaryOperator(Expression arg, Type desugared) + private bool CheckForBinaryOperator(Type desugared, Expression expression, + ref string result) { - if (arg.Class != StatementClass.BinaryOperator) return false; + if (expression.Class != StatementClass.BinaryOperator) + return false; + + var binaryOperator = (BinaryOperator) expression; + + var lhsResult = binaryOperator.LHS.String; + CheckForEnumValue(desugared, binaryOperator.LHS, ref lhsResult); + + var rhsResult = binaryOperator.RHS.String; + CheckForEnumValue(desugared, binaryOperator.RHS, ref rhsResult); - var binaryOperator = (BinaryOperator) arg; - CheckForEnumValue(binaryOperator.LHS, desugared); - CheckForEnumValue(binaryOperator.RHS, desugared); - arg.String = string.Format("{0} {1} {2}", binaryOperator.LHS.String, - binaryOperator.OpcodeStr, binaryOperator.RHS.String); + result = string.Format("{0} {1} {2}", lhsResult, + binaryOperator.OpcodeStr, rhsResult); return true; } - private bool CheckForEnumValue(Expression arg, Type desugared) + private bool CheckForEnumValue(Type desugared, Statement statement, + ref string result) { - var enumItem = arg.Declaration as Enumeration.Item; + var enumItem = statement.Declaration as Enumeration.Item; if (enumItem != null) { - arg.String = string.Format("{0}{1}.{2}", + result = string.Format("{0}{1}.{2}", desugared.IsPrimitiveType() ? "(int) " : string.Empty, new CSharpTypePrinter(Driver).VisitEnumDecl( (Enumeration) enumItem.Namespace), enumItem.Name); return true; } - var call = arg.Declaration as Function; - if (call != null && arg.String != "0") + var call = statement.Declaration as Function; + if (call != null && statement.String != "0") { - string @params = regexFunctionParams.Match(arg.String).Groups[1].Value; - TranslateEnumExpression(call, arg, desugared, @params); + var @params = regexFunctionParams.Match(statement.String).Groups[1].Value; + result = TranslateEnumExpression(call, desugared, @params); return true; } + return false; } - private void TranslateEnumExpression(Function function, Statement arg, + private string TranslateEnumExpression(Function function, Type desugared, string @params) { TypeMap typeMap; if ((function.Parameters.Count == 0 || - HasSingleZeroExpression(function)) && + HasSingleZeroArgExpression(function)) && Driver.TypeDatabase.FindTypeMap(desugared, out typeMap)) { var typeInSignature = typeMap.CSharpSignatureType(new CSharpTypePrinterContext @@ -244,18 +264,16 @@ namespace CppSharp.Passes }).SkipPointerRefs().Desugar(); Enumeration @enum; if (typeInSignature.TryGetEnum(out @enum)) - { - arg.String = "0"; - return; - } + return "0"; } + if (@params.Contains("::")) - arg.String = regexDoubleColon.Replace(@params, desugared + "."); - else - arg.String = regexName.Replace(@params, desugared + ".$1"); + return regexDoubleColon.Replace(@params, desugared + "."); + + return regexName.Replace(@params, desugared + ".$1"); } - private static bool HasSingleZeroExpression(Function function) + private static bool HasSingleZeroArgExpression(Function function) { if (function.Parameters.Count != 1) return false; @@ -265,14 +283,18 @@ namespace CppSharp.Passes ((BuiltinTypeExpression) defaultArgument).Value == 0; } - private void CheckForDefaultEmptyChar(Parameter parameter, Type desugared) + private bool CheckForDefaultEmptyChar(Type desugared, Statement statement, + ref string result) { - if (parameter.DefaultArgument.String == "0" && + if (statement.String == "0" && Driver.Options.MarshalCharAsManagedChar && desugared.IsPrimitiveType(PrimitiveType.Char)) { - parameter.DefaultArgument.String = "'\\0'"; + result = "'\\0'"; + return true; } + + return false; } private void GenerateOverloads(Function function, List overloadIndices) diff --git a/src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs b/src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs index 7f2228e6..244d4a9c 100644 --- a/src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs +++ b/src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs @@ -14,7 +14,7 @@ namespace CppSharp.Passes return false; foreach (var param in function.Parameters.Where( - p => !p.IsOut && p.IsPrimitiveParameterConvertibleToRef())) + p => !p.IsOut && p.Type.IsPrimitiveTypeConvertibleToRef())) param.Usage = ParameterUsage.InOut; return true; diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index ab2ef62d..7469698d 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -322,6 +322,18 @@ QGenericArgument::QGenericArgument(const char *name) _name = name; } +QPoint::QPoint(int x, int y) +{ +} + +QSize::QSize(int w, int h) +{ +} + +QRect::QRect(QPoint p, QSize s) +{ +} + MethodsWithDefaultValues::QMargins::QMargins(int left, int top, int right, int bottom) { } @@ -448,6 +460,10 @@ void MethodsWithDefaultValues::defaultCtorWithMoreThanOneArg(QMargins m) { } +void MethodsWithDefaultValues::defaultWithComplexArgs(const QRect& rectangle) +{ +} + int MethodsWithDefaultValues::getA() { return m_foo.A; diff --git a/tests/CSharpTemp/CSharpTemp.cs b/tests/CSharpTemp/CSharpTemp.cs index 9156c41b..fb8d7cde 100644 --- a/tests/CSharpTemp/CSharpTemp.cs +++ b/tests/CSharpTemp/CSharpTemp.cs @@ -143,7 +143,9 @@ namespace CppSharp.Tests ctx.SetClassAsValueType("TestCopyConstructorVal"); ctx.SetClassAsValueType("QGenericArgument"); ctx.SetClassAsValueType("StructWithPrivateFields"); + ctx.SetClassAsValueType("QPoint"); ctx.SetClassAsValueType("QSize"); + ctx.SetClassAsValueType("QRect"); ctx.IgnoreClassWithName("IgnoredTypeInheritingNonIgnoredWithNoEmptyCtor"); } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 00069626..09fb04e2 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -300,6 +300,24 @@ class QList { }; +class DLL_API QPoint +{ +public: + QPoint(int x, int y); +}; + +class DLL_API QSize +{ +public: + QSize(int w, int h); +}; + +class DLL_API QRect +{ +public: + QRect(QPoint p, QSize s); +}; + class DLL_API MethodsWithDefaultValues : public Quux { public: @@ -339,6 +357,7 @@ public: void defaultDoubleWithoutF(double d1 = 1.0, double d2 = 1.); void defaultIntExpressionWithEnum(int i = Qt::GlobalColor::black + 1); void defaultCtorWithMoreThanOneArg(QMargins m = QMargins(0, 0, 0, 0)); + void defaultWithComplexArgs(const QRect& rectangle = QRect(QPoint(0, 0), QSize(-1, -1))); int getA(); private: Foo m_foo;