Add support for using references in scripting API events
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user