Browse Source

Add missing GenerateNativeToManagedFor checks

dev
josetr 3 years ago
parent
commit
efdec41f13
  1. 9
      src/AST/TypeExtensions.cs
  2. 5
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  3. 6
      src/Generator/Generators/CSharp/CSharpSources.cs

9
src/AST/TypeExtensions.cs

@ -443,8 +443,9 @@ @@ -443,8 +443,9 @@
return array.Size * array.ElementSize;
}
internal static bool IsReferenceToPtrToClass(this Type type)
internal static bool TryGetReferenceToPtrToClass(this Type type, out Type classType)
{
classType = null;
var @ref = type.Desugar().AsLvReference();
if (@ref == null)
return false;
@ -454,7 +455,11 @@ @@ -454,7 +455,11 @@
return false;
var @class = @ptr.Pointee;
return @class != null && @class.IsClass();
if (!@class.IsClass())
return false;
classType = @class;
return true;
}
internal static PointerType AsLvReference(this Type type)

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

@ -393,8 +393,9 @@ namespace CppSharp.Generators.CSharp @@ -393,8 +393,9 @@ namespace CppSharp.Generators.CSharp
var dtorVirtual = (dtor != null && dtor.IsVirtual);
var cache = dtorVirtual && Context.Parameter == null;
var skipVTables = dtorVirtual && Context.Parameter != null;
Context.Before.WriteLine("var {0} = {1}.__GetOrCreateInstance({2}, {3}{4});",
ret, qualifiedClass, Context.ReturnVarName, cache ? "true" : "false", skipVTables ? ", skipVTables: true" : string.Empty);
var get = Context.Context.Options.GenerateNativeToManagedFor(@class) ? "GetOr" : "";
Context.Before.WriteLine("var {0} = {1}.__{5}CreateInstance({2}, {3}{4});",
ret, qualifiedClass, Context.ReturnVarName, cache ? "true" : "false", skipVTables ? ", skipVTables: true" : string.Empty, get);
}
else
{

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

@ -3141,12 +3141,12 @@ internal static{(@new ? " new" : string.Empty)} {printedClass} __GetInstance({Ty @@ -3141,12 +3141,12 @@ internal static{(@new ? " new" : string.Empty)} {printedClass} __GetInstance({Ty
foreach (var param in @params)
{
if (param.Param.IsInOut && param.Param.Type.IsReferenceToPtrToClass())
if (param.Param.IsInOut && param.Param.Type.TryGetReferenceToPtrToClass(out var classType) && classType.TryGetClass(out var @class))
{
var qualifiedClass = param.Param.Type.Visit(TypePrinter);
var get = Options.GenerateNativeToManagedFor(@class) ? "GetOr" : "";
WriteLine($"if ({param.Name} != {param.Param.Name}.__Instance)");
WriteLine($"{param.Param.Name} = {qualifiedClass}.__GetOrCreateInstance(__{param.Name}, false);");
WriteLine($"{param.Param.Name} = {qualifiedClass}.__{get}CreateInstance(__{param.Name}, false);");
}
}

Loading…
Cancel
Save