Browse Source

Prevented conversion operators from getting ref params.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/503/merge
Dimitar Dobrev 10 years ago
parent
commit
76ea3158df
  1. 2
      src/Generator/Driver.cs
  2. 8
      src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs
  3. 3
      tests/CSharpTemp/CSharpTemp.Tests.cs
  4. 2
      tests/CSharpTemp/CSharpTemp.cpp
  5. 2
      tests/CSharpTemp/CSharpTemp.h

2
src/Generator/Driver.cs

@ -242,7 +242,6 @@ namespace CppSharp @@ -242,7 +242,6 @@ namespace CppSharp
TranslationUnitPasses.AddPass(new SortDeclarationsPass());
TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new MarshalPrimitivePointersAsRefTypePass());
if (Options.IsCSharpGenerator && Options.GenerateInlines)
TranslationUnitPasses.AddPass(new GenerateInlinesCodePass());
@ -258,6 +257,7 @@ namespace CppSharp @@ -258,6 +257,7 @@ namespace CppSharp
if (Options.GenerateConversionOperators)
TranslationUnitPasses.AddPass(new ConstructorToConversionOperatorPass());
TranslationUnitPasses.AddPass(new MarshalPrimitivePointersAsRefTypePass());
TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions());
TranslationUnitPasses.AddPass(new CheckOperatorsOverloadsPass());
TranslationUnitPasses.AddPass(new CheckVirtualOverrideReturnCovariance());

8
src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs

@ -8,10 +8,16 @@ namespace CppSharp.Passes @@ -8,10 +8,16 @@ namespace CppSharp.Passes
{
public override bool VisitFunctionDecl(Function function)
{
if (!base.VisitFunctionDecl(function) ||
function.OperatorKind == CXXOperatorKind.Conversion ||
function.OperatorKind == CXXOperatorKind.ExplicitConversion)
return false;
foreach (var param in function.Parameters.Where(
p => !p.IsOut && p.IsPrimitiveParameterConvertibleToRef()))
param.Usage = ParameterUsage.InOut;
return base.VisitFunctionDecl(function);
return true;
}
}
}

3
tests/CSharpTemp/CSharpTemp.Tests.cs

@ -349,7 +349,8 @@ public class CSharpTempTests : GeneratorTestFixture @@ -349,7 +349,8 @@ public class CSharpTempTests : GeneratorTestFixture
[Test]
public unsafe void TestMultiOverLoadPtrToRef()
{
var obj = new MultiOverloadPtrToRef();
var r = 0;
var obj = new MultiOverloadPtrToRef(ref r);
var p = obj.ReturnPrimTypePtr();
Assert.AreEqual(0, p[0]);
Assert.AreEqual(0, p[1]);

2
tests/CSharpTemp/CSharpTemp.cpp

@ -701,7 +701,7 @@ void MultiOverloadPtrToRef::funcPrimitivePtrToRefWithMultiOverload(int* pOne, ch @@ -701,7 +701,7 @@ void MultiOverloadPtrToRef::funcPrimitivePtrToRefWithMultiOverload(int* pOne, ch
{
}
MultiOverloadPtrToRef::MultiOverloadPtrToRef()
MultiOverloadPtrToRef::MultiOverloadPtrToRef(int* param)
{
arr = new int[3]{0};
}

2
tests/CSharpTemp/CSharpTemp.h

@ -622,11 +622,11 @@ class DLL_API MultiOverloadPtrToRef @@ -622,11 +622,11 @@ class DLL_API MultiOverloadPtrToRef
{
int * arr;
public:
MultiOverloadPtrToRef(int* param);
void funcPrimitivePtrToRef(int *pOne, char* pTwo, float* pThree, bool* pFour = 0);
void funcPrimitivePtrToRefWithDefVal(int* pOne, char* pTwo, Foo* pThree, int* pFour = 0);
virtual void funcPrimitivePtrToRefWithMultiOverload(int* pOne, char* pTwo, Foo* pThree, int* pFour = 0, long* pFive = 0);
MultiOverloadPtrToRef();
int* ReturnPrimTypePtr();
void TakePrimTypePtr(int* ptr);
};

Loading…
Cancel
Save