Browse Source

Remove the copying of returned values

This improves performance and more importantly, fixes a memory leak caused by the original value not being destroyed.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1241/head
Dimitar Dobrev 6 years ago
parent
commit
dde6d74cd8
  1. 9
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 15
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 3
      src/Generator/Types/Std/Stdlib.cs

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

@ -289,8 +289,13 @@ namespace CppSharp.Generators.CSharp
if (returnType.IsAddress()) if (returnType.IsAddress())
Context.Return.Write(HandleReturnedPointer(@class, qualifiedClass.Type)); Context.Return.Write(HandleReturnedPointer(@class, qualifiedClass.Type));
else else if (Context.MarshalKind == MarshalKind.NativeField ||
Context.Return.Write($"{qualifiedClass}.{Helpers.CreateInstanceIdentifier}({Context.ReturnVarName})"); Context.Function?.HasIndirectReturnTypeParameter == true ||
Context.Function?.OperatorKind == CXXOperatorKind.Subscript)
Context.Return.Write($@"{qualifiedClass}.{Helpers.CreateInstanceIdentifier}({
Context.ReturnVarName})");
else Context.Return.Write($@"{qualifiedClass}.{Helpers.CreateInstanceIdentifier}(new {
typePrinter.IntPtrType}(&{Context.ReturnVarName}))");
return true; return true;
} }

15
src/Generator/Generators/CSharp/CSharpSources.cs

@ -2808,6 +2808,7 @@ namespace CppSharp.Generators.CSharp
var originalFunction = function.OriginalFunction ?? function; var originalFunction = function.OriginalFunction ?? function;
var names = new List<string>();
if (originalFunction.HasIndirectReturnTypeParameter) if (originalFunction.HasIndirectReturnTypeParameter)
{ {
var indirectRetType = originalFunction.Parameters.First( var indirectRetType = originalFunction.Parameters.First(
@ -2825,8 +2826,8 @@ namespace CppSharp.Generators.CSharp
Class retClass; Class retClass;
type.TryGetClass(out retClass); type.TryGetClass(out retClass);
var @class = retClass.OriginalClass ?? retClass; var @class = retClass.OriginalClass ?? retClass;
WriteLine($@"var {Helpers.ReturnIdentifier} = new { WriteLine($@"var {Helpers.ReturnIdentifier} = Marshal.AllocHGlobal({
TypePrinter.PrintNative(@class)}();"); @class.Layout.GetSize()});");
} }
else else
{ {
@ -2839,13 +2840,15 @@ namespace CppSharp.Generators.CSharp
WriteLine("{0} {1};", typeMap.CSharpSignatureType(typePrinterContext), WriteLine("{0} {1};", typeMap.CSharpSignatureType(typePrinterContext),
Helpers.ReturnIdentifier); Helpers.ReturnIdentifier);
names.Add($"new IntPtr(&{Helpers.ReturnIdentifier})");
} }
else else
WriteLine("var {0} = {1};", construct); WriteLine("var {0} = {1};", construct);
} }
if (names.Count == 0)
names.Add(Helpers.ReturnIdentifier);
} }
var names = new List<string>();
foreach (var param in @params) foreach (var param in @params)
{ {
if (param.Param == operatorParam && needsInstance) if (param.Param == operatorParam && needsInstance)
@ -2862,12 +2865,6 @@ namespace CppSharp.Generators.CSharp
var needsFixedThis = needsInstance && isValueType; var needsFixedThis = needsInstance && isValueType;
if (originalFunction.HasIndirectReturnTypeParameter)
{
var name = string.Format("new IntPtr(&{0})", Helpers.ReturnIdentifier);
names.Insert(0, name);
}
if (needsInstance) if (needsInstance)
{ {
var instanceIndex = GetInstanceParamIndex(method); var instanceIndex = GetInstanceParamIndex(method);

3
src/Generator/Types/Std/Stdlib.cs

@ -382,8 +382,7 @@ namespace CppSharp.Types.Std
ctx.MarshalKind == MarshalKind.ReturnVariableArray; ctx.MarshalKind == MarshalKind.ReturnVariableArray;
ctx.Before.WriteLine($@"var {varBasicString} = { ctx.Before.WriteLine($@"var {varBasicString} = {
basicString.Visit(typePrinter)}.{Helpers.CreateInstanceIdentifier}({ basicString.Visit(typePrinter)}.{Helpers.CreateInstanceIdentifier}({
(usePointer ? string.Empty : $"new {typePrinter.IntPtrType}(&")}{ ctx.ReturnVarName});");
ctx.ReturnVarName}{(usePointer ? string.Empty : ")")});");
string @string = $"{qualifiedBasicString}Extensions.{data.Name}({varBasicString})"; string @string = $"{qualifiedBasicString}Extensions.{data.Name}({varBasicString})";
if (usePointer) if (usePointer)
{ {

Loading…
Cancel
Save