Browse Source

Add Experimental Initial Span (#1651)

* Fix NotImplementedException

* Add Experimental Span

* Fix Some Problems and Comment
295227ce-f4a3-466b-a694-65c571873871
Ahmed Elsayed 4 years ago committed by GitHub
parent
commit
c281f57b52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 37
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 14
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  3. 6
      src/Generator/Options.cs

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

@ -69,10 +69,18 @@ namespace CppSharp.Generators.CSharp @@ -69,10 +69,18 @@ namespace CppSharp.Generators.CSharp
var arrayType = array.Type.Desugar();
if (CheckIfArrayCanBeCopiedUsingMemoryCopy(array))
{
if (Context.Context.Options.UseSpan)
Context.Return.Write($"new Span<{arrayType}>({Context.ReturnVarName}, {array.Size})");
else
Context.Return.Write($"CppSharp.Runtime.MarshalUtil.GetArray<{arrayType}>({Context.ReturnVarName}, {array.Size})");
}
else if (array.Type.IsPrimitiveType(PrimitiveType.Char) && Context.Context.Options.MarshalCharAsManagedChar)
Context.Return.Write($"CppSharp.Runtime.MarshalUtil.GetCharArray({Context.ReturnVarName}, {array.Size})");
else if (array.Type.IsPointerToPrimitiveType(PrimitiveType.Void))
if (Context.Context.Options.UseSpan)
Context.Return.Write($"Span<IntPtr>({Context.ReturnVarName}, {array.Size})");
else
Context.Return.Write($"CppSharp.Runtime.MarshalUtil.GetIntPtrArray({Context.ReturnVarName}, {array.Size})");
else
{
@ -876,16 +884,28 @@ namespace CppSharp.Generators.CSharp @@ -876,16 +884,28 @@ namespace CppSharp.Generators.CSharp
if (elementType.IsPrimitiveType() ||
elementType.IsPointerToPrimitiveType())
{
if (Context.Context.Options.UseSpan && !elementType.IsConstCharString())
{
var local = Generator.GeneratedIdentifier($@"{
Context.Parameter.Name}{Context.ParameterIndex}");
Context.Before.WriteLine($@"fixed ({
typePrinter.PrintNative(elementType)}* {local} = &MemoryMarshal.GetReference({Context.Parameter.Name}))");
Context.HasCodeBlock = true;
Context.Before.WriteOpenBraceAndIndent();
Context.Return.Write(local);
}
else
Context.Return.Write(Context.Parameter.Name);
return;
}
var intermediateArray = Generator.GeneratedIdentifier(Context.Parameter.Name);
var intermediateArrayType = typePrinter.PrintNative(elementType);
if (Context.Context.Options.UseSpan)
Context.Before.WriteLine($"Span<{intermediateArrayType}> {intermediateArray};");
else
Context.Before.WriteLine($"{intermediateArrayType}[] {intermediateArray};");
Context.Before.WriteLine($"if ({Context.Parameter.Name} is null)");
Context.Before.WriteLine($"if ({Context.Parameter.Name} == null)");
Context.Before.WriteLineIndent($"{intermediateArray} = null;");
Context.Before.WriteLine("else");
@ -911,6 +931,17 @@ namespace CppSharp.Generators.CSharp @@ -911,6 +931,17 @@ namespace CppSharp.Generators.CSharp
Context.Before.UnindentAndWriteCloseBrace();
if (Context.Context.Options.UseSpan)
{
var local = Generator.GeneratedIdentifier($@"{
intermediateArray}{Context.ParameterIndex}");
Context.Before.WriteLine($@"fixed ({
typePrinter.PrintNative(elementType)}* {local} = &MemoryMarshal.GetReference({intermediateArray}))");
Context.HasCodeBlock = true;
Context.Before.WriteOpenBraceAndIndent();
Context.Return.Write(local);
}
else
Context.Return.Write(intermediateArray);
}

14
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -123,6 +123,20 @@ namespace CppSharp.Generators.CSharp @@ -123,6 +123,20 @@ namespace CppSharp.Generators.CSharp
return $"{prefix}string[]";
}
if (Context.Options.UseSpan && !(array.SizeType != ArrayType.ArraySize.Constant &&
MarshalKind == MarshalKind.ReturnVariableArray))
{
if (ContextKind == TypePrinterContextKind.Managed)
{
return $"Span<{arrayType.Visit(this)}>";
}
else
{
return $"{arrayType.Visit(this)}*"; ;
}
}
var arraySuffix = array.SizeType != ArrayType.ArraySize.Constant &&
MarshalKind == MarshalKind.ReturnVariableArray ?
(ContextKind == TypePrinterContextKind.Managed &&

6
src/Generator/Options.cs

@ -184,6 +184,12 @@ namespace CppSharp @@ -184,6 +184,12 @@ namespace CppSharp
public readonly List<string> DependentNameSpaces = new List<string>();
public bool MarshalCharAsManagedChar { get; set; }
/// <summary>
/// Use Span Struct instead of Managed Array
/// </summary>
public bool UseSpan { get; set; }
/// <summary>
/// Generates a single C# file.
/// </summary>

Loading…
Cancel
Save