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

28
src/Core/Parser/ASTConverter.cs

@ -921,34 +921,20 @@ namespace CppSharp
expression.Class = AST.StatementClass.CXXOperatorCall; expression.Class = AST.StatementClass.CXXOperatorCall;
break; break;
case StatementClass.CXXConstructExprClass: 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(); var argument = VisitStatement(constructorExpr.getArguments(i));
ctorExp.SubExpression = VisitStatement(((Expression) statement).Subexpression); constructorExpression.Arguments.Add(argument);
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: expression = constructorExpression;
{
var castExp = new AST.CastExpr();
castExp.SubExpression = VisitStatement(((Expression) statement).Subexpression);
expression = castExp;
expression.Class = AST.StatementClass.ExplicitCast;
break; break;
}
default: default:
expression = new AST.BuiltinTypeExpression(); expression = new AST.BuiltinTypeExpression();
break; break;
} }
expression.Declaration = this.typeConverter.declConverter.Visit(statement.Decl); expression.Declaration = typeConverter.declConverter.Visit(statement.Decl);
expression.String = statement.String; expression.String = statement.String;
return expression; return expression;
} }

9
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) {} 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) Expression::Expression(const std::string& str, StatementClass stmtClass, Declaration* decl)
:Statement(str, stmtClass, decl), Subexpression(subexpr) {} : Statement(str, stmtClass, decl) {}
BinaryOperator::BinaryOperator(const std::string& str, Expression* lhs, Expression* rhs, const std::string& opcodeStr) BinaryOperator::BinaryOperator(const std::string& str, Expression* lhs, Expression* rhs, const std::string& opcodeStr)
: Expression(str, StatementClass::BinaryOperator), LHS(lhs), RHS(rhs), OpcodeStr(opcodeStr) {} : Expression(str, StatementClass::BinaryOperator), LHS(lhs), RHS(rhs), OpcodeStr(opcodeStr) {}
DEF_STRING(BinaryOperator, 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), Parameter::Parameter() : Declaration(DeclarationKind::Parameter),
IsIndirect(false), HasDefaultValue(false), DefaultArgument(0) {} IsIndirect(false), HasDefaultValue(false), DefaultArgument(0) {}

10
src/CppParser/AST.h

@ -497,8 +497,7 @@ public:
class CS_API Expression : public Statement class CS_API Expression : public Statement
{ {
public: public:
Expression(const std::string& str, StatementClass Class = StatementClass::Any, Declaration* decl = 0, Expression* subexpr = 0); Expression(const std::string& str, StatementClass Class = StatementClass::Any, Declaration* decl = 0);
Expression* Subexpression;
}; };
class CS_API BinaryOperator : public Expression class CS_API BinaryOperator : public Expression
@ -510,6 +509,13 @@ public:
STRING(OpcodeStr) 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 class CS_API Parameter : public Declaration
{ {
public: public:

56
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); 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::BinaryOperator::BinaryOperator(::CppSharp::CppParser::AST::BinaryOperator* native)
: CppSharp::Parser::AST::Expression((::CppSharp::CppParser::AST::Expression*)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::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::Parameter::Parameter(::CppSharp::CppParser::AST::Parameter* native)
: CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)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; 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); ((::CppSharp::CppParser::AST::TParamCommandComment*)NativePtr)->addPosition(arg0);
s = arg0;
} }
void CppSharp::Parser::AST::TParamCommandComment::clearPosition() void CppSharp::Parser::AST::TParamCommandComment::clearPosition()

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

@ -34,6 +34,7 @@ namespace CppSharp
ref class BlockCommandComment; ref class BlockCommandComment;
ref class BlockContentComment; ref class BlockContentComment;
ref class BuiltinType; ref class BuiltinType;
ref class CXXConstructExpr;
ref class Class; ref class Class;
ref class ClassLayout; ref class ClassLayout;
ref class ClassTemplate; ref class ClassTemplate;
@ -1343,12 +1344,6 @@ namespace CppSharp
Expression(::CppSharp::CppParser::AST::Expression* native); Expression(::CppSharp::CppParser::AST::Expression* native);
static Expression^ __CreateInstance(::System::IntPtr native); static Expression^ __CreateInstance(::System::IntPtr native);
Expression(CppSharp::Parser::AST::Expression^ _0); 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 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 ref class Parameter : CppSharp::Parser::AST::Declaration
{ {
public: public:
@ -2414,7 +2429,7 @@ namespace CppSharp
unsigned int getPosition(unsigned int i); 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(); void clearPosition();
}; };

178
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 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 public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5021,9 +5021,6 @@ namespace CppSharp
[FieldOffset(4)] [FieldOffset(4)]
public global::System.IntPtr Decl; public global::System.IntPtr Decl;
[FieldOffset(20)]
public global::System.IntPtr Subexpression;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")] EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")]
@ -5049,7 +5046,7 @@ namespace CppSharp
private static Expression.Internal* __CopyValue(Expression.Internal native) 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)); CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native));
return (Expression.Internal*) ret; return (Expression.Internal*) ret;
} }
@ -5069,7 +5066,7 @@ namespace CppSharp
public Expression(CppSharp.Parser.AST.Expression _0) public Expression(CppSharp.Parser.AST.Expression _0)
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(24); __Instance = Marshal.AllocHGlobal(20);
__ownsNativeInstance = true; __ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this; NativeToManagedMap[__Instance] = this;
var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance;
@ -5094,29 +5091,11 @@ namespace CppSharp
if (__ownsNativeInstance) if (__ownsNativeInstance)
Marshal.FreeHGlobal(__Instance); 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 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 public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5126,12 +5105,9 @@ namespace CppSharp
public global::System.IntPtr Decl; public global::System.IntPtr Decl;
[FieldOffset(20)] [FieldOffset(20)]
public global::System.IntPtr Subexpression;
[FieldOffset(24)]
public global::System.IntPtr LHS; public global::System.IntPtr LHS;
[FieldOffset(28)] [FieldOffset(24)]
public global::System.IntPtr RHS; public global::System.IntPtr RHS;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -5169,7 +5145,7 @@ namespace CppSharp
private static BinaryOperator.Internal* __CopyValue(BinaryOperator.Internal native) 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)); CppSharp.Parser.AST.BinaryOperator.Internal.cctor_2(ret, new global::System.IntPtr(&native));
return (BinaryOperator.Internal*) ret; return (BinaryOperator.Internal*) ret;
} }
@ -5189,7 +5165,7 @@ namespace CppSharp
public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0) public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0)
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(44); __Instance = Marshal.AllocHGlobal(40);
__ownsNativeInstance = true; __ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this; NativeToManagedMap[__Instance] = this;
var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; 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 public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 112)] [StructLayout(LayoutKind.Explicit, Size = 112)]
@ -11132,11 +11242,13 @@ namespace CppSharp
return __ret; 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); Internal.addPosition_0(__Instance, arg0);
} }
}
public void clearPosition() public void clearPosition()
{ {

178
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 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 public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5021,9 +5021,6 @@ namespace CppSharp
[FieldOffset(4)] [FieldOffset(4)]
public global::System.IntPtr Decl; public global::System.IntPtr Decl;
[FieldOffset(32)]
public global::System.IntPtr Subexpression;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall,
EntryPoint="??0Expression@AST@CppParser@CppSharp@@QAE@ABV0123@@Z")] EntryPoint="??0Expression@AST@CppParser@CppSharp@@QAE@ABV0123@@Z")]
@ -5049,7 +5046,7 @@ namespace CppSharp
private static Expression.Internal* __CopyValue(Expression.Internal native) 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)); CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native));
return (Expression.Internal*) ret; return (Expression.Internal*) ret;
} }
@ -5069,7 +5066,7 @@ namespace CppSharp
public Expression(CppSharp.Parser.AST.Expression _0) public Expression(CppSharp.Parser.AST.Expression _0)
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(36); __Instance = Marshal.AllocHGlobal(32);
__ownsNativeInstance = true; __ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this; NativeToManagedMap[__Instance] = this;
var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance;
@ -5094,29 +5091,11 @@ namespace CppSharp
if (__ownsNativeInstance) if (__ownsNativeInstance)
Marshal.FreeHGlobal(__Instance); 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 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 public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5126,12 +5105,9 @@ namespace CppSharp
public global::System.IntPtr Decl; public global::System.IntPtr Decl;
[FieldOffset(32)] [FieldOffset(32)]
public global::System.IntPtr Subexpression;
[FieldOffset(36)]
public global::System.IntPtr LHS; public global::System.IntPtr LHS;
[FieldOffset(40)] [FieldOffset(36)]
public global::System.IntPtr RHS; public global::System.IntPtr RHS;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -5169,7 +5145,7 @@ namespace CppSharp
private static BinaryOperator.Internal* __CopyValue(BinaryOperator.Internal native) 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)); CppSharp.Parser.AST.BinaryOperator.Internal.cctor_2(ret, new global::System.IntPtr(&native));
return (BinaryOperator.Internal*) ret; return (BinaryOperator.Internal*) ret;
} }
@ -5189,7 +5165,7 @@ namespace CppSharp
public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0) public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0)
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(68); __Instance = Marshal.AllocHGlobal(64);
__ownsNativeInstance = true; __ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this; NativeToManagedMap[__Instance] = this;
var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; 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 public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 148)] [StructLayout(LayoutKind.Explicit, Size = 148)]
@ -11132,11 +11242,13 @@ namespace CppSharp
return __ret; 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); Internal.addPosition_0(__Instance, arg0);
} }
}
public void clearPosition() public void clearPosition()
{ {

178
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 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 public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5020,9 +5020,6 @@ namespace CppSharp
[FieldOffset(8)] [FieldOffset(8)]
public global::System.IntPtr Decl; public global::System.IntPtr Decl;
[FieldOffset(40)]
public global::System.IntPtr Subexpression;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")] EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")]
@ -5048,7 +5045,7 @@ namespace CppSharp
private static Expression.Internal* __CopyValue(Expression.Internal native) 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)); CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native));
return (Expression.Internal*) ret; return (Expression.Internal*) ret;
} }
@ -5068,7 +5065,7 @@ namespace CppSharp
public Expression(CppSharp.Parser.AST.Expression _0) public Expression(CppSharp.Parser.AST.Expression _0)
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(48); __Instance = Marshal.AllocHGlobal(40);
__ownsNativeInstance = true; __ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this; NativeToManagedMap[__Instance] = this;
var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance;
@ -5093,29 +5090,11 @@ namespace CppSharp
if (__ownsNativeInstance) if (__ownsNativeInstance)
Marshal.FreeHGlobal(__Instance); 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 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 public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5125,12 +5104,9 @@ namespace CppSharp
public global::System.IntPtr Decl; public global::System.IntPtr Decl;
[FieldOffset(40)] [FieldOffset(40)]
public global::System.IntPtr Subexpression;
[FieldOffset(48)]
public global::System.IntPtr LHS; public global::System.IntPtr LHS;
[FieldOffset(56)] [FieldOffset(48)]
public global::System.IntPtr RHS; public global::System.IntPtr RHS;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -5168,7 +5144,7 @@ namespace CppSharp
private static BinaryOperator.Internal* __CopyValue(BinaryOperator.Internal native) 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)); CppSharp.Parser.AST.BinaryOperator.Internal.cctor_2(ret, new global::System.IntPtr(&native));
return (BinaryOperator.Internal*) ret; return (BinaryOperator.Internal*) ret;
} }
@ -5188,7 +5164,7 @@ namespace CppSharp
public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0) public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0)
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(88); __Instance = Marshal.AllocHGlobal(80);
__ownsNativeInstance = true; __ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this; NativeToManagedMap[__Instance] = this;
var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; 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 public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 200)] [StructLayout(LayoutKind.Explicit, Size = 200)]
@ -11131,11 +11241,13 @@ namespace CppSharp
return __ret; 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); Internal.addPosition_0(__Instance, arg0);
} }
}
public void clearPosition() public void clearPosition()
{ {

178
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 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 public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5020,9 +5020,6 @@ namespace CppSharp
[FieldOffset(8)] [FieldOffset(8)]
public global::System.IntPtr Decl; public global::System.IntPtr Decl;
[FieldOffset(24)]
public global::System.IntPtr Subexpression;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")] EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")]
@ -5048,7 +5045,7 @@ namespace CppSharp
private static Expression.Internal* __CopyValue(Expression.Internal native) 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)); CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native));
return (Expression.Internal*) ret; return (Expression.Internal*) ret;
} }
@ -5068,7 +5065,7 @@ namespace CppSharp
public Expression(CppSharp.Parser.AST.Expression _0) public Expression(CppSharp.Parser.AST.Expression _0)
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(32); __Instance = Marshal.AllocHGlobal(24);
__ownsNativeInstance = true; __ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this; NativeToManagedMap[__Instance] = this;
var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance;
@ -5093,29 +5090,11 @@ namespace CppSharp
if (__ownsNativeInstance) if (__ownsNativeInstance)
Marshal.FreeHGlobal(__Instance); 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 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 public new partial struct Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -5125,12 +5104,9 @@ namespace CppSharp
public global::System.IntPtr Decl; public global::System.IntPtr Decl;
[FieldOffset(24)] [FieldOffset(24)]
public global::System.IntPtr Subexpression;
[FieldOffset(32)]
public global::System.IntPtr LHS; public global::System.IntPtr LHS;
[FieldOffset(40)] [FieldOffset(32)]
public global::System.IntPtr RHS; public global::System.IntPtr RHS;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -5168,7 +5144,7 @@ namespace CppSharp
private static BinaryOperator.Internal* __CopyValue(BinaryOperator.Internal native) 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)); CppSharp.Parser.AST.BinaryOperator.Internal.cctor_1(ret, new global::System.IntPtr(&native));
return (BinaryOperator.Internal*) ret; return (BinaryOperator.Internal*) ret;
} }
@ -5188,7 +5164,7 @@ namespace CppSharp
public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0) public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0)
: this((Internal*) null) : this((Internal*) null)
{ {
__Instance = Marshal.AllocHGlobal(56); __Instance = Marshal.AllocHGlobal(48);
__ownsNativeInstance = true; __ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this; NativeToManagedMap[__Instance] = this;
var arg0 = ReferenceEquals(_0, null) ? global::System.IntPtr.Zero : _0.__Instance; 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 public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 152)] [StructLayout(LayoutKind.Explicit, Size = 152)]
@ -11131,11 +11241,13 @@ namespace CppSharp
return __ret; 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); Internal.addPosition_0(__Instance, arg0);
} }
}
public void clearPosition() public void clearPosition()
{ {

73
src/CppParser/Parser.cpp

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

1
src/CppParser/Parser.h

@ -99,7 +99,6 @@ protected:
PreprocessedEntity* WalkPreprocessedEntity(Declaration* Decl, PreprocessedEntity* WalkPreprocessedEntity(Declaration* Decl,
clang::PreprocessedEntity* PPEntity); clang::PreprocessedEntity* PPEntity);
AST::Expression* WalkExpression(clang::Expr* Expression); AST::Expression* WalkExpression(clang::Expr* Expression);
AST::Expression* WalkExpressionEx(clang::Expr* Expression);
std::string GetStringFromStatement(const clang::Stmt* Statement); std::string GetStringFromStatement(const clang::Stmt* Statement);
// Clang helpers // Clang helpers

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

@ -296,14 +296,15 @@ namespace CppSharp.Generators.CSharp
if (!string.IsNullOrWhiteSpace(ctx.SupportBefore)) if (!string.IsNullOrWhiteSpace(ctx.SupportBefore))
Context.SupportBefore.WriteLine(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, Context.SupportBefore.WriteLine("var _{0} = {1};", parameter.Name,
ctx.Return); ctx.Return);
} }
Context.Return.Write("{0}{1}", Context.Return.Write("{0}{1}",
parameter.IsPrimitiveParameterConvertibleToRef() ? "ref *" : "_", parameter.Name); parameter.Type.IsPrimitiveTypeConvertibleToRef() ? "ref *" : "_", parameter.Name);
return true; return true;
} }

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

@ -2285,10 +2285,12 @@ namespace CppSharp.Generators.CSharp
@interface = paramClass.Namespace.Classes.Find(c => c.OriginalClass == paramClass); @interface = paramClass.Namespace.Classes.Find(c => c.OriginalClass == paramClass);
var paramName = string.Format("{0}{1}", 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); method.Parameters[0].Name);
if (@interface != null) 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 else
WriteLine("return new {0}({1});", method.ConversionType, paramName); WriteLine("return new {0}({1});", method.ConversionType, paramName);
} }
@ -2304,10 +2306,14 @@ namespace CppSharp.Generators.CSharp
if (method.OperatorKind == CXXOperatorKind.EqualEqual) if (method.OperatorKind == CXXOperatorKind.EqualEqual)
{ {
WriteLine("bool {0}Null = ReferenceEquals({0}, null);", method.Parameters[0].Name); WriteLine("bool {0}Null = ReferenceEquals({0}, null);",
WriteLine("bool {0}Null = ReferenceEquals({0}, null);", method.Parameters[1].Name); method.Parameters[0].Name);
WriteLine("if ({0}Null || {1}Null)", method.Parameters[0].Name, method.Parameters[1].Name); WriteLine("bool {0}Null = ReferenceEquals({0}, null);",
WriteLineIndent("return {0}Null && {1}Null;", method.Parameters[0].Name, method.Parameters[1].Name); 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); GenerateInternalFunctionCall(method);
@ -2548,7 +2554,7 @@ namespace CppSharp.Generators.CSharp
{ {
var param = paramInfo.Param; var param = paramInfo.Param;
if (!(param.IsOut || param.IsInOut)) continue; if (!(param.IsOut || param.IsInOut)) continue;
if (param.IsPrimitiveParameterConvertibleToRef()) if (param.Type.IsPrimitiveTypeConvertibleToRef())
continue; continue;
var nativeVarName = paramInfo.Name; var nativeVarName = paramInfo.Name;
@ -2633,7 +2639,7 @@ namespace CppSharp.Generators.CSharp
paramMarshal.Context = ctx; paramMarshal.Context = ctx;
if (param.IsPrimitiveParameterConvertibleToRef()) if (param.Type.IsPrimitiveTypeConvertibleToRef())
{ {
WriteLine("fixed ({0} {1} = &{2})", param.Type.CSharpType(TypePrinter), argName, param.Name); WriteLine("fixed ({0} {1} = &{2})", param.Type.CSharpType(TypePrinter), argName, param.Name);
paramMarshal.HasFixedBlock = true; paramMarshal.HasFixedBlock = true;

6
src/Generator/Generators/ExtensionMethods.cs

@ -27,7 +27,7 @@ namespace CppSharp.Generators
return Interop.CallingConvention.Winapi; return Interop.CallingConvention.Winapi;
} }
public static bool IsPrimitiveParameterConvertibleToRef(this Parameter param) public static bool IsPrimitiveTypeConvertibleToRef(this Type type)
{ {
var allowedToHaveDefaultPtrVals = new List<PrimitiveType> var allowedToHaveDefaultPtrVals = new List<PrimitiveType>
{ {
@ -43,8 +43,8 @@ namespace CppSharp.Generators
PrimitiveType.ULongLong, PrimitiveType.ULongLong,
PrimitiveType.UShort PrimitiveType.UShort
}; };
return param.Type.IsPointerToPrimitiveType() return type.IsPointerToPrimitiveType() &&
&& allowedToHaveDefaultPtrVals.Any(primType => param.Type.IsPointerToPrimitiveType(primType)); allowedToHaveDefaultPtrVals.Any(type.IsPointerToPrimitiveType);
} }
} }
} }

260
src/Generator/Passes/HandleDefaultParamValuesPass.cs

@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using CppSharp.AST; using CppSharp.AST;
using CppSharp.AST.Extensions; using CppSharp.AST.Extensions;
@ -14,7 +15,6 @@ namespace CppSharp.Passes
private static readonly Regex regexFunctionParams = new Regex(@"\(?(.+)\)?", RegexOptions.Compiled); private static readonly Regex regexFunctionParams = new Regex(@"\(?(.+)\)?", RegexOptions.Compiled);
private static readonly Regex regexDoubleColon = new Regex(@"\w+::", 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 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 = private readonly Dictionary<DeclarationContext, List<Function>> overloads =
new Dictionary<DeclarationContext, List<Function>>(); new Dictionary<DeclarationContext, List<Function>>();
@ -43,33 +43,10 @@ namespace CppSharp.Passes
var overloadIndices = new List<int>(function.Parameters.Count); var overloadIndices = new List<int>(function.Parameters.Count);
foreach (var parameter in function.Parameters.Where(p => p.DefaultArgument != null)) foreach (var parameter in function.Parameters.Where(p => p.DefaultArgument != null))
{ {
Type desugared = parameter.Type.Desugar(); var result = parameter.DefaultArgument.String;
if (PrintExpression(parameter.Type, parameter.DefaultArgument, ref result) == null)
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())
{
overloadIndices.Add(function.Parameters.IndexOf(parameter)); overloadIndices.Add(function.Parameters.IndexOf(parameter));
continue; parameter.DefaultArgument.String = result;
}
if (defaultConstruct == true)
continue;
if (CheckForBinaryOperator(parameter.DefaultArgument, desugared))
continue;
if (CheckForEnumValue(parameter.DefaultArgument, desugared))
continue;
CheckForDefaultEmptyChar(parameter, desugared);
} }
GenerateOverloads(function, overloadIndices); GenerateOverloads(function, overloadIndices);
@ -77,164 +54,207 @@ namespace CppSharp.Passes
return true; return true;
} }
private void CheckFloatSyntax(Type desugared, Parameter parameter) private bool? PrintExpression(Type type, Expression expression, ref string result)
{
var builtin = desugared as BuiltinType;
if (builtin != null)
{
switch (builtin.Type)
{ {
case PrimitiveType.Float: var desugared = type.Desugar();
if (parameter.DefaultArgument.String.EndsWith(".F"))
parameter.DefaultArgument.String = if ((!Driver.Options.MarshalCharAsManagedChar &&
parameter.DefaultArgument.String.Replace(".F", ".0F"); desugared.IsPrimitiveType(PrimitiveType.UChar)) ||
break; type.IsPrimitiveTypeConvertibleToRef())
case PrimitiveType.Double: return null;
if (parameter.DefaultArgument.String.EndsWith("."))
parameter.DefaultArgument.String += '0'; if (CheckForDefaultPointer(desugared, ref result))
break; 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) private bool CheckForDefaultPointer(Type desugared, ref string result)
{
if (desugared.IsPointer())
{ {
if (!desugared.IsPointer())
return false;
// IntPtr.Zero is not a constant // IntPtr.Zero is not a constant
if (desugared.IsPointerToPrimitiveType(PrimitiveType.Void)) if (desugared.IsPointerToPrimitiveType(PrimitiveType.Void))
{ {
parameter.DefaultArgument.String = "new global::System.IntPtr()"; result = "new global::System.IntPtr()";
return true; return true;
} }
if (parameter.IsPrimitiveParameterConvertibleToRef())
if (desugared.IsPrimitiveTypeConvertibleToRef())
return false; return false;
Class @class; Class @class;
if (desugared.GetFinalPointee().TryGetClass(out @class) && @class.IsValueType) 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)); new CSharpTypePrinter(Driver).VisitClassDecl(@class));
return true; return true;
} }
parameter.DefaultArgument.String = "null";
result = "null";
return true; return true;
} }
return false;
}
private bool? CheckForDefaultConstruct(Type desugared, Statement arg, private bool? CheckForDefaultConstruct(Type desugared, Statement statement,
TypeQualifiers qualifiers) ref string result)
{ {
// Unwrapping the underlying type behind a possible pointer/reference var type = desugared.GetFinalPointee() ?? desugared;
Type type = desugared.GetFinalPointee() ?? desugared;
Class decl; Class decl;
if (!type.TryGetClass(out decl)) if (!type.TryGetClass(out decl))
return false; return false;
var ctor = arg.Declaration as Method; var ctor = statement as CXXConstructExpr;
TypeMap typeMap; 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)) if (Driver.TypeDatabase.FindTypeMap(decl, type, out typeMap))
{ {
var typeInSignature = typeMap.CSharpSignatureType( var typeInSignature = typeMap.CSharpSignatureType(
typePrinterContext).SkipPointerRefs().Desugar(); typePrinter.Context).SkipPointerRefs().Desugar();
Enumeration @enum; Enumeration @enum;
if (typeInSignature.TryGetEnum(out @enum)) if (typeInSignature.TryGetEnum(out @enum))
{
if (ctor != null &&
(ctor.Arguments.Count == 0 ||
HasSingleZeroArgExpression((Function) ctor.Declaration)))
{
result = "0";
return true;
}
return false; return false;
}
if (ctor == null || !ctor.IsConstructor) if (ctor != null && typePrinterResult == "string" && ctor.Arguments.Count == 0)
return false;
typePrinterResult = typeMap.CSharpSignature(typePrinterContext);
if (typePrinterResult == "string" && ctor.Parameters.Count == 0)
{ {
arg.String = "\"\""; result = "\"\"";
return true; return true;
} }
} }
var match = regexCtor.Match(arg.String); if (ctor == null)
if (match.Success) 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 argument = ctor.Arguments[i];
var typePrinter = new CSharpTypePrinter(Driver); var argResult = argument.String;
typePrinterResult = typePrinterResult ?? (templateSpecializationType != null expressionSupported &= PrintExpression(method.Parameters[i].Type.Desugar(),
? typePrinter.VisitTemplateSpecializationType( argument, ref argResult) ?? false;
templateSpecializationType, qualifiers) argsBuilder.Append(argResult);
: typePrinter.VisitClassDecl((Class) ctor.Namespace)).Type; if (i < ctor.Arguments.Count - 1)
argsBuilder.Append(", ");
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)", "()");
} }
else argsBuilder.Append(')');
arg.String = string.Format("new {0}", arg.String); result = argsBuilder.ToString();
} }
else 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; Enumeration @enum;
if (finalPointee.TryGetEnum(out @enum)) if (paramType.TryGetEnum(out @enum))
TranslateEnumExpression(ctor, arg, finalPointee, arg.String); 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; var rhsResult = binaryOperator.RHS.String;
CheckForEnumValue(binaryOperator.LHS, desugared); CheckForEnumValue(desugared, binaryOperator.RHS, ref rhsResult);
CheckForEnumValue(binaryOperator.RHS, desugared);
arg.String = string.Format("{0} {1} {2}", binaryOperator.LHS.String, result = string.Format("{0} {1} {2}", lhsResult,
binaryOperator.OpcodeStr, binaryOperator.RHS.String); binaryOperator.OpcodeStr, rhsResult);
return true; 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) if (enumItem != null)
{ {
arg.String = string.Format("{0}{1}.{2}", result = string.Format("{0}{1}.{2}",
desugared.IsPrimitiveType() ? "(int) " : string.Empty, desugared.IsPrimitiveType() ? "(int) " : string.Empty,
new CSharpTypePrinter(Driver).VisitEnumDecl( new CSharpTypePrinter(Driver).VisitEnumDecl(
(Enumeration) enumItem.Namespace), enumItem.Name); (Enumeration) enumItem.Namespace), enumItem.Name);
return true; return true;
} }
var call = arg.Declaration as Function; var call = statement.Declaration as Function;
if (call != null && arg.String != "0") if (call != null && statement.String != "0")
{ {
string @params = regexFunctionParams.Match(arg.String).Groups[1].Value; var @params = regexFunctionParams.Match(statement.String).Groups[1].Value;
TranslateEnumExpression(call, arg, desugared, @params); result = TranslateEnumExpression(call, desugared, @params);
return true; return true;
} }
return false; return false;
} }
private void TranslateEnumExpression(Function function, Statement arg, private string TranslateEnumExpression(Function function,
Type desugared, string @params) Type desugared, string @params)
{ {
TypeMap typeMap; TypeMap typeMap;
if ((function.Parameters.Count == 0 || if ((function.Parameters.Count == 0 ||
HasSingleZeroExpression(function)) && HasSingleZeroArgExpression(function)) &&
Driver.TypeDatabase.FindTypeMap(desugared, out typeMap)) Driver.TypeDatabase.FindTypeMap(desugared, out typeMap))
{ {
var typeInSignature = typeMap.CSharpSignatureType(new CSharpTypePrinterContext var typeInSignature = typeMap.CSharpSignatureType(new CSharpTypePrinterContext
@ -244,18 +264,16 @@ namespace CppSharp.Passes
}).SkipPointerRefs().Desugar(); }).SkipPointerRefs().Desugar();
Enumeration @enum; Enumeration @enum;
if (typeInSignature.TryGetEnum(out @enum)) if (typeInSignature.TryGetEnum(out @enum))
{ return "0";
arg.String = "0";
return;
}
} }
if (@params.Contains("::")) if (@params.Contains("::"))
arg.String = regexDoubleColon.Replace(@params, desugared + "."); return regexDoubleColon.Replace(@params, desugared + ".");
else
arg.String = regexName.Replace(@params, desugared + ".$1"); return regexName.Replace(@params, desugared + ".$1");
} }
private static bool HasSingleZeroExpression(Function function) private static bool HasSingleZeroArgExpression(Function function)
{ {
if (function.Parameters.Count != 1) if (function.Parameters.Count != 1)
return false; return false;
@ -265,14 +283,18 @@ namespace CppSharp.Passes
((BuiltinTypeExpression) defaultArgument).Value == 0; ((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 && Driver.Options.MarshalCharAsManagedChar &&
desugared.IsPrimitiveType(PrimitiveType.Char)) desugared.IsPrimitiveType(PrimitiveType.Char))
{ {
parameter.DefaultArgument.String = "'\\0'"; result = "'\\0'";
return true;
} }
return false;
} }
private void GenerateOverloads(Function function, List<int> overloadIndices) private void GenerateOverloads(Function function, List<int> overloadIndices)

2
src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs

@ -14,7 +14,7 @@ namespace CppSharp.Passes
return false; return false;
foreach (var param in function.Parameters.Where( foreach (var param in function.Parameters.Where(
p => !p.IsOut && p.IsPrimitiveParameterConvertibleToRef())) p => !p.IsOut && p.Type.IsPrimitiveTypeConvertibleToRef()))
param.Usage = ParameterUsage.InOut; param.Usage = ParameterUsage.InOut;
return true; return true;

16
tests/CSharpTemp/CSharpTemp.cpp

@ -322,6 +322,18 @@ QGenericArgument::QGenericArgument(const char *name)
_name = 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) 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() int MethodsWithDefaultValues::getA()
{ {
return m_foo.A; return m_foo.A;

2
tests/CSharpTemp/CSharpTemp.cs

@ -143,7 +143,9 @@ namespace CppSharp.Tests
ctx.SetClassAsValueType("TestCopyConstructorVal"); ctx.SetClassAsValueType("TestCopyConstructorVal");
ctx.SetClassAsValueType("QGenericArgument"); ctx.SetClassAsValueType("QGenericArgument");
ctx.SetClassAsValueType("StructWithPrivateFields"); ctx.SetClassAsValueType("StructWithPrivateFields");
ctx.SetClassAsValueType("QPoint");
ctx.SetClassAsValueType("QSize"); ctx.SetClassAsValueType("QSize");
ctx.SetClassAsValueType("QRect");
ctx.IgnoreClassWithName("IgnoredTypeInheritingNonIgnoredWithNoEmptyCtor"); ctx.IgnoreClassWithName("IgnoredTypeInheritingNonIgnoredWithNoEmptyCtor");
} }

19
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 class DLL_API MethodsWithDefaultValues : public Quux
{ {
public: public:
@ -339,6 +357,7 @@ public:
void defaultDoubleWithoutF(double d1 = 1.0, double d2 = 1.); void defaultDoubleWithoutF(double d1 = 1.0, double d2 = 1.);
void defaultIntExpressionWithEnum(int i = Qt::GlobalColor::black + 1); void defaultIntExpressionWithEnum(int i = Qt::GlobalColor::black + 1);
void defaultCtorWithMoreThanOneArg(QMargins m = QMargins(0, 0, 0, 0)); void defaultCtorWithMoreThanOneArg(QMargins m = QMargins(0, 0, 0, 0));
void defaultWithComplexArgs(const QRect& rectangle = QRect(QPoint(0, 0), QSize(-1, -1)));
int getA(); int getA();
private: private:
Foo m_foo; Foo m_foo;

Loading…
Cancel
Save