diff --git a/eng/pipelines/coreclr/templates/run-performance-job.yml b/eng/pipelines/coreclr/templates/run-performance-job.yml
index 3e367d0e4a9948..344bfe78bdcf4a 100644
--- a/eng/pipelines/coreclr/templates/run-performance-job.yml
+++ b/eng/pipelines/coreclr/templates/run-performance-job.yml
@@ -73,7 +73,7 @@ jobs:
$HELIX_WORKITEM_PAYLOAD/bin/jsvu --os=linux64 --engines=v8,javascriptcore
- ${{ if ne(parameters.runtimeType, 'wasm') }}:
- HelixPreCommandsWasmOnLinux: echo
- - HelixPreCommandStemWindows: 'set ORIGPYPATH=%PYTHONPATH%;py -m pip install -U pip;py -3 -m venv %HELIX_WORKITEM_PAYLOAD%\.venv;call %HELIX_WORKITEM_PAYLOAD%\.venv\Scripts\activate.bat;set PYTHONPATH=;py -3 -m pip install -U pip;py -3 -m pip install azure.storage.blob==12.0.0;py -3 -m pip install azure.storage.queue==12.0.0;set "PERFLAB_UPLOAD_TOKEN=$(HelixPerfUploadTokenValue)"'
+ - HelixPreCommandStemWindows: 'set ORIGPYPATH=%PYTHONPATH%;py -m pip install -U pip;py -3 -m venv %HELIX_WORKITEM_PAYLOAD%\.venv;call %HELIX_WORKITEM_PAYLOAD%\.venv\Scripts\activate.bat;set PYTHONPATH=;py -3 -m pip install -U pip;py -3 -m pip install urllib3==1.26.15;py -3 -m pip install azure.storage.blob==12.0.0;py -3 -m pip install azure.storage.queue==12.0.0;set "PERFLAB_UPLOAD_TOKEN=$(HelixPerfUploadTokenValue)"'
- HelixPreCommandStemLinux: >-
export ORIGPYPATH=$PYTHONPATH
export CRYPTOGRAPHY_ALLOW_OPENSSL_102=true;
@@ -84,6 +84,7 @@ jobs:
ls -l $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate &&
export PYTHONPATH= &&
python3 -m pip install --user -U pip &&
+ pip3 install urllib3==1.26.15 &&
pip3 install --user azure.storage.blob==12.0.0 &&
pip3 install --user azure.storage.queue==12.0.0 &&
sudo apt-get update &&
@@ -93,7 +94,7 @@ jobs:
export PERFLAB_UPLOAD_TOKEN="$(HelixPerfUploadTokenValue)"
|| export PERF_PREREQS_INSTALL_FAILED=1;
test "x$PERF_PREREQS_INSTALL_FAILED" = "x1" && echo "** Error: Failed to install prerequites **"
- - HelixPreCommandStemMusl: 'export ORIGPYPATH=$PYTHONPATH;sudo apk add icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib cargo;sudo apk add libgdiplus --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing; python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install azure.storage.blob==12.7.1;pip3 install azure.storage.queue==12.1.5;export PERFLAB_UPLOAD_TOKEN="$(HelixPerfUploadTokenValue)"'
+ - HelixPreCommandStemMusl: 'export ORIGPYPATH=$PYTHONPATH;sudo apk add icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib cargo;sudo apk add libgdiplus --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing; python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install urllib3==1.26.15;pip3 install azure.storage.blob==12.7.1;pip3 install azure.storage.queue==12.1.5;export PERFLAB_UPLOAD_TOKEN="$(HelixPerfUploadTokenValue)"'
- ExtraMSBuildLogsWindows: 'set MSBUILDDEBUGCOMM=1;set "MSBUILDDEBUGPATH=%HELIX_WORKITEM_UPLOAD_ROOT%"'
- ExtraMSBuildLogsLinux: 'export MSBUILDDEBUGCOMM=1;export "MSBUILDDEBUGPATH=$HELIX_WORKITEM_UPLOAD_ROOT"'
- HelixPreCommand: ''
diff --git a/eng/pipelines/coreclr/templates/run-scenarios-job.yml b/eng/pipelines/coreclr/templates/run-scenarios-job.yml
index 6f32502a94e3a7..f68bdedd85e61f 100644
--- a/eng/pipelines/coreclr/templates/run-scenarios-job.yml
+++ b/eng/pipelines/coreclr/templates/run-scenarios-job.yml
@@ -63,16 +63,16 @@ jobs:
- SharedHelixPreCommands: 'chmod +x $HELIX_WORKITEM_PAYLOAD/machine-setup.sh;. $HELIX_WORKITEM_PAYLOAD/machine-setup.sh;export PYTHONPATH=$HELIX_WORKITEM_PAYLOAD/scripts:$HELIX_WORKITEM_PAYLOAD'
- ${{ if eq(parameters.osGroup, 'windows') }}:
- - HelixPreCommandWindows: 'set ORIGPYPATH=%PYTHONPATH%;py -3 -m venv %HELIX_WORKITEM_PAYLOAD%\.venv;call %HELIX_WORKITEM_PAYLOAD%\.venv\Scripts\activate.bat;set PYTHONPATH=;py -3 -m pip install -U pip;py -3 -m pip install --user azure.storage.blob==12.0.0 --force-reinstall;py -3 -m pip install --user azure.storage.queue==12.0.0 --force-reinstall;set "PERFLAB_UPLOAD_TOKEN=$(PerfCommandUploadToken)"'
+ - HelixPreCommandWindows: 'set ORIGPYPATH=%PYTHONPATH%;py -3 -m venv %HELIX_WORKITEM_PAYLOAD%\.venv;call %HELIX_WORKITEM_PAYLOAD%\.venv\Scripts\activate.bat;set PYTHONPATH=;py -3 -m pip install -U pip;py -3 -m pip install --user azure.storage.blob==12.0.0;py -3 -m pip install --user azure.storage.queue==12.0.0;py -3 -m pip install --user urllib3==1.26.15;set "PERFLAB_UPLOAD_TOKEN=$(PerfCommandUploadToken)"'
- HelixPostCommandsWindows: 'set PYTHONPATH=%ORIGPYPATH%'
- ${{ if and(ne(parameters.osGroup, 'windows'), ne(parameters.osGroup, 'OSX'), ne(parameters.osSubGroup, '_musl')) }}:
- - HelixPreCommandLinux: 'export ORIGPYPATH=$PYTHONPATH;export CRYPTOGRAPHY_ALLOW_OPENSSL_102=true;sudo apt-get -y install python3-venv;python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install --user azure.storage.blob==12.0.0 --force-reinstall;pip3 install --user azure.storage.queue==12.0.0 --force-reinstall;export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"'
+ - HelixPreCommandLinux: 'export ORIGPYPATH=$PYTHONPATH;export CRYPTOGRAPHY_ALLOW_OPENSSL_102=true;sudo apt-get -y install python3-venv;python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install --user azure.storage.blob==12.0.0;pip3 install --user azure.storage.queue==12.0.0;pip3 install --user urllib3==1.26.15;export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"'
- HelixPostCommandsLinux: 'export PYTHONPATH=$ORIGPYPATH'
- ${{ if and(ne(parameters.osGroup, 'windows'), ne(parameters.osGroup, 'OSX'), eq(parameters.osSubGroup, '_musl')) }}:
- - HelixPreCommandMusl: 'export ORIGPYPATH=$PYTHONPATH;sudo apk add py3-virtualenv;python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install --user azure.storage.blob==12.0.0 --force-reinstall;pip3 install --user azure.storage.queue==12.0.0 --force-reinstall;export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"'
+ - HelixPreCommandMusl: 'export ORIGPYPATH=$PYTHONPATH;sudo apk add py3-virtualenv;python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install --user azure.storage.blob==12.0.0;pip3 install --user azure.storage.queue==12.0.0;pip3 install --user urllib3==1.26.15;export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"'
- HelixPostCommandsMusl: 'export PYTHONPATH=$ORIGPYPATH'
- ${{ if eq(parameters.osGroup, 'OSX') }}:
- - HelixPreCommandOSX: 'export ORIGPYPATH=$PYTHONPATH;export CRYPTOGRAPHY_ALLOW_OPENSSL_102=true;python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install azure.storage.blob==12.0.0 --force-reinstall;pip3 install azure.storage.queue==12.0.0 --force-reinstall;export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"'
+ - HelixPreCommandOSX: 'export ORIGPYPATH=$PYTHONPATH;export CRYPTOGRAPHY_ALLOW_OPENSSL_102=true;python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install azure.storage.blob==12.0.0;pip3 install azure.storage.queue==12.0.0;pip3 install urllib3==1.26.15;export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"'
- HelixPostCommandOSX: 'export PYTHONPATH=$ORIGPYPATH'
# extra private job settings
diff --git a/eng/pipelines/libraries/helix-queues-setup.yml b/eng/pipelines/libraries/helix-queues-setup.yml
index bce2b40f1ae57b..54a2d7280986f4 100644
--- a/eng/pipelines/libraries/helix-queues-setup.yml
+++ b/eng/pipelines/libraries/helix-queues-setup.yml
@@ -114,11 +114,11 @@ jobs:
# iOS devices
- ${{ if in(parameters.platform, 'iOS_arm64') }}:
- # split traffic for runtime-extra-platforms (which mostly runs on rolling builds)
+ # if necessary, you can split traffic between queues this way for PR's and rolling builds
- ${{ if ne(parameters.jobParameters.isExtraPlatforms, true) }}:
- - OSX.1015.Amd64.Iphone.Open
+ - OSX.13.Amd64.Iphone.Open
- ${{ if eq(parameters.jobParameters.isExtraPlatforms, true) }}:
- - OSX.1200.Amd64.Iphone.Open
+ - OSX.13.Amd64.Iphone.Open
# tvOS devices
- ${{ if in(parameters.platform, 'tvOS_arm64') }}:
diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index 1f9015cf8760e4..dbe9fdbb57737e 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -21830,13 +21830,11 @@ GenTree* Compiler::gtNewSimdShuffleNode(var_types type,
if (needsZero)
{
- assert(!compIsaSupportedDebugOnly(InstructionSet_SSSE3));
+ assert((simdSize == 32) || !compIsaSupportedDebugOnly(InstructionSet_SSSE3));
op2 = gtNewVconNode(type, simdBaseJitType);
- op2->AsVecCon()->gtSimd16Val = mskCns.v128[0];
-
- GenTree* zero = gtNewZeroConNode(type, simdBaseJitType);
- retNode = gtNewSimdCndSelNode(type, op2, retNode, zero, simdBaseJitType, simdSize, isSimdAsHWIntrinsic);
+ op2->AsVecCon()->gtSimd32Val = mskCns;
+ retNode = gtNewSimdBinOpNode(GT_AND, type, op2, retNode, simdBaseJitType, simdSize, isSimdAsHWIntrinsic);
}
return retNode;
diff --git a/src/libraries/Microsoft.Extensions.Hosting.WindowsServices/src/Microsoft.Extensions.Hosting.WindowsServices.csproj b/src/libraries/Microsoft.Extensions.Hosting.WindowsServices/src/Microsoft.Extensions.Hosting.WindowsServices.csproj
index 4c8f143107caaa..1b4717c639e8b1 100644
--- a/src/libraries/Microsoft.Extensions.Hosting.WindowsServices/src/Microsoft.Extensions.Hosting.WindowsServices.csproj
+++ b/src/libraries/Microsoft.Extensions.Hosting.WindowsServices/src/Microsoft.Extensions.Hosting.WindowsServices.csproj
@@ -7,7 +7,7 @@
true
.NET hosting infrastructure for Windows Services.
true
- true
+ false
1
diff --git a/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/Microsoft.Extensions.Logging.Abstractions.csproj b/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/Microsoft.Extensions.Logging.Abstractions.csproj
index 0539414bea2b4f..97878e68088c15 100644
--- a/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/Microsoft.Extensions.Logging.Abstractions.csproj
+++ b/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/Microsoft.Extensions.Logging.Abstractions.csproj
@@ -6,7 +6,7 @@
true
true
true
- true
+ false
1
Logging abstractions for Microsoft.Extensions.Logging.
diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj b/src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj
index 67af62b2d7f296..b53d99341eae44 100644
--- a/src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj
+++ b/src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj
@@ -25,7 +25,7 @@
$(AdditionalRuntimeIdentifiers);$(OutputRID)
3
- true
+ false
diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json
index 9d4f4d19cc8702..a87f79674ab61c 100644
--- a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json
+++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json
@@ -4457,6 +4457,74 @@
"any",
"base"
],
+ "debian.12": [
+ "debian.12",
+ "debian",
+ "linux",
+ "unix",
+ "any",
+ "base"
+ ],
+ "debian.12-arm": [
+ "debian.12-arm",
+ "debian.12",
+ "debian-arm",
+ "debian",
+ "linux-arm",
+ "linux",
+ "unix-arm",
+ "unix",
+ "any",
+ "base"
+ ],
+ "debian.12-arm64": [
+ "debian.12-arm64",
+ "debian.12",
+ "debian-arm64",
+ "debian",
+ "linux-arm64",
+ "linux",
+ "unix-arm64",
+ "unix",
+ "any",
+ "base"
+ ],
+ "debian.12-armel": [
+ "debian.12-armel",
+ "debian.12",
+ "debian-armel",
+ "debian",
+ "linux-armel",
+ "linux",
+ "unix-armel",
+ "unix",
+ "any",
+ "base"
+ ],
+ "debian.12-x64": [
+ "debian.12-x64",
+ "debian.12",
+ "debian-x64",
+ "debian",
+ "linux-x64",
+ "linux",
+ "unix-x64",
+ "unix",
+ "any",
+ "base"
+ ],
+ "debian.12-x86": [
+ "debian.12-x86",
+ "debian.12",
+ "debian-x86",
+ "debian",
+ "linux-x86",
+ "linux",
+ "unix-x86",
+ "unix",
+ "any",
+ "base"
+ ],
"debian.8": [
"debian.8",
"debian",
diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json
index 73862a890c233e..21e2222f725860 100644
--- a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json
+++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json
@@ -1244,6 +1244,41 @@
"debian-x86"
]
},
+ "debian.12": {
+ "#import": [
+ "debian"
+ ]
+ },
+ "debian.12-arm": {
+ "#import": [
+ "debian.12",
+ "debian-arm"
+ ]
+ },
+ "debian.12-arm64": {
+ "#import": [
+ "debian.12",
+ "debian-arm64"
+ ]
+ },
+ "debian.12-armel": {
+ "#import": [
+ "debian.12",
+ "debian-armel"
+ ]
+ },
+ "debian.12-x64": {
+ "#import": [
+ "debian.12",
+ "debian-x64"
+ ]
+ },
+ "debian.12-x86": {
+ "#import": [
+ "debian.12",
+ "debian-x86"
+ ]
+ },
"debian.8": {
"#import": [
"debian"
diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props b/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props
index c0d2977412fd35..b2a4b7f07044ee 100644
--- a/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props
+++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props
@@ -69,7 +69,7 @@
linux
x64;x86;arm;armel;arm64
- 8;9;10;11
+ 8;9;10;11;12
false
diff --git a/src/libraries/Microsoft.Windows.Compatibility/src/Microsoft.Windows.Compatibility.csproj b/src/libraries/Microsoft.Windows.Compatibility/src/Microsoft.Windows.Compatibility.csproj
index 3a4b0455680c8d..ead61c8d31e349 100644
--- a/src/libraries/Microsoft.Windows.Compatibility/src/Microsoft.Windows.Compatibility.csproj
+++ b/src/libraries/Microsoft.Windows.Compatibility/src/Microsoft.Windows.Compatibility.csproj
@@ -5,7 +5,7 @@
false
true
- true
+ false
3
$(NoWarn);NU5128
diff --git a/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj b/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj
index b2a3ad1fc3db1d..8abef04772e175 100644
--- a/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj
+++ b/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj
@@ -5,7 +5,7 @@
true
true
- true
+ false
1
annotations
true
diff --git a/src/libraries/System.Globalization/tests/CultureInfo/CultureInfoCtor.cs b/src/libraries/System.Globalization/tests/CultureInfo/CultureInfoCtor.cs
index 773c4331a21f5d..d5c4bc44d29e39 100644
--- a/src/libraries/System.Globalization/tests/CultureInfo/CultureInfoCtor.cs
+++ b/src/libraries/System.Globalization/tests/CultureInfo/CultureInfoCtor.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.DotNet.RemoteExecutor;
using System.Collections.Generic;
using Xunit;
@@ -440,13 +441,62 @@ public void TestCreationWithTemporaryLCID(int lcid)
Assert.NotEqual(lcid, new CultureInfo(lcid).LCID);
}
+ private static bool NotWasmWithIcu => PlatformDetection.IsNotBrowser && PlatformDetection.IsIcuGlobalization;
+
+ [InlineData("zh-TW-u-co-zhuyin", "zh-TW", "zh-TW_zhuyin")]
+ [InlineData("de-DE-u-co-phonebk", "de-DE", "de-DE_phoneboo")]
+ [InlineData("de-DE-u-co-phonebk-u-xx", "de-DE-u-xx", "de-DE-u-xx_phoneboo")]
+ [InlineData("de-DE-u-xx-u-co-phonebk", "de-DE-u-xx-u-co-phonebk", "de-DE-u-xx-u-co-phonebk")]
+ [InlineData("de-DE-t-xx-u-co-phonebk", "de-DE-t-xx-u-co-phonebk", "de-DE-t-xx-u-co-phonebk_phoneboo")]
+ [InlineData("de-DE-u-co-phonebk-t-xx", "de-DE-t-xx", "de-DE-t-xx_phoneboo")]
+ [InlineData("de-DE-u-co-phonebk-t-xx-u-yy", "de-DE-t-xx-u-yy", "de-DE-t-xx-u-yy_phoneboo")]
+ [InlineData("de-DE", "de-DE", "de-DE")]
+ [ConditionalTheory(nameof(NotWasmWithIcu))]
+ public void TestCreationWithMangledSortName(string cultureName, string expectedCultureName, string expectedSortName)
+ {
+ CultureInfo ci = CultureInfo.GetCultureInfo(cultureName);
+
+ Assert.Equal(expectedCultureName, ci.Name);
+ Assert.Equal(expectedSortName, ci.CompareInfo.Name);
+ }
+
+ private static bool SupportRemoteExecutionWithIcu => RemoteExecutor.IsSupported && PlatformDetection.IsIcuGlobalization;
+
+ [InlineData("xx-u-XX", "xx-u-xx")]
+ [InlineData("xx-u-XX-u-yy", "xx-u-xx-u-yy")]
+ [InlineData("xx-t-ja-JP", "xx-t-ja-jp")]
+ [InlineData("qps-plocm", "qps-PLOCM")] // ICU normalize this name to "qps--plocm" which we normalize it back to "qps-plocm"
+ [InlineData("zh_CN", "zh_cn")]
+ [InlineData("km_KH", "km_kh")]
+ [ConditionalTheory(nameof(SupportRemoteExecutionWithIcu))]
+ public void TestCreationWithICUNormalizedNames(string cultureName, string expectedCultureName)
+ {
+ CultureInfo ci = CultureInfo.GetCultureInfo(cultureName);
+ Assert.Equal(expectedCultureName, ci.Name);
+ }
+
+ [InlineData("xx-u-XX")]
+ [InlineData("xx-u-XX-u-yy")]
+ [InlineData("xx-t-ja-JP")]
+ [InlineData("qps-plocm")]
[InlineData("zh-TW-u-co-zhuyin")]
- [InlineData("de-DE-u-co-phoneb")]
- [InlineData("de-u-co-phonebk")]
- [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsIcuGlobalization))]
- public void TestCreationWithMangledSortName(string cultureName)
+ [InlineData("de-DE-u-co-phonebk")]
+ [InlineData("de-DE-u-co-phonebk-u-xx")]
+ [InlineData("de-DE-u-xx-u-co-phonebk")]
+ [InlineData("de-DE-t-xx-u-co-phonebk")]
+ [InlineData("de-DE-u-co-phonebk-t-xx")]
+ [InlineData("de-DE-u-co-phonebk-t-xx-u-yy")]
+ [InlineData("de-DE")]
+ [ConditionalTheory(nameof(SupportRemoteExecutionWithIcu))]
+ public void TestWithResourceLookup(string cultureName)
{
- Assert.True(CultureInfo.GetCultureInfo(cultureName).CompareInfo.Name.Equals(cultureName, StringComparison.OrdinalIgnoreCase));
+ RemoteExecutor.Invoke(name => {
+ CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo(name);
+ int Zero = 0;
+
+ // This should go through the resource manager to get the localized exception message using the current UI culture
+ Assert.Throws(() => 1 / Zero);
+ }, cultureName).Dispose();
}
}
}
diff --git a/src/libraries/System.Management/src/System.Management.csproj b/src/libraries/System.Management/src/System.Management.csproj
index 37e3f532ee08a1..66172649390b56 100644
--- a/src/libraries/System.Management/src/System.Management.csproj
+++ b/src/libraries/System.Management/src/System.Management.csproj
@@ -10,7 +10,7 @@
true
true
- true
+ false
2
true
true
diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/CultureData.Icu.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/CultureData.Icu.cs
index 09e3ed1dda3c26..a1f244246de9ff 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Globalization/CultureData.Icu.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/CultureData.Icu.cs
@@ -12,6 +12,88 @@ internal sealed partial class CultureData
// ICU constants
private const int ICU_ULOC_KEYWORD_AND_VALUES_CAPACITY = 100; // max size of keyword or value
private const int ICU_ULOC_FULLNAME_CAPACITY = 157; // max size of locale name
+ private const int WINDOWS_MAX_COLLATION_NAME_LENGTH = 8; // max collation name length in the culture name
+
+ ///
+ /// Process the locale name that ICU returns and convert it to the format that .NET expects.
+ ///
+ /// The locale name that ICU returns.
+ /// The extension part in the original culture name.
+ /// The index of the collation in the name.
+ ///
+ /// BCP 47 specifications allow for extensions in the locale name, following the format language-script-region-extensions-collation. However,
+ /// not all extensions supported by ICU are supported in .NET. In the locale name, extensions are separated from the rest of the name using '-u-' or '-t-'.
+ /// In .NET, only the collation extension is supported. If the name includes a collation extension, it will be prefixed with '-u-co-'.
+ /// For example, en-US-u-co-search would be converted to the ICU name en_US@collation=search, which would then be translated to the .NET name en-US_search.
+ /// All extensions in the ICU names start with @. When normalizing the name to the .NET format, we retain the extensions in the name to ensure differentiation
+ /// between names with extensions and those without. For example, we may have a name like en-US and en-US-u-xx. Although .NET doesn't support the extension xx,
+ /// we still include it in the name to distinguish it from the name without the extension.
+ ///
+ private static string NormalizeCultureName(string name, ReadOnlySpan extension, out int collationStart)
+ {
+ Debug.Assert(name is not null);
+ Debug.Assert(name.Length <= ICU_ULOC_FULLNAME_CAPACITY);
+
+ collationStart = -1;
+ bool changed = false;
+ Span buffer = stackalloc char[ICU_ULOC_FULLNAME_CAPACITY];
+ int bufferIndex = 0;
+
+ for (int i = 0; i < name.Length && bufferIndex < ICU_ULOC_FULLNAME_CAPACITY; i++)
+ {
+ char c = name[i];
+ if (c == '-' && i < name.Length - 1 && name[i + 1] == '-')
+ {
+ // ICU changes names like `qps_plocm` (one underscore) to `qps__plocm` (two underscores)
+ // The reason this occurs is because, while ICU canonicalizing, ulocimp_getCountry returns an empty string since the country code value is > 3 (rightly so).
+ // But append an extra '_' thinking that country code was in-fact appended (for the empty string value as well).
+ // Before processing, the name qps__plocm will be converted to its .NET name equivalent, which is qps--plocm.
+ changed = true;
+ buffer[bufferIndex++] = '-';
+ i++;
+ }
+ else if (c == '@')
+ {
+ changed = true;
+
+ if (!extension.IsEmpty && extension.TryCopyTo(buffer.Slice(bufferIndex)))
+ {
+ bufferIndex += extension.Length;
+ }
+
+ int collationIndex = name.IndexOf("collation=", i + 1, StringComparison.Ordinal);
+ if (collationIndex > 0)
+ {
+ collationIndex += "collation=".Length;
+
+ // format of the locale properties is @key=value;collation=collationName;key=value;key=value
+ int endOfCollation = name.IndexOf(';', collationIndex);
+ if (endOfCollation < 0)
+ {
+ endOfCollation = name.Length;
+ }
+
+ int length = Math.Min(WINDOWS_MAX_COLLATION_NAME_LENGTH, endOfCollation - collationIndex); // Windows doesn't allow collation names longer than 8 characters
+ if (buffer.Length - bufferIndex >= length + 1)
+ {
+ collationStart = bufferIndex;
+ buffer[bufferIndex++] = '_';
+ name.AsSpan(collationIndex, length).CopyTo(buffer.Slice(bufferIndex));
+ bufferIndex += length;
+ }
+ }
+
+ // done getting all parts can be supported in the .NET culture names.
+ break;
+ }
+ else
+ {
+ buffer[bufferIndex++] = name[i];
+ }
+ }
+
+ return changed ? new string(buffer.Slice(0, bufferIndex)) : name;
+ }
///
/// This method uses the sRealName field (which is initialized by the constructor before this is called) to
@@ -26,16 +108,15 @@ private bool InitIcuCultureDataCore()
string realNameBuffer = _sRealName;
// Basic validation
- if (!IsValidCultureName(realNameBuffer, out var index))
+ if (!IsValidCultureName(realNameBuffer, out var index, out int indexOfExtensions))
{
return false;
}
// Replace _ (alternate sort) with @collation= for ICU
- ReadOnlySpan alternateSortName = default;
if (index > 0)
{
- alternateSortName = realNameBuffer.AsSpan(index + 1);
+ ReadOnlySpan alternateSortName = realNameBuffer.AsSpan(index + 1);
realNameBuffer = string.Concat(realNameBuffer.AsSpan(0, index), ICU_COLLATION_KEYWORD, alternateSortName);
}
@@ -45,22 +126,9 @@ private bool InitIcuCultureDataCore()
return false; // fail
}
- // Replace the ICU collation keyword with an _
Debug.Assert(_sWindowsName != null);
- index = _sWindowsName.IndexOf(ICU_COLLATION_KEYWORD, StringComparison.Ordinal);
- if (index >= 0)
- {
- // Use original culture name if alternateSortName is not set, which is possible even if the normalized
- // culture name has "@collation=".
- // "zh-TW-u-co-zhuyin" is a good example. The term "u-co-" means the following part will be the sort name
- // and it will be treated in ICU as "zh-TW@collation=zhuyin".
- _sName = alternateSortName.Length == 0 ? realNameBuffer : string.Concat(_sWindowsName.AsSpan(0, index), "_", alternateSortName);
- }
- else
- {
- _sName = _sWindowsName;
- }
- _sRealName = _sName;
+
+ _sRealName = NormalizeCultureName(_sWindowsName, indexOfExtensions > 0 ? _sRealName.AsSpan(indexOfExtensions) : ReadOnlySpan.Empty, out int collationStart);
_iLanguage = LCID;
if (_iLanguage == 0)
@@ -69,11 +137,11 @@ private bool InitIcuCultureDataCore()
}
_bNeutral = TwoLetterISOCountryName.Length == 0;
_sSpecificCulture = _bNeutral ? IcuLocaleData.GetSpecificCultureName(_sRealName) : _sRealName;
+
// Remove the sort from sName unless custom culture
- if (index > 0 && !_bNeutral && !IsCustomCultureId(_iLanguage))
- {
- _sName = _sWindowsName.Substring(0, index);
- }
+ // To ensure compatibility, it is necessary to allow the creation of cultures like zh_CN (using ICU notation) in the case of _bNeutral.
+ _sName = collationStart < 0 || _bNeutral ? _sRealName : _sRealName.Substring(0, collationStart);
+
return true;
}
@@ -369,7 +437,7 @@ private static CultureInfo[] IcuEnumCultures(CultureTypes types)
}
bool enumNeutrals = (types & CultureTypes.NeutralCultures) != 0;
- bool enumSpecificss = (types & CultureTypes.SpecificCultures) != 0;
+ bool enumSpecifics = (types & CultureTypes.SpecificCultures) != 0;
List list = new List();
if (enumNeutrals)
@@ -384,7 +452,7 @@ private static CultureInfo[] IcuEnumCultures(CultureTypes types)
if (index + length <= bufferLength)
{
CultureInfo ci = CultureInfo.GetCultureInfo(new string(chars, index, length));
- if ((enumNeutrals && ci.IsNeutralCulture) || (enumSpecificss && !ci.IsNeutralCulture))
+ if ((enumNeutrals && ci.IsNeutralCulture) || (enumSpecifics && !ci.IsNeutralCulture))
{
list.Add(ci);
}
@@ -418,10 +486,14 @@ private static string IcuGetConsoleFallbackName(string cultureName)
/// * Disallow input that starts or ends with '-' or '_'.
/// * Disallow input that has any combination of consecutive '-' or '_'.
/// * Disallow input that has multiple '_'.
+ ///
+ /// The IsValidCultureName method also identifies the presence of any extensions in the name (such as -u- or -t-) and returns the index of the extension.
+ /// This is necessary because we need to append the extensions to the name when normalizing it to the .NET format.
///
- private static bool IsValidCultureName(string subject, out int indexOfUnderscore)
+ private static bool IsValidCultureName(string subject, out int indexOfUnderscore, out int indexOfExtensions)
{
indexOfUnderscore = -1;
+ indexOfExtensions = -1;
if (subject.Length == 0) return true; // Invariant Culture
if (subject.Length == 1 || subject.Length > LocaleNameMaxLength) return false;
@@ -446,6 +518,16 @@ private static bool IsValidCultureName(string subject, out int indexOfUnderscore
seenUnderscore = true;
indexOfUnderscore = i;
}
+ else
+ {
+ if (indexOfExtensions < 0 && i < subject.Length - 2 && (subject[i + 1] is 'u' or 't') && subject[i + 2] == '-') // we have -u- or -t- which is an extension
+ {
+ if (subject[i + 1] == 't' || i >= subject.Length - 6 || subject[i + 3] != 'c' || subject[i + 4] != 'o' || subject[i + 5] != '-' ) // not -u-co- collation extension
+ {
+ indexOfExtensions = i;
+ }
+ }
+ }
}
else
{
diff --git a/src/libraries/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj b/src/libraries/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
index a29fda1bc8b330..3f403e35d4207d 100644
--- a/src/libraries/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
+++ b/src/libraries/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
@@ -10,7 +10,7 @@
The System.Reflection.Metadata library is built-in as part of the shared framework in .NET Runtime. The package can be installed when you need to use it in other target frameworks.
README.md
2
- true
+ false
diff --git a/src/libraries/System.Runtime.InteropServices/tests/LibraryImportGenerator.Tests/FunctionPointerTests.cs b/src/libraries/System.Runtime.InteropServices/tests/LibraryImportGenerator.Tests/FunctionPointerTests.cs
index fde6b235ed4561..7557cf2e51921f 100644
--- a/src/libraries/System.Runtime.InteropServices/tests/LibraryImportGenerator.Tests/FunctionPointerTests.cs
+++ b/src/libraries/System.Runtime.InteropServices/tests/LibraryImportGenerator.Tests/FunctionPointerTests.cs
@@ -115,5 +115,17 @@ static int CallbackUnmanagedStdcall(int a, int b)
return Callback(a, b);
}
}
+
+ [UnmanagedCallersOnly]
+ public static int Increment (int i) {
+ return i + 1;
+ }
+
+ [Fact]
+ public unsafe void CalliUnmanaged()
+ {
+ delegate* unmanaged callbackProc = (delegate* unmanaged)&Increment;
+ Assert.Equal(6, callbackProc(5));
+ }
}
}
diff --git a/src/libraries/System.ServiceProcess.ServiceController/src/System.ServiceProcess.ServiceController.csproj b/src/libraries/System.ServiceProcess.ServiceController/src/System.ServiceProcess.ServiceController.csproj
index e976953653d338..e4d83be68d0bb2 100644
--- a/src/libraries/System.ServiceProcess.ServiceController/src/System.ServiceProcess.ServiceController.csproj
+++ b/src/libraries/System.ServiceProcess.ServiceController/src/System.ServiceProcess.ServiceController.csproj
@@ -5,7 +5,7 @@
$(NoWarn);CA2249
true
- true
+ false
1
Provides the System.ServiceProcess.ServiceContainer class, which allows you to connect to a running or stopped service, manipulate it, or get information about it.
diff --git a/src/libraries/System.Text.Json/src/System.Text.Json.csproj b/src/libraries/System.Text.Json/src/System.Text.Json.csproj
index dde9b4e507e7bf..4f20eb177dcc3c 100644
--- a/src/libraries/System.Text.Json/src/System.Text.Json.csproj
+++ b/src/libraries/System.Text.Json/src/System.Text.Json.csproj
@@ -8,7 +8,7 @@
CS8969
true
true
- true
+ false
3
true
diff --git a/src/mono/mono/metadata/icall.c b/src/mono/mono/metadata/icall.c
index c8b16f7f400a68..09362a731d647e 100644
--- a/src/mono/mono/metadata/icall.c
+++ b/src/mono/mono/metadata/icall.c
@@ -949,7 +949,7 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetSpanDataFrom (MonoCl
return NULL;
}
- MonoType *type = targetTypeHandle;
+ MonoType *type = mono_type_get_underlying_type (targetTypeHandle);
if (MONO_TYPE_IS_REFERENCE (type) || type->type == MONO_TYPE_VALUETYPE) {
mono_error_set_argument (error, "array", "Cannot initialize array of non-primitive type");
return NULL;
diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c
index d810a5a8c67829..db28b53d3483bd 100644
--- a/src/mono/mono/metadata/marshal.c
+++ b/src/mono/mono/metadata/marshal.c
@@ -3797,17 +3797,11 @@ mono_marshal_get_native_func_wrapper_indirect (MonoClass *caller_class, MonoMeth
if ((res = mono_marshal_find_in_cache (cache, sig)))
return res;
-#if 0
- fprintf (stderr, "generating wrapper for signature %s\n", mono_signature_full_name (sig));
-#endif
-
- /* FIXME: better wrapper name */
- char * name = g_strdup_printf ("wrapper_native_indirect_%p", sig);
+ char *name = mono_signature_to_name (sig, "wrapper_native_indirect");
MonoMethodBuilder *mb = mono_mb_new (caller_class, name, MONO_WRAPPER_MANAGED_TO_NATIVE);
mb->method->save_lmf = 1;
WrapperInfo *info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NATIVE_FUNC_INDIRECT);
- //info->d.managed_to_native.method = NULL;
info->d.native_func.klass = caller_class;
info->d.native_func.sig = sig;
@@ -3819,6 +3813,7 @@ mono_marshal_get_native_func_wrapper_indirect (MonoClass *caller_class, MonoMeth
mono_marshal_emit_native_wrapper (image, mb, sig, piinfo, mspecs, /*func*/NULL, flags);
g_free (mspecs);
+ /* Add an extra argument which the caller will use to pass in the ftnptr to call */
MonoMethodSignature *csig = mono_metadata_signature_dup_add_this (image, sig, mono_defaults.int_class);
csig->pinvoke = 0;
diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c
index 107507498be330..a66448177eb0ce 100644
--- a/src/mono/mono/mini/aot-compiler.c
+++ b/src/mono/mono/mini/aot-compiler.c
@@ -9274,6 +9274,13 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method)
add_gsharedvt_wrappers (acfg, mono_method_signature_internal (cfg->method), FALSE, TRUE, TRUE);
}
+ for (GSList *l = cfg->pinvoke_calli_signatures; l; l = l->next) {
+ MonoMethodSignature *sig = mono_metadata_signature_dup ((MonoMethodSignature*)l->data);
+
+ MonoMethod *wrapper = mono_marshal_get_native_func_wrapper_indirect (cfg->method->klass, sig, TRUE);
+ add_extra_method (acfg, wrapper);
+ }
+
if (cfg->llvm_only)
acfg->stats.llvm_count ++;
@@ -9709,6 +9716,9 @@ append_mangled_wrapper_subtype (GString *s, WrapperSubtype subtype)
case WRAPPER_SUBTYPE_LLVM_FUNC:
label = "llvm_func";
break;
+ case WRAPPER_SUBTYPE_NATIVE_FUNC_INDIRECT:
+ label = "native_func_indirect";
+ break;
default:
g_assert_not_reached ();
}
@@ -9872,6 +9882,9 @@ append_mangled_wrapper (GString *s, MonoMethod *method)
append_sig = FALSE;
} else if (info->subtype == WRAPPER_SUBTYPE_NATIVE_FUNC_AOT) {
success = success && append_mangled_method (s, info->d.managed_to_native.method);
+ } else if (info->subtype == WRAPPER_SUBTYPE_NATIVE_FUNC_INDIRECT) {
+ append_mangled_signature (s, info->d.native_func.sig);
+ append_sig = FALSE;
} else {
g_assert (info->subtype == WRAPPER_SUBTYPE_NONE || info->subtype == WRAPPER_SUBTYPE_PINVOKE);
success = success && append_mangled_method (s, info->d.managed_to_native.method);
diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c
index c00b9d6cd1018f..e3719b1e5a7f1a 100644
--- a/src/mono/mono/mini/method-to-ir.c
+++ b/src/mono/mono/mini/method-to-ir.c
@@ -7306,6 +7306,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
#if 0
fprintf (stderr, "generating wrapper for calli in method %s with wrapper type %s\n", method->name, mono_wrapper_type_to_str (method->wrapper_type));
#endif
+
+ if (cfg->compile_aot)
+ cfg->pinvoke_calli_signatures = g_slist_prepend_mempool (cfg->mempool, cfg->pinvoke_calli_signatures, fsig);
+
/* Call the wrapper that will do the GC transition instead */
MonoMethod *wrapper = mono_marshal_get_native_func_wrapper_indirect (method->klass, fsig, cfg->compile_aot);
diff --git a/src/mono/mono/mini/mini.h b/src/mono/mono/mini/mini.h
index 3d02bd18a0230c..3a94052307ad5c 100644
--- a/src/mono/mono/mini/mini.h
+++ b/src/mono/mono/mini/mini.h
@@ -1609,6 +1609,7 @@ typedef struct {
GSList *signatures;
GSList *interp_in_signatures;
+ GSList *pinvoke_calli_signatures;
/* GC Maps */
diff --git a/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs b/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs
index 27b3e38c0caf64..a79dc376d7506c 100644
--- a/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs
+++ b/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs
@@ -418,32 +418,28 @@ public MethodInfo(AssemblyInfo assembly, MethodDefinitionHandle methodDefHandle,
EndLocation = new SourceLocation(this, end);
DebuggerAttrInfo = new DebuggerAttributesInfo();
- foreach (var cattr in methodDef.GetCustomAttributes())
+ foreach (CustomAttributeHandle cattr in methodDef.GetCustomAttributes())
{
- var ctorHandle = asmMetadataReader.GetCustomAttribute(cattr).Constructor;
- if (ctorHandle.Kind == HandleKind.MemberReference)
- {
- var container = asmMetadataReader.GetMemberReference((MemberReferenceHandle)ctorHandle).Parent;
- var name = assembly.EnCGetString(asmMetadataReader.GetTypeReference((TypeReferenceHandle)container).Name);
- switch (name)
- {
- case "DebuggerHiddenAttribute":
- DebuggerAttrInfo.HasDebuggerHidden = true;
- break;
- case "DebuggerStepThroughAttribute":
- DebuggerAttrInfo.HasStepThrough = true;
- break;
- case "DebuggerNonUserCodeAttribute":
- DebuggerAttrInfo.HasNonUserCode = true;
- break;
- case "DebuggerStepperBoundaryAttribute":
- DebuggerAttrInfo.HasStepperBoundary = true;
- break;
- case nameof(CompilerGeneratedAttribute):
- IsCompilerGenerated = true;
- break;
- }
+ if (!assembly.TryGetCustomAttributeName(cattr, asmMetadataReader, out string name))
+ continue;
+ switch (name)
+ {
+ case "DebuggerHiddenAttribute":
+ DebuggerAttrInfo.HasDebuggerHidden = true;
+ break;
+ case "DebuggerStepThroughAttribute":
+ DebuggerAttrInfo.HasStepThrough = true;
+ break;
+ case "DebuggerNonUserCodeAttribute":
+ DebuggerAttrInfo.HasNonUserCode = true;
+ break;
+ case "DebuggerStepperBoundaryAttribute":
+ DebuggerAttrInfo.HasStepperBoundary = true;
+ break;
+ case nameof(CompilerGeneratedAttribute):
+ IsCompilerGenerated = true;
+ break;
}
}
DebuggerAttrInfo.ClearInsignificantAttrFlags();
@@ -795,13 +791,10 @@ internal TypeInfo(AssemblyInfo assembly, TypeDefinitionHandle typeHandle, TypeDe
}
}
- foreach (var cattr in type.GetCustomAttributes())
+ foreach (CustomAttributeHandle cattr in type.GetCustomAttributes())
{
- var ctorHandle = metadataReader.GetCustomAttribute(cattr).Constructor;
- if (ctorHandle.Kind != HandleKind.MemberReference)
+ if (!assembly.TryGetCustomAttributeName(cattr, metadataReader, out string attributeName))
continue;
- var container = metadataReader.GetMemberReference((MemberReferenceHandle)ctorHandle).Parent;
- var attributeName = assembly.EnCGetString(metadataReader.GetTypeReference((TypeReferenceHandle)container).Name);
switch (attributeName)
{
case nameof(CompilerGeneratedAttribute):
@@ -921,6 +914,33 @@ public unsafe AssemblyInfo(MonoProxy monoProxy, SessionId sessionId, string url,
Populate();
}
+ public bool TryGetCustomAttributeName(CustomAttributeHandle customAttribute, MetadataReader metadataReader, out string name)
+ {
+ name = "";
+ EntityHandle ctorHandle = metadataReader.GetCustomAttribute(customAttribute).Constructor;
+ if (ctorHandle.Kind != HandleKind.MemberReference)
+ return false;
+ EntityHandle? container = ctorHandle.Kind switch
+ {
+ HandleKind.MethodDefinition => metadataReader.GetMethodDefinition((MethodDefinitionHandle)ctorHandle).GetDeclaringType(),
+ HandleKind.MemberReference => metadataReader.GetMemberReference((MemberReferenceHandle)ctorHandle).Parent,
+ _ => null,
+ };
+ if (container == null)
+ return false;
+ StringHandle? attributeTypeNameHandle = container.Value.Kind switch
+ {
+ HandleKind.TypeDefinition => metadataReader.GetTypeDefinition((TypeDefinitionHandle)container.Value).Name,
+ HandleKind.TypeReference => metadataReader.GetTypeReference((TypeReferenceHandle)container.Value).Name,
+ HandleKind.TypeSpecification => null, // custom generic attributes, TypeSpecification does not keep the attribute name for them
+ _ => null,
+ };
+ if (attributeTypeNameHandle == null)
+ return false;
+ name = EnCGetString(attributeTypeNameHandle.Value);
+ return true;
+ }
+
public async Task GetDebugId(MonoSDBHelper sdbAgent, CancellationToken token)
{
if (debugId > 0)
diff --git a/src/mono/wasm/debugger/DebuggerTestSuite/MiscTests.cs b/src/mono/wasm/debugger/DebuggerTestSuite/MiscTests.cs
index ee626ee4c9f6fa..0c94c171d1d858 100644
--- a/src/mono/wasm/debugger/DebuggerTestSuite/MiscTests.cs
+++ b/src/mono/wasm/debugger/DebuggerTestSuite/MiscTests.cs
@@ -1042,13 +1042,19 @@ await EvaluateAndCheck(
);
}
- [Theory]
+ [ConditionalTheory(nameof(RunningOnChrome))]
[InlineData("ClassInheritsFromClassWithoutDebugSymbols", 1287, true)]
[InlineData("ClassInheritsFromClassWithoutDebugSymbols", 1287, false)]
[InlineData("ClassInheritsFromNonUserCodeClass", 1335, true)]
[InlineData("ClassInheritsFromNonUserCodeClass", 1335, false)]
[InlineData("ClassInheritsFromNonUserCodeClassThatInheritsFromNormalClass", 1352, true)]
[InlineData("ClassInheritsFromNonUserCodeClassThatInheritsFromNormalClass", 1352, false)]
+ [InlineData("GenericCustomAttributeDecoratedClassInheritsFromClassWithoutDebugSymbols", 1390, true)]
+ [InlineData("GenericCustomAttributeDecoratedClassInheritsFromClassWithoutDebugSymbols", 1390, false)]
+ [InlineData("GenericCustomAttributeDecoratedClassInheritsFromNonUserCodeClass", 1407, true)]
+ [InlineData("GenericCustomAttributeDecoratedClassInheritsFromNonUserCodeClass", 1407, false)]
+ [InlineData("GenericCustomAttributeDecoratedClassInheritsFromNonUserCodeClassThatInheritsFromNormalClass", 1425, true)]
+ [InlineData("GenericCustomAttributeDecoratedClassInheritsFromNonUserCodeClassThatInheritsFromNormalClass", 1425, false)]
public async Task InspectThisThatInheritsFromClassNonUserCode(string class_name, int line, bool jmc)
{
await SetJustMyCode(jmc);
diff --git a/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs b/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs
index 5e30c999b3304d..cf7be308718a32 100644
--- a/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs
+++ b/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs
@@ -1371,4 +1371,60 @@ public static void CheckArguments(ReadOnlySpan