From 8d3cbd0363bb1bc07d9dc4b7ba7b5270f3807eb3 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Fri, 21 Jun 2024 17:43:28 -0400 Subject: [PATCH 1/6] [mono] Use correct cast_class for IntPtr[] This change fixes the behavior to be like modern .NET instead of .NET Framework. Fixes https://github.com/dotnet/runtime/issues/97145 --- src/mono/mono/metadata/class-init.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/mono/mono/metadata/class-init.c b/src/mono/mono/metadata/class-init.c index 8608dc30bfc63..0f5643e663f0f 100644 --- a/src/mono/mono/metadata/class-init.c +++ b/src/mono/mono/metadata/class-init.c @@ -1039,18 +1039,14 @@ class_composite_fixup_cast_class (MonoClass *klass, gboolean for_ptr) case MONO_TYPE_U2: klass->cast_class = mono_defaults.int16_class; break; - case MONO_TYPE_U4: -#if TARGET_SIZEOF_VOID_P == 4 case MONO_TYPE_I: case MONO_TYPE_U: -#endif + klass->cast_class = mono_defaults.int_class; + break; + case MONO_TYPE_U4: klass->cast_class = mono_defaults.int32_class; break; case MONO_TYPE_U8: -#if TARGET_SIZEOF_VOID_P == 8 - case MONO_TYPE_I: - case MONO_TYPE_U: -#endif klass->cast_class = mono_defaults.int64_class; break; default: From 0cb529d838d3c1c44ae47f9494495d701779dc21 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Tue, 25 Jun 2024 11:21:46 -0400 Subject: [PATCH 2/6] Add test --- .../classloader/Casting/Normalization.cs | 19 +++++++++++++++++++ .../classloader/Casting/Normalization.csproj | 8 ++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/tests/Loader/classloader/Casting/Normalization.cs create mode 100644 src/tests/Loader/classloader/Casting/Normalization.csproj diff --git a/src/tests/Loader/classloader/Casting/Normalization.cs b/src/tests/Loader/classloader/Casting/Normalization.cs new file mode 100644 index 0000000000000..c4c4a5b7f51d1 --- /dev/null +++ b/src/tests/Loader/classloader/Casting/Normalization.cs @@ -0,0 +1,19 @@ +/ 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 NormalizationTests +{ + [Fact] + public void IntPtrArrayNormalization() + { + object x0 = new long[1]; + object x1 = new ulong[1]; + + Assert.False(x is IntPtr[]); + Assert.False(x1 is IntPtr[]); + } \ No newline at end of file diff --git a/src/tests/Loader/classloader/Casting/Normalization.csproj b/src/tests/Loader/classloader/Casting/Normalization.csproj new file mode 100644 index 0000000000000..1254d94d42c89 --- /dev/null +++ b/src/tests/Loader/classloader/Casting/Normalization.csproj @@ -0,0 +1,8 @@ + + + true + + + + + \ No newline at end of file From 45323c5904ec04c7d92c603471c2e51e326885ed Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Tue, 25 Jun 2024 12:33:09 -0400 Subject: [PATCH 3/6] Fix hasty stuff --- src/tests/Loader/classloader/Casting/Normalization.cs | 2 +- src/tests/Loader/classloader/Casting/Normalization.csproj | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/tests/Loader/classloader/Casting/Normalization.cs b/src/tests/Loader/classloader/Casting/Normalization.cs index c4c4a5b7f51d1..eb2cf52b6542d 100644 --- a/src/tests/Loader/classloader/Casting/Normalization.cs +++ b/src/tests/Loader/classloader/Casting/Normalization.cs @@ -1,4 +1,4 @@ -/ 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; diff --git a/src/tests/Loader/classloader/Casting/Normalization.csproj b/src/tests/Loader/classloader/Casting/Normalization.csproj index 1254d94d42c89..54c9089f296b1 100644 --- a/src/tests/Loader/classloader/Casting/Normalization.csproj +++ b/src/tests/Loader/classloader/Casting/Normalization.csproj @@ -1,8 +1,5 @@ - - true - - \ No newline at end of file + From ae4a5e9e4c7a94c47eb61d93fde03046f7ce13c4 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Tue, 25 Jun 2024 16:38:31 -0400 Subject: [PATCH 4/6] Losing it a bit ;-) --- src/tests/Loader/classloader/Casting/Normalization.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tests/Loader/classloader/Casting/Normalization.cs b/src/tests/Loader/classloader/Casting/Normalization.cs index eb2cf52b6542d..dff231d01df3e 100644 --- a/src/tests/Loader/classloader/Casting/Normalization.cs +++ b/src/tests/Loader/classloader/Casting/Normalization.cs @@ -16,4 +16,5 @@ public void IntPtrArrayNormalization() Assert.False(x is IntPtr[]); Assert.False(x1 is IntPtr[]); - } \ No newline at end of file + } +} From ea60e341c88d79841eca2f62719162bee39bda99 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Tue, 25 Jun 2024 18:04:02 -0400 Subject: [PATCH 5/6] it's x0 instead of x --- src/tests/Loader/classloader/Casting/Normalization.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/Loader/classloader/Casting/Normalization.cs b/src/tests/Loader/classloader/Casting/Normalization.cs index dff231d01df3e..faecbc9ee6a43 100644 --- a/src/tests/Loader/classloader/Casting/Normalization.cs +++ b/src/tests/Loader/classloader/Casting/Normalization.cs @@ -14,7 +14,7 @@ public void IntPtrArrayNormalization() object x0 = new long[1]; object x1 = new ulong[1]; - Assert.False(x is IntPtr[]); + Assert.False(x0 is IntPtr[]); Assert.False(x1 is IntPtr[]); } } From 4facff1ddec2671652a36aeed587aa07e5aac2b5 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Tue, 25 Jun 2024 22:17:57 -0400 Subject: [PATCH 6/6] I guess test methods need to be static --- src/tests/Loader/classloader/Casting/Normalization.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/Loader/classloader/Casting/Normalization.cs b/src/tests/Loader/classloader/Casting/Normalization.cs index faecbc9ee6a43..0ab384b3aa50c 100644 --- a/src/tests/Loader/classloader/Casting/Normalization.cs +++ b/src/tests/Loader/classloader/Casting/Normalization.cs @@ -9,7 +9,7 @@ public class NormalizationTests { [Fact] - public void IntPtrArrayNormalization() + public static void IntPtrArrayNormalization() { object x0 = new long[1]; object x1 = new ulong[1];