Add support for using pointers in scripting API events

This commit is contained in:
Wojtek Figat
2021-06-09 17:15:32 +02:00
parent 5a710ccd7a
commit 05d095b35e
3 changed files with 66 additions and 26 deletions

View File

@@ -225,8 +225,7 @@ namespace Flax.Build.Bindings
if (apiType.IsScriptingObject)
return typeInfo.Type.Replace("::", ".");
if (typeInfo.IsPtr && (apiType is LangType || apiType.IsPod))
if (typeInfo.IsPtr && apiType.IsPod)
return typeInfo.Type.Replace("::", ".") + '*';
}
@@ -581,6 +580,46 @@ namespace Flax.Build.Bindings
contents.AppendLine();
var useCustomDelegateSignature = false;
for (var i = 0; i < paramsCount; i++)
{
var result = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo);
if (result[result.Length - 1] == '*')
useCustomDelegateSignature = true;
CppParamsWrappersCache[i] = result;
}
string eventSignature;
if (useCustomDelegateSignature)
{
contents.Append(indent).Append($"/// <summary>The delegate for event {eventInfo.Name}.</summary>").AppendLine();
contents.Append(indent).Append("public delegate void ").Append(eventInfo.Name).Append("Delegate(");
for (var i = 0; i < paramsCount; i++)
{
if (i != 0)
contents.Append(", ");
contents.Append(CppParamsWrappersCache[i]).Append(" arg").Append(i);
}
contents.Append(");").AppendLine().AppendLine();
eventSignature = "event " + eventInfo.Name + "Delegate";
}
else
{
eventSignature = "event Action";
if (paramsCount != 0)
{
eventSignature += '<';
for (var i = 0; i < paramsCount; i++)
{
if (i != 0)
eventSignature += ", ";
CppParamsWrappersCache[i] = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo);
eventSignature += CppParamsWrappersCache[i];
}
eventSignature += '>';
}
}
foreach (var comment in eventInfo.Comment)
{
if (comment.Contains("/// <returns>"))
@@ -598,19 +637,6 @@ namespace Flax.Build.Bindings
contents.Append("private ");
if (eventInfo.IsStatic)
contents.Append("static ");
string eventSignature = "event Action";
if (paramsCount != 0)
{
eventSignature += '<';
for (var i = 0; i < paramsCount; i++)
{
if (i != 0)
eventSignature += ", ";
CppParamsWrappersCache[i] = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo);
eventSignature += CppParamsWrappersCache[i];
}
eventSignature += '>';
}
contents.Append(eventSignature);
contents.Append(' ').AppendLine(eventInfo.Name);
contents.Append(indent).Append('{').AppendLine();

View File

@@ -75,24 +75,38 @@ namespace Flax.Build.Bindings
private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller)
{
var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out _, null);
var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out var managedTypeAsNative, null);
string result;
if (!string.IsNullOrEmpty(nativeToManaged))
nativeToManaged = string.Format(nativeToManaged, paramName);
else
nativeToManaged = paramName;
if ((!paramType.IsPtr && paramType.Type != "StringView" && paramType.Type != "StringAnsiView") || paramType.IsPod(buildData, caller))
{
if (nativeToManaged == paramName)
result = string.Format(nativeToManaged, paramName);
if (managedTypeAsNative[managedTypeAsNative.Length - 1] == '*')
{
nativeToManaged = '&' + nativeToManaged;
// Pass pointer value
}
else
{
contents.Append($" auto __param{paramName} = {nativeToManaged};").AppendLine();
nativeToManaged = $"&__param{paramName}";
// Pass as pointer to local variable converted for managed runtime
if (paramType.IsPtr)
result = string.Format(nativeToManaged, '*' + paramName);
contents.Append($" auto __param_{paramName} = {result};").AppendLine();
result = $"&__param_{paramName}";
}
}
return $"(void*){nativeToManaged}";
else
{
result = paramName;
if (paramType.IsPtr || managedTypeAsNative[managedTypeAsNative.Length - 1] == '*')
{
// Pass pointer value
}
else
{
// Pass as pointer to value
result = '&' + result;
}
}
return $"(void*){result}";
}
public static string GenerateCppWrapperNativeToVariant(BuildData buildData, TypeInfo typeInfo, ApiTypeInfo caller, string value)

View File

@@ -44,7 +44,7 @@ namespace Flax.Build.Bindings
return true;
// Hardcoded cases
if (Type == "String" || Type == "Array")
if (Type == "String" || Type == "Array" || Type == "StringView" || Type == "StringAnsi" || Type == "StringAnsiView")
return false;
// Fallback to default