Browse Source

Fix code generation

pull/1778/head
Salvage 2 years ago
parent
commit
e8cc4b604d
No known key found for this signature in database
GPG Key ID: 1362C7A680BA7451
  1. 19
      src/Generator/Types/Std/Stdlib.CSharp.cs
  2. 1
      tests/dotnet/CSharp/CSharp.CSharp.csproj
  3. 13
      tests/dotnet/CSharp/CSharp.Tests.cs
  4. 6
      tests/dotnet/CSharp/CSharp.h

19
src/Generator/Types/Std/Stdlib.CSharp.cs

@ -1,3 +1,4 @@ @@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
@ -6,6 +7,7 @@ using CppSharp.AST; @@ -6,6 +7,7 @@ using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Generators;
using CppSharp.Generators.CSharp;
using Type = CppSharp.AST.Type;
namespace CppSharp.Types.Std
{
@ -145,7 +147,7 @@ namespace CppSharp.Types.Std @@ -145,7 +147,7 @@ namespace CppSharp.Types.Std
// would be really helpful to have ctx hold a Decl property representing the
// "appropriate" Decl when we get here. When MarshalKind == NativeField, Decl would
// be set to the Field we're operating on.
var fieldName = ctx.ReturnVarName.Substring(ctx.ReturnVarName.LastIndexOf("->") + 2);
var fieldName = ctx.ReturnVarName[Math.Max(ctx.ReturnVarName.LastIndexOf('.') + 1, ctx.ReturnVarName.LastIndexOf("->") + 2)..];
ctx.Before.WriteLine($"if (__{fieldName}_OwnsNativeMemory)");
ctx.Before.WriteLineIndent($"Marshal.FreeHGlobal({ctx.ReturnVarName});");
@ -326,10 +328,21 @@ namespace CppSharp.Types.Std @@ -326,10 +328,21 @@ namespace CppSharp.Types.Std
var assign = basicString.Methods.First(m => m.OriginalName == "assign");
if (ctx.MarshalKind == MarshalKind.NativeField)
{
string var;
if (ctx.ReturnVarName.LastIndexOf('.') > ctx.ReturnVarName.LastIndexOf("->"))
{
var = Generator.GeneratedIdentifier(ctx.ArgName);
ctx.Before.WriteLine($"fixed (void* {var} = &{ctx.ReturnVarName})");
ctx.Before.WriteOpenBraceAndIndent();
ctx.HasCodeBlock = true;
}
else
{
var = $"&{ctx.ReturnVarName}";
}
ctx.Return.Write($@"{qualifiedBasicString}Extensions.{
Helpers.InternalStruct}.{assign.Name}(new {
typePrinter.IntPtrType}(&{
ctx.ReturnVarName}), ");
typePrinter.IntPtrType}({var}), ");
if (ctx.Parameter.Type.IsTemplateParameterType())
ctx.Return.Write("(string) (object) ");
ctx.Return.Write($"{ctx.Parameter.Name})");

1
tests/dotnet/CSharp/CSharp.CSharp.csproj

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<NoWarn>0108</NoWarn>
<LangVersion>10</LangVersion>
</PropertyGroup>
<ItemGroup>
<Compile Include="CSharpPartialMethods.cs" />

13
tests/dotnet/CSharp/CSharp.Tests.cs

@ -6,6 +6,7 @@ using System.Runtime.InteropServices; @@ -6,6 +6,7 @@ using System.Runtime.InteropServices;
using System.Text;
using CSharp;
using NUnit.Framework;
using ValueType = CSharp.ValueType;
[TestFixture]
public unsafe class CSharpTests
@ -2024,4 +2025,16 @@ public unsafe class CSharpTests @@ -2024,4 +2025,16 @@ public unsafe class CSharpTests
Assert.That(new CSharp.Optional<IntPtr>(IntPtr.MaxValue) == new CSharp.Optional<IntPtr>(IntPtr.MaxValue));
Assert.That(new CSharp.Optional<IntPtr>(IntPtr.MaxValue) == IntPtr.MaxValue);
}
[Test]
public void TestString()
{
var test = new CSharp.ValueType();
Assert.AreEqual(string.Empty, test.StringMember);
Assert.AreEqual(null, test.CharPtrMember);
test.StringMember = "test";
test.CharPtrMember = "test2";
Assert.AreEqual("test", test.StringMember);
Assert.AreEqual("test2", test.CharPtrMember);
}
}

6
tests/dotnet/CSharp/CSharp.h

@ -1641,3 +1641,9 @@ public: @@ -1641,3 +1641,9 @@ public:
// We just need a method that uses various instantiations of Optional.
inline void DLL_API InstantiateOptionalTemplate(Optional<unsigned int>, Optional<std::string>,
Optional<TestComparison>, Optional<char*>, Optional<UnionTester>) { }
CS_VALUE_TYPE class DLL_API value_type {
public:
std::string string_member;
const char* char_ptr_member;
};

Loading…
Cancel
Save