Browse Source

Improved the support for constructor expressions.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/534/head
Dimitar Dobrev 10 years ago
parent
commit
a2b8614f54
  1. 15
      src/AST/Expression.cs
  2. 28
      src/Core/Parser/ASTConverter.cs
  3. 9
      src/CppParser/AST.cpp
  4. 10
      src/CppParser/AST.h
  5. 56
      src/CppParser/Bindings/CLI/AST.cpp
  6. 29
      src/CppParser/Bindings/CLI/AST.h
  7. 178
      src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs
  8. 178
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs
  9. 178
      src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/AST.cs
  10. 178
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs
  11. 73
      src/CppParser/Parser.cpp
  12. 1
      src/CppParser/Parser.h
  13. 5
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  14. 22
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  15. 6
      src/Generator/Generators/ExtensionMethods.cs
  16. 260
      src/Generator/Passes/HandleDefaultParamValuesPass.cs
  17. 2
      src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs
  18. 16
      tests/CSharpTemp/CSharpTemp.cpp
  19. 2
      tests/CSharpTemp/CSharpTemp.cs
  20. 19
      tests/CSharpTemp/CSharpTemp.h

15
src/AST/Expression.cs

@ -1,3 +1,5 @@ @@ -1,3 +1,5 @@
using System.Collections.Generic;
namespace CppSharp.AST
{
public abstract class Expression : Statement
@ -40,19 +42,14 @@ namespace CppSharp.AST @@ -40,19 +42,14 @@ namespace CppSharp.AST
}
}
public class CastExpr : Expression
public class CXXConstructExpr : Expression
{
public Expression SubExpression;
public override T Visit<T>(IExpressionVisitor<T> visitor)
public CXXConstructExpr()
{
return visitor.VisitExpression(this);
}
Arguments = new List<Expression>();
}
public class CtorExpr : Expression
{
public Expression SubExpression;
public List<Expression> Arguments { get; private set; }
public override T Visit<T>(IExpressionVisitor<T> visitor)
{

28
src/Core/Parser/ASTConverter.cs

@ -921,34 +921,20 @@ namespace CppSharp @@ -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;
var argument = VisitStatement(constructorExpr.getArguments(i));
constructorExpression.Arguments.Add(argument);
}
case StatementClass.ExplicitCastExpr:
{
var castExp = new AST.CastExpr();
castExp.SubExpression = VisitStatement(((Expression) statement).Subexpression);
expression = castExp;
expression.Class = AST.StatementClass.ExplicitCast;
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;
}

9
src/CppParser/AST.cpp

@ -475,14 +475,19 @@ DEF_STRING(Statement, String) @@ -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) {}

10
src/CppParser/AST.h

@ -497,8 +497,7 @@ public: @@ -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: @@ -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:

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

@ -1836,16 +1836,6 @@ CppSharp::Parser::AST::Expression::Expression(CppSharp::Parser::AST::Expression^ @@ -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 @@ -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 @@ -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()

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

@ -34,6 +34,7 @@ namespace CppSharp @@ -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 @@ -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 @@ -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 @@ -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();
};

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

@ -5012,7 +5012,7 @@ namespace CppSharp @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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,11 +11242,13 @@ namespace CppSharp @@ -11132,11 +11242,13 @@ namespace CppSharp
return __ret;
}
public void addPosition(uint* s)
public void addPosition(ref uint s)
{
fixed (uint* arg0 = &s)
{
var arg0 = s;
Internal.addPosition_0(__Instance, arg0);
}
}
public void clearPosition()
{

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

@ -5012,7 +5012,7 @@ namespace CppSharp @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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,11 +11242,13 @@ namespace CppSharp @@ -11132,11 +11242,13 @@ namespace CppSharp
return __ret;
}
public void addPosition(uint* s)
public void addPosition(ref uint s)
{
fixed (uint* arg0 = &s)
{
var arg0 = s;
Internal.addPosition_0(__Instance, arg0);
}
}
public void clearPosition()
{

178
src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/AST.cs

@ -5011,7 +5011,7 @@ namespace CppSharp @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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,11 +11241,13 @@ namespace CppSharp @@ -11131,11 +11241,13 @@ namespace CppSharp
return __ret;
}
public void addPosition(uint* s)
public void addPosition(ref uint s)
{
fixed (uint* arg0 = &s)
{
var arg0 = s;
Internal.addPosition_0(__Instance, arg0);
}
}
public void clearPosition()
{

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

@ -5011,7 +5011,7 @@ namespace CppSharp @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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,11 +11241,13 @@ namespace CppSharp @@ -11131,11 +11241,13 @@ namespace CppSharp
return __ret;
}
public void addPosition(uint* s)
public void addPosition(ref uint s)
{
fixed (uint* arg0 = &s)
{
var arg0 = s;
Internal.addPosition_0(__Instance, arg0);
}
}
public void clearPosition()
{

73
src/CppParser/Parser.cpp

@ -2624,7 +2624,9 @@ AST::Expression* Parser::WalkExpression(clang::Expr* Expr) @@ -2624,7 +2624,9 @@ AST::Expression* Parser::WalkExpression(clang::Expr* Expr)
case Stmt::CXXConstructExprClass:
case Stmt::CXXTemporaryObjectExprClass:
{
auto ConstructorExpr = cast<CXXConstructExpr>(Expr);
auto ConstructorExpr = cast<clang::CXXConstructExpr>(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) @@ -2635,78 +2637,19 @@ AST::Expression* Parser::WalkExpression(clang::Expr* Expr)
auto Cast = dyn_cast<CastExpr>(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<MaterializeTemporaryExpr>(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<DeclRefExpr>(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<CastExpr>(Expr)->getSubExpr()));
case Stmt::ImplicitCastExprClass:
return new AST::Expression(GetStringFromStatement(Expr), StatementClass::ImplicitCastExpr,
0,
WalkExpressionEx(cast<CastExpr>(Expr)->getSubExpr()));
case Stmt::CXXOperatorCallExprClass:
return new AST::Expression(GetStringFromStatement(Expr), StatementClass::CXXOperatorCallExpr,
WalkDeclaration(cast<CXXOperatorCallExpr>(Expr)->getCalleeDecl()));
case Stmt::CXXConstructExprClass:
case Stmt::CXXTemporaryObjectExprClass:
{
auto ConstructorExpr = cast<CXXConstructExpr>(Expr);
if (ConstructorExpr->getNumArgs() == 1)
{
if (ConstructorExpr->isElidable())
{
return WalkExpressionEx(ConstructorExpr->getArg(0));
}
else
{
return new AST::Expression(GetStringFromStatement(Expr), StatementClass::CXXConstructExprClass,
WalkDeclaration(ConstructorExpr->getConstructor()),
WalkExpressionEx(ConstructorExpr->getArg(0)));
}
}
else
for (clang::Expr* arg : ConstructorExpr->arguments())
{
return new AST::Expression(GetStringFromStatement(Expr), StatementClass::CXXConstructExprClass,
WalkDeclaration(ConstructorExpr->getConstructor()));
ConstructorExpression->Arguments.push_back(WalkExpression(arg));
}
}
return ConstructorExpression;
}
case Stmt::MaterializeTemporaryExprClass:
return WalkExpressionEx(cast<MaterializeTemporaryExpr>(Expr)->GetTemporaryExpr());
return WalkExpression(cast<MaterializeTemporaryExpr>(Expr)->GetTemporaryExpr());
default:
break;
}

1
src/CppParser/Parser.h

@ -99,7 +99,6 @@ protected: @@ -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

5
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -296,14 +296,15 @@ namespace CppSharp.Generators.CSharp @@ -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;
}

22
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -2285,10 +2285,12 @@ namespace CppSharp.Generators.CSharp @@ -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 @@ -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 @@ -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 @@ -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;

6
src/Generator/Generators/ExtensionMethods.cs

@ -27,7 +27,7 @@ namespace CppSharp.Generators @@ -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<PrimitiveType>
{
@ -43,8 +43,8 @@ namespace CppSharp.Generators @@ -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);
}
}
}

260
src/Generator/Passes/HandleDefaultParamValuesPass.cs

@ -1,5 +1,6 @@ @@ -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 @@ -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<DeclarationContext, List<Function>> overloads =
new Dictionary<DeclarationContext, List<Function>>();
@ -43,33 +43,10 @@ namespace CppSharp.Passes @@ -43,33 +43,10 @@ namespace CppSharp.Passes
var overloadIndices = new List<int>(function.Parameters.Count);
foreach (var parameter in function.Parameters.Where(p => p.DefaultArgument != null))
{
Type desugared = parameter.Type.Desugar();
if (CheckForDefaultPointer(desugared, parameter))
continue;
CheckFloatSyntax(desugared, parameter);
bool? defaultConstruct = CheckForDefaultConstruct(desugared,
parameter.DefaultArgument, parameter.QualifiedType.Qualifiers);
if (defaultConstruct == null ||
(!Driver.Options.MarshalCharAsManagedChar &&
parameter.Type.Desugar().IsPrimitiveType(PrimitiveType.UChar)) ||
parameter.IsPrimitiveParameterConvertibleToRef())
{
var result = parameter.DefaultArgument.String;
if (PrintExpression(parameter.Type, parameter.DefaultArgument, ref result) == null)
overloadIndices.Add(function.Parameters.IndexOf(parameter));
continue;
}
if (defaultConstruct == true)
continue;
if (CheckForBinaryOperator(parameter.DefaultArgument, desugared))
continue;
if (CheckForEnumValue(parameter.DefaultArgument, desugared))
continue;
CheckForDefaultEmptyChar(parameter, desugared);
parameter.DefaultArgument.String = result;
}
GenerateOverloads(function, overloadIndices);
@ -77,164 +54,207 @@ namespace CppSharp.Passes @@ -77,164 +54,207 @@ namespace CppSharp.Passes
return true;
}
private void CheckFloatSyntax(Type desugared, Parameter parameter)
{
var builtin = desugared as BuiltinType;
if (builtin != null)
{
switch (builtin.Type)
private bool? PrintExpression(Type type, Expression expression, ref string result)
{
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;
}
}
var desugared = type.Desugar();
if ((!Driver.Options.MarshalCharAsManagedChar &&
desugared.IsPrimitiveType(PrimitiveType.UChar)) ||
type.IsPrimitiveTypeConvertibleToRef())
return null;
if (CheckForDefaultPointer(desugared, ref result))
return true;
var defaultConstruct = CheckForDefaultConstruct(desugared, expression, ref result);
if (defaultConstruct != false)
return defaultConstruct;
return CheckFloatSyntax(desugared, expression, ref result) ||
CheckForBinaryOperator(desugared, expression, ref result) ||
CheckForEnumValue(desugared, expression, ref result) ||
CheckForDefaultEmptyChar(desugared, expression, ref result);
}
private bool CheckForDefaultPointer(Type desugared, Parameter parameter)
{
if (desugared.IsPointer())
private bool CheckForDefaultPointer(Type desugared, ref string result)
{
if (!desugared.IsPointer())
return false;
// IntPtr.Zero is not a constant
if (desugared.IsPointerToPrimitiveType(PrimitiveType.Void))
{
parameter.DefaultArgument.String = "new global::System.IntPtr()";
result = "new global::System.IntPtr()";
return true;
}
if (parameter.IsPrimitiveParameterConvertibleToRef())
if (desugared.IsPrimitiveTypeConvertibleToRef())
return false;
Class @class;
if (desugared.GetFinalPointee().TryGetClass(out @class) && @class.IsValueType)
{
parameter.DefaultArgument.String = string.Format("new {0}()",
result = string.Format("new {0}()",
new CSharpTypePrinter(Driver).VisitClassDecl(@class));
return true;
}
parameter.DefaultArgument.String = "null";
result = "null";
return true;
}
return false;
}
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 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);
var rhsResult = binaryOperator.RHS.String;
CheckForEnumValue(desugared, binaryOperator.RHS, ref rhsResult);
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 @@ -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 @@ -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<int> overloadIndices)

2
src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs

@ -14,7 +14,7 @@ namespace CppSharp.Passes @@ -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;

16
tests/CSharpTemp/CSharpTemp.cpp

@ -322,6 +322,18 @@ QGenericArgument::QGenericArgument(const char *name) @@ -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) @@ -448,6 +460,10 @@ void MethodsWithDefaultValues::defaultCtorWithMoreThanOneArg(QMargins m)
{
}
void MethodsWithDefaultValues::defaultWithComplexArgs(const QRect& rectangle)
{
}
int MethodsWithDefaultValues::getA()
{
return m_foo.A;

2
tests/CSharpTemp/CSharpTemp.cs

@ -143,7 +143,9 @@ namespace CppSharp.Tests @@ -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");
}

19
tests/CSharpTemp/CSharpTemp.h

@ -300,6 +300,24 @@ class QList @@ -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: @@ -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;

Loading…
Cancel
Save