Skip to content

Commit

Permalink
Add specification of discriminant values for the PinObjectMarshaller (#…
Browse files Browse the repository at this point in the history
…1549)

* Add specification of discriminant values for the PinObjectMarshaller

* Helps if I remove the debug code
  • Loading branch information
Perksey authored Jul 1, 2023
1 parent a4c1b84 commit 0a8693e
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 22 deletions.
8 changes: 8 additions & 0 deletions src/Core/Silk.NET.Core/Native/PinObjectAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,15 @@ public PinObjectAttribute(PinMode mode = PinMode.Persist)
{
Mode = mode;
}

// This is a separate constructor so we can always assume that the second argument is this discriminants.
public PinObjectAttribute(PinMode mode, string[] discriminants)
{
Mode = mode;
Discriminants = discriminants;
}

public PinMode Mode { get; }
public string[] Discriminants { get; } = Array.Empty<string>();
}
}
91 changes: 85 additions & 6 deletions src/Core/Silk.NET.SilkTouch/Middlewares/PinObjectMarshaller.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
// Licensed to the .NET Foundation under one or more agreements.
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace Silk.NET.SilkTouch
Expand All @@ -18,10 +20,34 @@ public static void PinObjectMarshaller(ref IMarshalContext ctx, Action next)

var gcSlot = ctx.AllocateGcSlot();
PinMode pinMode;
if (data.ConstructorArguments.Length < 1)
string[] discriminantExprs;
if (data is null || data.ConstructorArguments.Length < 1)
{
pinMode = PinMode.Persist;
}
else
{
pinMode = (PinMode) (data.ConstructorArguments[0].Value ?? PinMode.Persist);
}

if (data is null ||
data.ConstructorArguments.Length < 2 ||
data.ConstructorArguments[1].Values.Length == 0)
{
discriminantExprs = Array.Empty<string>();
}
else
{
discriminantExprs = data.ConstructorArguments[1]
.Values
.Select(x => x.Value as string)
.Where(x => x is not null)
.ToArray()!;
}

var slotSyntax = discriminantExprs.Length == 0
? LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(gcSlot))
: MixDiscriminants(gcSlot, discriminantExprs);

var name = pinMode switch
{
Expand All @@ -46,8 +72,7 @@ public static void PinObjectMarshaller(ref IMarshalContext ctx, Action next)
new[]
{
Argument(parameterVariable.Value),
Argument
(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(gcSlot)))
Argument(slotSyntax)
}
)
)
Expand All @@ -64,10 +89,32 @@ public static void PinObjectMarshaller(ref IMarshalContext ctx, Action next)
var gcSlot = ctx.AllocateGcSlot();

PinMode pinMode;
string[] discriminantExprs;
if (resultData.ConstructorArguments.Length < 1)
{
pinMode = PinMode.Persist;
}
else
{
pinMode = (PinMode) (resultData.ConstructorArguments[0].Value ?? PinMode.Persist);
}

if (resultData.ConstructorArguments.Length < 2 || resultData.ConstructorArguments[1].Values.Length == 0)
{
discriminantExprs = Array.Empty<string>();
}
else
{
discriminantExprs = resultData.ConstructorArguments[1]
.Values
.Select(x => x.Value as string)
.Where(x => x is not null)
.ToArray()!;
}

var slotSyntax = discriminantExprs.Length == 0
? LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(gcSlot))
: MixDiscriminants(gcSlot, discriminantExprs);

var name = pinMode switch
{
Expand All @@ -92,15 +139,47 @@ public static void PinObjectMarshaller(ref IMarshalContext ctx, Action next)
new[]
{
Argument(resultVariable.Value),
Argument
(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(gcSlot)))
Argument(slotSyntax)
}
)
)
)
)
);
}

static ExpressionSyntax MixDiscriminants(int slot, string[] discriminants) => InvocationExpression
(
MemberAccessExpression
(
SyntaxKind.SimpleMemberAccessExpression,
MemberAccessExpression
(
SyntaxKind.SimpleMemberAccessExpression,
AliasQualifiedName
(
IdentifierName
(
Token(SyntaxKind.GlobalKeyword)
),
IdentifierName("System")
),
IdentifierName("HashCode")
),
IdentifierName("Combine")
),
ArgumentList
(
SeparatedList
(
Enumerable.Repeat
(
Argument(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(slot))),
1
).Concat(discriminants.Select(x => Argument(ParseExpression(x))))
)
)
);
}
}

Expand Down
32 changes: 16 additions & 16 deletions src/Windowing/Silk.NET.GLFW/Glfw.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2631,7 +2631,7 @@ public unsafe partial WindowHandle* CreateWindow
public unsafe partial GlfwCallbacks.CharCallback SetCharCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.CharCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.CharCallback callback
);

/// <summary>
Expand Down Expand Up @@ -2667,7 +2667,7 @@ public unsafe partial GlfwCallbacks.CharCallback SetCharCallback
public unsafe partial GlfwCallbacks.CharModsCallback SetCharModsCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.CharModsCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.CharModsCallback callback
);

/// <summary>
Expand All @@ -2692,7 +2692,7 @@ public unsafe partial GlfwCallbacks.CharModsCallback SetCharModsCallback
public unsafe partial GlfwCallbacks.CursorEnterCallback SetCursorEnterCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.CursorEnterCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.CursorEnterCallback callback
);

/// <summary>
Expand Down Expand Up @@ -2721,7 +2721,7 @@ public unsafe partial GlfwCallbacks.CursorEnterCallback SetCursorEnterCallback
public unsafe partial GlfwCallbacks.CursorPosCallback SetCursorPosCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.CursorPosCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.CursorPosCallback callback
);

/// <summary>
Expand Down Expand Up @@ -2751,7 +2751,7 @@ public unsafe partial GlfwCallbacks.CursorPosCallback SetCursorPosCallback
public unsafe partial GlfwCallbacks.DropCallback SetDropCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.DropCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.DropCallback callback
);

/// <summary>
Expand Down Expand Up @@ -2947,7 +2947,7 @@ public partial GlfwCallbacks.JoystickCallback SetJoystickCallback
public unsafe partial GlfwCallbacks.KeyCallback SetKeyCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.KeyCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.KeyCallback callback
);

/// <summary>
Expand Down Expand Up @@ -2975,7 +2975,7 @@ public unsafe partial GlfwCallbacks.KeyCallback SetKeyCallback
public unsafe partial GlfwCallbacks.ScrollCallback SetScrollCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.ScrollCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.ScrollCallback callback
);

/// <summary>
Expand Down Expand Up @@ -3028,7 +3028,7 @@ public partial GlfwCallbacks.MonitorCallback SetMonitorCallback
public unsafe partial GlfwCallbacks.MouseButtonCallback SetMouseButtonCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.MouseButtonCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.MouseButtonCallback callback
);

/// <summary>
Expand Down Expand Up @@ -3064,7 +3064,7 @@ public unsafe partial GlfwCallbacks.MouseButtonCallback SetMouseButtonCallback
public unsafe partial GlfwCallbacks.WindowCloseCallback SetWindowCloseCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.WindowCloseCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.WindowCloseCallback callback
);

/// <summary>
Expand Down Expand Up @@ -3094,7 +3094,7 @@ public unsafe partial GlfwCallbacks.WindowCloseCallback SetWindowCloseCallback
public unsafe partial GlfwCallbacks.WindowFocusCallback SetWindowFocusCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.WindowFocusCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.WindowFocusCallback callback
);

/// <summary>
Expand Down Expand Up @@ -3152,7 +3152,7 @@ public unsafe partial GlfwCallbacks.WindowFocusCallback SetWindowFocusCallback
public unsafe partial GlfwCallbacks.WindowIconifyCallback SetWindowIconifyCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.WindowIconifyCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.WindowIconifyCallback callback
);

/// <summary>
Expand All @@ -3177,7 +3177,7 @@ public unsafe partial GlfwCallbacks.WindowIconifyCallback SetWindowIconifyCallba
public unsafe partial GlfwCallbacks.WindowMaximizeCallback SetWindowMaximizeCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.WindowMaximizeCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.WindowMaximizeCallback callback
);

/// <summary>
Expand Down Expand Up @@ -3277,7 +3277,7 @@ public unsafe partial GlfwCallbacks.WindowMaximizeCallback SetWindowMaximizeCall
public unsafe partial GlfwCallbacks.WindowSizeCallback SetWindowSizeCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.WindowSizeCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.WindowSizeCallback callback
);

/// <summary>
Expand All @@ -3301,7 +3301,7 @@ public unsafe partial GlfwCallbacks.WindowSizeCallback SetWindowSizeCallback
public unsafe partial GlfwCallbacks.FramebufferSizeCallback SetFramebufferSizeCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.FramebufferSizeCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.FramebufferSizeCallback callback
);

/// <summary>
Expand Down Expand Up @@ -3433,7 +3433,7 @@ int refreshRate
public unsafe partial GlfwCallbacks.WindowPosCallback SetWindowPosCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.WindowPosCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.WindowPosCallback callback
);

/// <summary>
Expand Down Expand Up @@ -3467,7 +3467,7 @@ public unsafe partial GlfwCallbacks.WindowPosCallback SetWindowPosCallback
public unsafe partial GlfwCallbacks.WindowRefreshCallback SetWindowRefreshCallback
(
WindowHandle* window,
[PinObject(PinMode.UntilNextCall)] GlfwCallbacks.WindowRefreshCallback callback
[PinObject(PinMode.UntilNextCall, new []{"(nint)window"})] GlfwCallbacks.WindowRefreshCallback callback
);

/// <summary>
Expand Down

0 comments on commit 0a8693e

Please sign in to comment.