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

8
src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs

@ -8,10 +8,16 @@ namespace CppSharp.Passes
{ {
public override bool VisitFunctionDecl(Function function) 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( foreach (var param in function.Parameters.Where(
p => !p.IsOut && p.IsPrimitiveParameterConvertibleToRef())) p => !p.IsOut && p.IsPrimitiveParameterConvertibleToRef()))
param.Usage = ParameterUsage.InOut; param.Usage = ParameterUsage.InOut;
return base.VisitFunctionDecl(function);
return true;
} }
} }
} }

3
tests/CSharpTemp/CSharpTemp.Tests.cs

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

2
tests/CSharpTemp/CSharpTemp.cpp

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

2
tests/CSharpTemp/CSharpTemp.h

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

Loading…
Cancel
Save