g_assert(info);
for (guint32 i = 0; i < info->num_fields; ++i) {
if (MONO_TYPE_ISSTRUCT (info->fields [i].field->type)) {
- collect_field_info_nested (mono_class_from_mono_type_internal (info->fields [i].field->type), fields_array, info->fields [i].offset, pinvoke, unicode);
+ collect_field_info_nested (mono_class_from_mono_type_internal (info->fields [i].field->type), fields_array, (offset + info->fields [i].offset), pinvoke, unicode);
} else {
guint32 align;
StructFieldInfo f;
info->fields [i].mspec,
&align, TRUE, unicode);
f.offset = offset + info->fields [i].offset;
- if (i == info->num_fields - 1 && f.size + f.offset < info->native_size) {
+ if ((i == info->num_fields - 1) && ((f.size + f.offset) < info->native_size)) {
/* This can happen with .pack directives eg. 'fixed' arrays */
if (MONO_TYPE_IS_PRIMITIVE (f.type)) {
/* Replicate the last field to fill out the remaining place, since the code in add_valuetype () needs type information */
--- /dev/null
+// 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.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
+using System.Text;
+
+public unsafe partial struct GameControllerButtonBind
+{
+ public GameControllerButtonBind
+ (
+ GameControllerBindType? bindType = null,
+ GameControllerButtonBindValue? value = null
+ ) : this()
+ {
+ if (bindType is not null)
+ {
+ BindType = bindType.Value;
+ }
+
+ if (value is not null)
+ {
+ Value = value.Value;
+ }
+ }
+
+ public GameControllerBindType BindType;
+
+ public GameControllerButtonBindValue Value;
+}
+
+public enum GameControllerBindType : int
+{
+ ControllerBindtypeNone = 0x0,
+ ControllerBindtypeButton = 0x1,
+ ControllerBindtypeAxis = 0x2,
+ ControllerBindtypeHat = 0x3,
+ None = 0x0,
+ Button = 0x1,
+ Axis = 0x2,
+ Hat = 0x3,
+}
+
+[StructLayout(LayoutKind.Explicit)]
+public unsafe partial struct GameControllerButtonBindValue
+{
+ [FieldOffset(0)]
+ public int Button;
+
+ [FieldOffset(0)]
+ public int Axis;
+
+ [FieldOffset(0)]
+ public GameControllerButtonBindValueHat Hat;
+}
+
+public unsafe partial struct GameControllerButtonBindValueHat
+{
+ public int Hat;
+
+ public int HatMask;
+}
{
return { lhs.i + rhs.i, lhs.l + rhs.l };
}
+
+extern "C" DLL_EXPORT SDL_GameControllerBindType STDMETHODCALLTYPE getBindType(SDL_GameControllerButtonBind button)
+{
+ return button.bindType;
+}
int32_t i;
long l;
};
+
+typedef enum
+{
+ SDL_CONTROLLER_BINDTYPE_NONE = 0,
+ SDL_CONTROLLER_BINDTYPE_BUTTON,
+ SDL_CONTROLLER_BINDTYPE_AXIS,
+ SDL_CONTROLLER_BINDTYPE_HAT
+} SDL_GameControllerBindType;
+
+typedef struct SDL_GameControllerButtonBind
+{
+ SDL_GameControllerBindType bindType;
+ union
+ {
+ int button;
+ int axis;
+ struct {
+ int hat;
+ int hat_mask;
+ } hat;
+ } value;
+
+} SDL_GameControllerButtonBind;
--- /dev/null
+// 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.Runtime.InteropServices;
+using Xunit;
+
+public class Managed
+{
+ [DllImport("MarshalStructAsParam")]
+ static extern GameControllerBindType getBindType (GameControllerButtonBind button);
+
+ public static int Main()
+ {
+ GameControllerButtonBind button = new GameControllerButtonBind(GameControllerBindType.ControllerBindtypeAxis, null);
+ if (getBindType(button) == GameControllerBindType.ControllerBindtypeAxis)
+ {
+ Console.WriteLine("\nTEST PASSED!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("\nTEST FAILED!");
+ return 1;
+ }
+ }
+}
--- /dev/null
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <OutputType>exe</OutputType>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="NestedStruct.cs" />
+ <Compile Include="GameControllerButtonBind.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="$(TestSourceDir)Common/CoreCLRTestLibrary/CoreCLRTestLibrary.csproj" />
+ <CMakeProjectReference Include="CMakeLists.txt" />
+ </ItemGroup>
+</Project>
<ExcludeList Include="$(XunitTestBinBase)/Interop/PInvoke/SetLastError/**">
<Issue>https://github.com/dotnet/runtime/issues/64127</Issue>
</ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)/Interop/StructMarshalling/PInvoke/NestedStruct/**">
+ <Issue>https://github.com/dotnet/runtime/issues/64127</Issue>
+ </ExcludeList>
<ExcludeList Include = "$(XunitTestBinBase)/Interop/SuppressGCTransition/SuppressGCTransitionTest/**">
<Issue>https://github.com/dotnet/runtime/issues/64127</Issue>
</ExcludeList>
<ExcludeList Include = "$(XunitTestBinBase)/Loader/classloader/StaticVirtualMethods/GenericContext/**">
<Issue>https://github.com/dotnet/runtime/issues/67359</Issue>
</ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)/Interop/StructMarshalling/PInvoke/NestedStruct/**">
+ <Issue>https://github.com/dotnet/runtime/issues/91388</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)/Interop/NativeLibrary/MainProgramHandle/MainProgramHandleTests/**">
+ <Issue>https://github.com/dotnet/runtime/issues/91388</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)/Interop/DllImportSearchPaths/DllImportSearchPathsTest/**">
+ <Issue>https://github.com/dotnet/runtime/issues/91388</Issue>
+ </ExcludeList>
</ItemGroup>
<ItemGroup Condition="'$(TargetOS)' == 'android' And '$(TargetArchitecture)' == 'arm64'">