From 5a0eb6e93c622fd140fafb2eb401c9c7d44cb2e3 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Wed, 26 Jun 2024 16:47:24 -0400 Subject: [PATCH] [mono] Use correct cast_class for IntPtr[] (#103841) 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 +++------- .../classloader/Casting/Normalization.cs | 20 +++++++++++++++++++ .../classloader/Casting/Normalization.csproj | 5 +++++ 3 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 src/tests/Loader/classloader/Casting/Normalization.cs create mode 100644 src/tests/Loader/classloader/Casting/Normalization.csproj 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: diff --git a/src/tests/Loader/classloader/Casting/Normalization.cs b/src/tests/Loader/classloader/Casting/Normalization.cs new file mode 100644 index 0000000000000..0ab384b3aa50c --- /dev/null +++ b/src/tests/Loader/classloader/Casting/Normalization.cs @@ -0,0 +1,20 @@ +// 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 static void IntPtrArrayNormalization() + { + object x0 = new long[1]; + object x1 = new ulong[1]; + + Assert.False(x0 is IntPtr[]); + Assert.False(x1 is IntPtr[]); + } +} diff --git a/src/tests/Loader/classloader/Casting/Normalization.csproj b/src/tests/Loader/classloader/Casting/Normalization.csproj new file mode 100644 index 0000000000000..54c9089f296b1 --- /dev/null +++ b/src/tests/Loader/classloader/Casting/Normalization.csproj @@ -0,0 +1,5 @@ + + + + +