From 86005ab45c3db8093e03a93fdc2721918e3a0003 Mon Sep 17 00:00:00 2001 From: josetr <37419832+josetr@users.noreply.github.com> Date: Thu, 30 Jun 2022 21:04:57 +0100 Subject: [PATCH] Fix FunctionToStaticMethod bug --- src/Generator/Passes/CheckAbiParameters.cs | 3 ++- src/Generator/Passes/MoveFunctionToClassPass.cs | 3 ++- tests/CSharp/CSharp.Tests.cs | 10 ++++++++++ tests/CSharp/CSharp.cpp | 6 ++++++ tests/CSharp/CSharp.h | 8 ++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Generator/Passes/CheckAbiParameters.cs b/src/Generator/Passes/CheckAbiParameters.cs index 701c607c..a6360960 100644 --- a/src/Generator/Passes/CheckAbiParameters.cs +++ b/src/Generator/Passes/CheckAbiParameters.cs @@ -1,5 +1,6 @@ using CppSharp.AST; using CppSharp.AST.Extensions; +using CppSharp.Extensions; using System.Linq; namespace CppSharp.Passes @@ -32,7 +33,7 @@ namespace CppSharp.Passes var isReturnIndirect = function.IsReturnIndirect || ( Context.ParserOptions.IsMicrosoftAbi && - function is Method && + function is Method m && m.IsNativeMethod() && !function.ReturnType.Type.Desugar().IsAddress() && function.ReturnType.Type.Desugar().TryGetDeclaration(out Class returnTypeDecl) && returnTypeDecl.IsPOD && diff --git a/src/Generator/Passes/MoveFunctionToClassPass.cs b/src/Generator/Passes/MoveFunctionToClassPass.cs index b6b11c61..00a2ddc8 100644 --- a/src/Generator/Passes/MoveFunctionToClassPass.cs +++ b/src/Generator/Passes/MoveFunctionToClassPass.cs @@ -23,7 +23,8 @@ namespace CppSharp.Passes Namespace = @class, OperatorKind = function.OperatorKind, OriginalFunction = null, - IsStatic = true + Conversion = MethodConversionKind.FunctionToStaticMethod, + IsStatic = true, }; if (method.IsOperator) diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index 5aa39e73..41394621 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -1883,4 +1883,14 @@ public unsafe class CSharpTests Assert.That((short)c, Is.EqualTo(100)); } } + + [Test] + public void TestFunctionToInstanceMethod() + { + Assert.That(CSharp.CSharp.TestFunctionToInstanceMethod(new FTIStruct()).A, Is.EqualTo(6)); + Assert.That(CSharp.CSharp.TestFunctionToInstanceMethodStruct(new FTIStruct(), new FTIStruct() { A = 6 }), Is.EqualTo(6)); + Assert.That(CSharp.CSharp.TestFunctionToInstanceMethodRefStruct(new FTIStruct(), new FTIStruct() { A = 6 }), Is.EqualTo(6)); + Assert.That(CSharp.CSharp.TestFunctionToInstanceMethodConstStruct(new FTIStruct(), new FTIStruct() { A = 6 }), Is.EqualTo(6)); + Assert.That(CSharp.CSharp.TestFunctionToInstanceMethodConstRefStruct(new FTIStruct(), new FTIStruct() { A = 6 }), Is.EqualTo(6)); + } } diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index 64716b44..372a0e82 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -1685,3 +1685,9 @@ const unsigned StructWithEmbeddedArrayOfStructObjectAlignmentOffsets[2] offsetof(StructWithEmbeddedArrayOfStructObjectAlignment, boolean), offsetof(StructWithEmbeddedArrayOfStructObjectAlignment, embedded_struct), }; + +DLL_API FTIStruct TestFunctionToInstanceMethod(FTIStruct* bb) { return { 6 }; } +DLL_API int TestFunctionToInstanceMethodStruct(FTIStruct* bb, FTIStruct defaultValue) { return defaultValue.a; } +DLL_API int TestFunctionToInstanceMethodRefStruct(FTIStruct* bb, FTIStruct& defaultValue) { return defaultValue.a; } +DLL_API int TestFunctionToInstanceMethodConstStruct(FTIStruct* bb, const FTIStruct defaultValue) { return defaultValue.a; } +DLL_API int TestFunctionToInstanceMethodConstRefStruct(FTIStruct* bb, const FTIStruct& defaultValue) { return defaultValue.a; } diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index faffaf76..2ccd8482 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -1526,3 +1526,11 @@ DLL_API const char* TestCSharpString(const char* in, CS_OUT const char** out); DLL_API const wchar_t* TestCSharpStringWide(const wchar_t* in, CS_OUT const wchar_t** out); DLL_API const char16_t* TestCSharpString16(const char16_t* in, CS_OUT const char16_t** out); DLL_API const char32_t* TestCSharpString32(const char32_t* in, CS_OUT const char32_t** out); + +struct DLL_API FTIStruct { int a; }; + +DLL_API FTIStruct TestFunctionToInstanceMethod(FTIStruct* bb); +DLL_API int TestFunctionToInstanceMethodStruct(FTIStruct* bb, FTIStruct defaultValue); +DLL_API int TestFunctionToInstanceMethodRefStruct(FTIStruct* bb, FTIStruct& defaultValue); +DLL_API int TestFunctionToInstanceMethodConstStruct(FTIStruct* bb, const FTIStruct defaultValue); +DLL_API int TestFunctionToInstanceMethodConstRefStruct(FTIStruct* bb, const FTIStruct& defaultValue);