Add support for using references in scripting API events

This commit is contained in:
Wojtek Figat
2021-06-10 10:26:57 +02:00
parent 05d095b35e
commit 9fd62cf9aa
2 changed files with 21 additions and 6 deletions

View File

@@ -583,8 +583,9 @@ namespace Flax.Build.Bindings
var useCustomDelegateSignature = false;
for (var i = 0; i < paramsCount; i++)
{
var result = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo);
if (result[result.Length - 1] == '*')
var paramType = eventInfo.Type.GenericArgs[i];
var result = GenerateCSharpNativeToManaged(buildData, paramType, classInfo);
if ((paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) || result[result.Length - 1] == '*')
useCustomDelegateSignature = true;
CppParamsWrappersCache[i] = result;
}
@@ -596,8 +597,11 @@ namespace Flax.Build.Bindings
contents.Append(indent).Append("public delegate void ").Append(eventInfo.Name).Append("Delegate(");
for (var i = 0; i < paramsCount; i++)
{
var paramType = eventInfo.Type.GenericArgs[i];
if (i != 0)
contents.Append(", ");
if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo))
contents.Append("ref ");
contents.Append(CppParamsWrappersCache[i]).Append(" arg").Append(i);
}
contents.Append(");").AppendLine().AppendLine();
@@ -668,9 +672,12 @@ namespace Flax.Build.Bindings
contents.Append($"void Internal_{eventInfo.Name}_Invoke(");
for (var i = 0; i < paramsCount; i++)
{
var paramType = eventInfo.Type.GenericArgs[i];
if (i != 0)
contents.Append(", ");
contents.Append(CppParamsWrappersCache[i]);
if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo))
contents.Append("*");
contents.Append(" arg").Append(i);
}
contents.Append(')').AppendLine();
@@ -679,8 +686,11 @@ namespace Flax.Build.Bindings
contents.Append('(');
for (var i = 0; i < paramsCount; i++)
{
var paramType = eventInfo.Type.GenericArgs[i];
if (i != 0)
contents.Append(", ");
if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo))
contents.Append("ref *");
contents.Append("arg").Append(i);
}
contents.Append(");").AppendLine();

View File

@@ -73,7 +73,7 @@ namespace Flax.Build.Bindings
return sb.ToString();
}
private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller)
private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller, bool isOut)
{
var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out var managedTypeAsNative, null);
string result;
@@ -96,7 +96,12 @@ namespace Flax.Build.Bindings
else
{
result = paramName;
if (paramType.IsPtr || managedTypeAsNative[managedTypeAsNative.Length - 1] == '*')
if (paramType.IsRef && !paramType.IsConst && !isOut)
{
// Pass reference as a pointer
result = '&' + result;
}
else if (paramType.IsPtr || managedTypeAsNative[managedTypeAsNative.Length - 1] == '*')
{
// Pass pointer value
}
@@ -1038,7 +1043,7 @@ namespace Flax.Build.Bindings
for (var i = 0; i < functionInfo.Parameters.Count; i++)
{
var parameterInfo = functionInfo.Parameters[i];
var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, parameterInfo.Type, parameterInfo.Name, classInfo);
var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, parameterInfo.Type, parameterInfo.Name, classInfo, parameterInfo.IsOut);
contents.Append($" params[{i}] = {paramValue};").AppendLine();
}
@@ -1295,7 +1300,7 @@ namespace Flax.Build.Bindings
{
var paramType = eventInfo.Type.GenericArgs[i];
var paramName = "arg" + i;
var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, paramType, paramName, classInfo);
var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, paramType, paramName, classInfo, false);
contents.Append($" params[{i}] = {paramValue};").AppendLine();
}
if (eventInfo.IsStatic)