注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
- #125719 Enable linux_arm64 coreclr build for SVE perf benchmarks.
- #125717 Fix
ConnectAsync_WithBuffer_Succeedstest to include Apple mobile platforms - #125709 Unify SECURITY_ATTRIBUTES code across the codebase
- #125707 Re-enable the WhenDiskIsFullTheErrorMessageContainsAllDetails test on Windows
- #125687 Allow binding to OpenSSL 4 from portable builds
- #125686 Switch to azurelinux 3 build image in public as well
- #125681 More reduction of PointerMemoryManager
- #125680 [release/10.0] Source code updates from dotnet/dotnet
- #125679 Revert "[release/9.0-staging] Update dependencies from dotnet/roslyn …
- #125675 Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation
- #125665 [QUIC] Disable Quic tests on AzL3 VM
- #125658 [runtime tests] Make 2 tests conditional on MT enabled
- #125643 Process: use overlapped I/O for parent end of stdout/stderr pipes on Windows
- #125636 Reduce backtracking for greedy loops followed by subsumed literals
- #125621 [cDAC] Remove reflection from register access in ContextHolder
- #125571 [main] Update dependencies from dotnet/hotreload-utils, dotnet/icu, dotnet/runtime-assets
- #125536 Add property and event parent lookup table entries in AddPropertyToPropertyMap and AddEventToEventMap
- #125529 [release/10.0] Backport #125488: Add curl retry flags to wasi-sdk Linux download
- #125525 Fix most of the diagnostic EH tests with interpreter
- #125482 [main] Update dependencies from dotnet/xharness
- #125471 Add a directive to asm files to manually inject a .note.GNU-stack section when using clang 22
- #125455 [wasm][interpreter] Defer managed calli cookie resolution to execution time
- #125139 Fix GetValue<object>() and TryGetValue<JsonElement?> on JsonValueOfJsonPrimitive types
- #124902 Migrate Windows build pools from VS2026 preview scout to production VS2026 image
- #124842 Handle Capture nodes in TryGetOrdinalCaseInsensitiveString
- #124699 Fix: Allow inline regex options in conditional expression branches
- #124604 [clr-ios] Add options to strip inlining and debug info in Crossgen2 on Apple mobile
- #118207 Optimize Version JSON deserialization with UTF-8 parsing
#125719 Enable linux_arm64 coreclr build for SVE perf benchmarks.
- 作成者: @ilonatommy
- 作成日時: 2026年03月18日 09:13:55(UTC)
- マージ日時: 2026年03月18日 11:50:02(UTC)
- ラベル: arch-wasm area-Infrastructure perf-pipeline
概要
Linux ARM64プラットフォーム向けのCoreClrパフォーマンスベンチマークビルドを有効化するパイプライン設定変更。dotnet-performanceリポジトリのcobaltSveMicroジョブがlinux_arm64上で実行される際に必要なbuild_linux_arm64_release_coreclrジョブの依存関係を解決し、YAML検証エラーによるパイプラインビルド失敗を修正しています。
変更内容
- eng/pipelines/performance/templates/perf-build-jobs.yml:
perf-coreclr-build-jobs.ymlテンプレートへlinux_arm64: trueパラメータを渡す設定を追加(+1/-0)
パフォーマンスへの影響
影響なし。ビルドパイプラインの構成変更であり、ランタイムまたはライブラリのパフォーマンス特性には直接的な変更はありません。
関連Issue
なし
その他
- この変更により、既存のx64およびWindows向けビルドに加えて、ARM64アーキテクチャ向けのアーティファクト生成が可能になります。
- パイプライン実行後、
dotnet-performance-infraをAzure Batchタスクでトリガーして、新しいデータ処理およびテスト履歴インデックスへの結果反映が予定されています。 - 内部パイプライン設定の変更のため、公開APIに対する互換性影響はありません。
#125717 Fix ConnectAsync_WithBuffer_Succeeds test to include Apple mobile platforms
- 作成者: @kotlarmilos
- 作成日時: 2026年03月18日 09:07:27(UTC)
- マージ日時: 2026年03月18日 13:29:12(UTC)
- ラベル: area-System.Net.Sockets os-ios
概要
ConnectAsync_WithBuffer_Succeeds テストを更新し、Apple モバイルプラットフォーム(iOS/tvOS など)を connectx ブロッキングモードチェックに含めるようにします。このテストはUnixプラットフォーム固有のSocket接続機能を検証するものです。
変更内容
- src/libraries/System.Net.Sockets/tests/FunctionalTests/Connect.Unix.cs
- connectx ブロッキングモード判定ロジックを更新し、既存のプラットフォーム判定にApple モバイルプラットフォームを追加(2行削除、2行追加)
パフォーマンスへの影響
影響なし
関連Issue
その他
このPRはテスト修正のみであり、本体コードへの変更はありません。Apple モバイルプラットフォームでのSocket接続テストの信頼性向上が目的です。
#125709 Unify SECURITY_ATTRIBUTES code across the codebase
- 作成者: @Copilot
- 作成日時: 2026年03月18日 03:36:39(UTC)
- マージ日時: 2026年03月18日 15:18:16(UTC)
- ラベル: area-System.IO
概要
SECURITY_ATTRIBUTES構造体の初期化処理を統一するため、Kernel32インタロップレイヤーに3つのファクトリメソッドを追加し、複数の箇所で重複していた初期化コードを削除する変更です。これにより、ファイル、パイプ、レジストリ、ディレクトリ、メモリマップドファイル、スレッド同期プリミティブ関連のコード全体で一貫性が向上します。
// 新しいファクトリメソッド
SECURITY_ATTRIBUTES.Create() // nLengthのみ設定
SECURITY_ATTRIBUTES.Create(void* securityDescriptor) // nLengthとセキュリティ記述子を設定
SECURITY_ATTRIBUTES.Create(bool inheritable) // nLengthとハンドル継承可能性を設定
変更内容
Interop.SECURITY_ATTRIBUTES.cs: 3つのファクトリメソッド追加(内部実装)SafeFileHandle.Windows.cs: 9行のif/elseブロックをCreate(bool)1行に統一。副作用として、FileShare.Inheritableが設定されていない場合のnLength = 0契約違反を修正FileSystemAclExtensions.cs: 手動初期化をCreate(bool)に置き換えMemoryMappedFile.Windows.cs:GetSecAttrs()ヘルパメソッドを削除し、呼び出し元で直接Create()を使用PipeStream.Windows.cs:GetSecAttrs()ヘルパをCreate(bool)で1行に統一FileSystem.DirectoryCreation.Windows.cs、EventWaitHandleAcl.cs、MutexAcl.cs、SemaphoreAcl.cs、EventWaitHandle.Windows.cs、Mutex.Windows.cs、Semaphore.Windows.cs: 2行の初期化パターンをCreate(void*)1行に統一RegistryKey.cs:Create(void*)を無条件呼び出し(null チェック削除)に簡素化
パフォーマンスへの影響
影響なし。この変更はコードの構造化のみであり、実行時の動作やパフォーマンスに変わりはありません。
関連Issue
その他
- 所有ライブラリ(
System.IO.FileSystem.AccessControl、System.IO.Pipes、System.IO.MemoryMappedFiles、System.Threading.AccessControl、Microsoft.Win32.Registry、System.Private.CoreLib)は全てビルド成功確認済み unsafeキーワードを使用するファクトリメソッドだが、全呼び出し元でAllowUnsafeBlocks=trueが設定されているため互換性問題なし- 公開APIレベルではなく内部実装の整備(
Interop層の統一)
#125707 Re-enable the WhenDiskIsFullTheErrorMessageContainsAllDetails test on Windows
- 作成者: @Copilot
- 作成日時: 2026年03月18日 03:31:17(UTC)
- マージ日時: 2026年03月18日 14:05:52(UTC)
- ラベル: area-System.IO test-enhancement
概要
Windows上でSetFileInformationByHandleが返すERROR_INVALID_PARAMETER(87)エラーを処理する修正が既に適用されたため、抑制されていたテストを再度有効化します。このテストは1EiBのプリアロケーションがファイルパスとサイズを含むIOExceptionをスローし、ディスク上にファイルを残さないことを検証します。
変更内容
ctor_options.cs:WhenDiskIsFullTheErrorMessageContainsAllDetailsテストから[ActiveIssue("…/92624", TestPlatforms.Windows)]を削除し、Windowsでのテスト実行を再度有効化SafeFileHandle.Windows.cs: プリアロケーション失敗時のエラーコード検証に関するコメントを更新。ERROR_INVALID_PARAMETERがNTFSの最大ファイルサイズ制限を超えるアロケーション要求に対応する旨を明確化(ロジック変更なし)
パフォーマンスへの影響
影響なし
関連Issue
その他
なし
#125687 Allow binding to OpenSSL 4 from portable builds
- 作成者: @bartonjs
- 作成日時: 2026年03月17日 22:23:20(UTC)
- マージ日時: 2026年03月18日 19:47:57(UTC)
- ラベル: area-System.Security
概要
OpenSSL 4のサポートをポータブルビルドに追加するプルリクエストです。OpenSSL 3.x/1.1が利用可能な場合はそれらを優先しつつ、フォールバックとしてOpenSSL 4へのバインディングを可能にします。
変更内容
- opensslshim.c: ディストロに依存しないOpenSSLローダーに
libssl.so.4のプロービング処理を追加(3.x/1.1のフォールバック時) - openssl.c: ポータブルビルド時にOpenSSL 4用のX509スタックシムの初期化処理を追加(
OPENSSL_sk_set_thunks経由) - pal_x509.c: X509スタック作成をdirect allocからCryptoNative_NewX509Stack()経由に変更し、OpenSSL 4互換性を確保
- opensslshim.h:
sk_X509_new_null()型安全マクロを削除(呼び出し元がCryptoNative_NewX509Stack()に移行)
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
この変更は暗号化関連のネイティブライブラリ(System.Security.Cryptography.Native)の内部実装に限定されており、公開APIへの影響はありません。OpenSSL 4がシステムに存在する場合のみ使用されるため、既存の環境での動作に影響しません。
#125686 Switch to azurelinux 3 build image in public as well
- 作成者: @akoeplinger
- 作成日時: 2026年03月17日 21:59:03(UTC)
- マージ日時: 2026年03月18日 08:41:36(UTC)
- ラベル: area-Infrastructure
概要
公開ビルド用のLinuxプール設定をAzure Linux 3イメージを使用するように更新しました。既に内部ビルドで使用されているAzure Linux 3の命名規則に合わせて、公開ビルドのImageOverrideを統一するものです。
変更内容
- eng/pipelines/common/xplat-setup.yml: 公開ビルド向けLinuxプールの
ImageOverride設定をBuild.Ubuntu.2204.Amd64.Openからbuild.azurelinux.3.amd64.openに変更(1行追加、1行削除)
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
このPRは#125628の公開ビルド版に相当するもので、ビルドイメージの命名規則を統一するための変更です。
#125681 More reduction of PointerMemoryManager
- 作成者: @vcsjones
- 作成日時: 2026年03月17日 21:26:10(UTC)
- マージ日時: 2026年03月18日 03:33:58(UTC)
- ラベル: area-System.Security reduce-unsafe
概要
暗号スタック全体における PointerMemoryManager の使用を削減する継続的な取り組みの一環です。PKCS#7 ContentInfo のASN.1デコーディングを PointerMemoryManager から生成された ref struct ベースのデコーダ(ValueContentInfoAsn)に置き換え、複数のPKCS/CMS/X.509呼び出しサイトをReadOnlySpan<byte>ベースのAPIに切り替えます。これにより、メモリピニングのオーバーヘッドを削減し、より安全で効率的なコード生成を実現します。
変更内容
- KeyFormatHelper.Encrypted.cs:
DecryptPkcs8/ReencryptPkcs8APIをReadOnlyMemory<byte>からReadOnlySpan<byte>に変更(内部実装の変更) - CngPkcs8.cs: 暗号化されたPKCS#8インポートパスから
PointerMemoryManagerを削除し、ReencryptPkcs8呼び出しを span ベースに更新 - ContentInfoAsn.xml / ContentInfoAsn.xml.cs: ASN.1ジェネレータの設定を
emitType="both"に変更し、メモリベースと span ベースの両方のコーデック型(ContentInfoAsnとValueContentInfoAsn)を生成 - SignedCms.cs / ManagedPal.Asn.cs / ManagedPal.Decode.cs: PKCS#7 Signed/Enveloped コンテンツ処理で
ValueContentInfoAsnを使用、ポインタピニングを排除 - AppleCertificatePal.ImportExport.macOS/iOS.cs: CFData span を直接渡すことで
PointerMemoryManagerを削除 - X509CertificateLoader.Pkcs12.cs / Pkcs8PrivateKeyInfo.cs / X509Certificate2.cs: 呼び出しサイトを span ベースに更新
パフォーマンスへの影響
メモリピニングのオーバーヘッド削減による改善が期待されます。PointerMemoryManager の使用廃止により、ガベージコレクションの負荷軽減とメモリ割り当て削減が実現されます。具体的なベンチマーク数値は提供されていません。
関連Issue
なし
その他
このPRは段階的な改善の一部です。PKCS#12およびX.509の残存する PointerMemoryManager 使用箇所については、XSLTジェネレータからのより包括的なサポートが必要となるため、今後の大規模な変更として予定されています。
#125680 [release/10.0] Source code updates from dotnet/dotnet
- 作成者: @dotnet-maestro[bot]
- 作成日時: 2026年03月17日 21:25:35(UTC)
- マージ日時: 2026年03月18日 18:15:34(UTC)
- ラベル: Servicing-approved area-codeflow
概要
dotnet/dotnetリポジトリからのコードフロー更新PR。ビルド20260317.4の依存関係更新を含む自動同期です。主にMicrosoft.CodeAnalysis、NuGet関連パッケージ、ビルドツールの依存関係がバージョンアップされています。
変更内容
- NuGet.config: NuGetソース設定の更新(+1/-1)
- eng/Version.Details.props: バージョン詳細プロパティの更新(+29/-29)
- eng/Version.Details.xml: バージョン詳細XMLの更新(+69/-69)
- global.json: グローバル設定ファイルの更新(+5/-5)
主な依存関係の更新:
- Microsoft.CodeAnalysis系: 5.0.0-2.26165.109 → 5.0.0-2.26167.104
- Microsoft.DotNet.Arcade.Sdk等ビルドツール: 10.0.0-beta.26165.109 → 10.0.0-beta.26167.104
- NuGet.Frameworks/Packaging/ProjectModel/Versioning: 7.0.2-rc.16609 → 7.0.2-rc.16804
- Microsoft.DotNet.Cecil: 0.11.5-alpha.26165.109 → 0.11.5-alpha.26167.104
- その他、Microsoft.NET.Sdk.IL、System.Reflection.Metadata、System.Text.Jsonなど複数パッケージ
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
- 本PRはdotnet/dotnetリポジトリのコードフロー自動更新(Maestro)による依存関係同期です
- release/10.0.1xxブランチからのコード同期です
- 関連するソースリポジトリの変更: efcore、roslyn、runtime、scenario-tests、sdk、source-build-reference-packages、templatingが含まれます
#125679 Revert "[release/9.0-staging] Update dependencies from dotnet/roslyn …
- 作成者: @sbomer
- 作成日時: 2026年03月17日 21:12:45(UTC)
- マージ日時: 2026年03月18日 15:55:13(UTC)
- ラベル: Servicing-approved area-System.Runtime.InteropServices linkable-framework
概要
release/9.0-stagingブランチでのRoslyn依存関係更新をリバート(コミット f505b9455c334cb1107a1db30daeeb3930b7e58c)。Roslyn/Roslyn-analyzersのパッケージバージョンを以前の状態に戻し、リバートされたコンパイラ/分析ツールの動作に合わせてテストと設定を調整。
変更内容
- 依存関係設定:
eng/Versions.propsとeng/Version.Details.xmlのRoslyn関連バージョンをリバート。VMRビルド用にUsingToolMicrosoftNetCompilers動作を追加 - ソースビルド設定:
eng/SourceBuildPrebuiltBaseline.xmlからRoslyn依存関係の無視パターンを削除(13行削除) - コンパイラ警告調整:
CompilerGeneratedCodeAccessedViaReflection.csでコンパイラ生成に関連するIL2062警告の期待値を削除 - テスト出力調整:
UpgradeToGeneratedRegexAnalyzerTests.csでトップレベルステートメント想定の固定コード形式を更新CustomMarshallerAttributeFixerTests_*.cs(4ファイル)でBufferSize挿入時の空行フォーマットを調整
- プロジェクト参照:
ILLink.RoslynAnalyzer.Tests.Generator.csprojのRoslyn参照プロパティを変更
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
このリバートは#121343に関連した変更を取り消すもの。リバート対象のコミットは以前のRoslyn依存関係更新であり、本PRでそれを復元している。
#125675 Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation
- 作成者: @Copilot
- 作成日時: 2026年03月17日 20:02:48(UTC)
- マージ日時: 2026年03月18日 04:33:35(UTC)
- ラベル: area-VM-coreclr
概要
CoreCLR実行時のCrst(Critical Section)ロック順序違反を修正。CreateInteropILStubがCrstILStubGenを保持しながら型読み込み中にCrstLoaderAllocatorReferencesを取得しようとしていたが、ロック順序の宣言が不足していた。特にInlineArray<T>を含むP/Invoke スタブ生成時に発生していた問題。
変更内容
CrstTypes.def—LoaderAllocatorReferencesのAcquiredAfterにILStubGenを追加し、CrstILStubGen保持中にCrstLoaderAllocatorReferences取得が可能であることを正式に宣言。crsttypes_generated.h— CrstTypeTool経由で再生成。CrstILStubGenのロックレベルを14→18に昇格させ、CrstLoaderAllocatorReferences(レベル17)を上回る安全な順序を確保。
パフォーマンスへの影響
影響なし
関連Issue
その他
- ロック順序違反はデバッグビルドで
Debug_CanTake()アサートによって検出される。 - この修正はPR #125574で固定バッファをInlineArraysに置き換えた変更により露見した潜在的なロック順序問題に対する根本的な解決策。
#125665 [QUIC] Disable Quic tests on AzL3 VM
- 作成者: @ManickaP
- 作成日時: 2026年03月17日 17:31:21(UTC)
- マージ日時: 2026年03月18日 09:49:52(UTC)
- ラベル: area-System.Net.Quic
概要
Azure Linux 3(非コンテナ)環境でのQUIC機能テストを無効化します。MsQuicの既知の問題(QUIC_STATUS_OUT_OF_MEMORY)によるテスト失敗を回避することが目的です。
変更内容
- QuicTestBase.cs:
IsNotAzureLinux3VMという新しいテスト条件を追加(コンテナ環境以外のAzure Linux上でテストをスキップ) - テストクラス(7ファイル):
QuicStreamTests.cs、QuicStreamConnectedStreamConformanceTests.cs、QuicListenerTests.cs、QuicConnectionTests.cs、MsQuicTests.cs、MsQuicRemoteExecutorTests.cs、MsQuicCipherSuitesPolicyTests.csに新しい条件を適用
パフォーマンスへの影響
影響なし(テストの実行スキップ条件の追加)
関連Issue
その他
この変更はテスト実行の信頼性向上を目的とした条件付けです。本来のQUIC機能実装には影響しません。コンテナ環境ではテストが実行されるため、CI環境が適切に構成されていれば機能の検証は継続されます。
#125658 [runtime tests] Make 2 tests conditional on MT enabled
- 作成者: @radekdoulik
- 作成日時: 2026年03月17日 15:04:49(UTC)
- マージ日時: 2026年03月18日 00:04:40(UTC)
- ラベル: area-Infrastructure
概要
2つのJIT回帰テストを、マルチスレッド対応のランタイムでのみ実行するように条件付き化します。シングルスレッド環境でのThread使用に伴う失敗やハングを回避するための変更です。
変更内容
src/tests/JIT/Regression/CLR-x86-JIT/v2.1/b72218/b72218.cs
using TestLibrary;を追加[Fact]を[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsMultithreadingSupported))]に変更
src/tests/JIT/Regression/CLR-x86-JIT/V1.2-M01/b08046cs/SyncGCHole.cs
using TestLibrary;を追加[Fact]を[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsMultithreadingSupported))]に変更
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
この変更はテストインフラストラクチャのみに影響し、ランタイムやライブラリの公開APIには影響しません。シングルスレッド環境でのテスト実行時のスキップメカニズムを追加するもので、既存の機能を変更するものではありません。
#125643 Process: use overlapped I/O for parent end of stdout/stderr pipes on Windows
- 作成者: @Copilot
- 作成日時: 2026年03月17日 09:36:58(UTC)
- マージ日時: 2026年03月18日 20:53:32(UTC)
- ラベル: area-System.Diagnostics.Process
概要
Windows上でプロセスのstdout/stderr パイプの親側で重複I/O(非同期I/O)を有効化し、ブロッキング読み取りでスレッドプール スレッドを消費するのを回避します。子プロセス側は同期のまま維持し、GetStdHandle() との互換性を保証します。
// stdin: 常に同期(parentInputs=true → asyncRead=false)
CreatePipe(out parentInputPipeHandle, out childInputPipeHandle, true);
// stdout/stderr: 常に親側で非同期/重複I/O(parentInputs=false → asyncRead=true)
CreatePipe(out parentOutputPipeHandle, out childOutputPipeHandle, false);
変更内容
- Process.Windows.cs:
CreatePipeメソッドを簡略化し、parentInputsパラメータが直接asyncReadを制御するよう変更。stdout/stderr は無条件に重複読み取りハンドルを取得します。環境変数DOTNET_SYSTEM_DIAGNOSTICS_PROCESS_DISABLE_ASYNC_READSでオプトアウト可能。 - SafeFileHandle.Windows.cs: 非同期I/O用の名前付きパイプ作成パラメータを調整。
\\.\pipe\LOCAL\プレフィックス(AppContainer対応)、16KB バッファサイズ(4×4096)、120秒のデフォルトタイムアウトを設定。 - FileStream 構築: ハードコードされた
falseの代わりにhandle.IsAsyncを使用し、ストリームの非同期モードをハンドルの実際の重複モードに合わせます。 - 新テスト追加:
Start_Redirect_StandardHandles_UseRightAsyncModeで、Windows上で親のstdout/stderr ハンドルが非同期、子のハンドルが常に同期であることを検証。
パフォーマンスへの影響
改善: 多数のプロセスがstdout を並行実行する場合、スループットがほぼ2倍に向上(19.79秒 → 9.14秒)。
懸念: 同期読み取り(ReadOutputToEnd)は重複I/Oのオーバーヘッドにより若干低下。ReadOutputLineByLine および ReadOutputToEndAsync は回帰なし。
関連Issue
その他
- Unix環境は
System.IO.Pipesを使用しているため、この修正は不要。 - 子プロセス側は
FILE_FLAG_OVERLAPPEDなしで開かれた書き込みハンドルの複製であり、常に同期です。 - AppContainer(Windows 10 v1709+)サポートのため、名前付きパイプは
\\.\pipe\LOCAL\プレフィックスを必須としています。
#125636 Reduce backtracking for greedy loops followed by subsumed literals
- 作成者: @stephentoub
- 作成日時: 2026年03月16日 21:24:21(UTC)
- マージ日時: 2026年03月18日 21:54:13(UTC)
- ラベル: area-System.Text.RegularExpressions
概要
正規表現エンジンで、貪欲なループ(\w+、\d+ など)の後に、そのループのクラスに含まれるリテラルが続き、さらにその後が不連続パターンの場合、バックトラッキングを最適化するパフォーマンス改善です。例えば \b\w+n\b では、\w+ の最後の位置だけが成功可能なため、繰り返される LastIndexOf 呼び出しをスキップできます。
変更内容
- RegexNode.cs:
CanReduceLoopBacktrackingToSinglePositionメソッドを追加し、最適化が適用可能かを判定。FindNextNodeInSequenceヘルパーを新規作成してツリー走査ロジックを共通化。IsKnownWordClassSubsetを新しいRegexCharClass.IsSubsetOfに置き換え。 - RegexCharClass.cs: 汎用的な
IsSubsetOf(subset, superset)ヘルパーを導入し、IsKnownWordClassSubsetを削除。 - RegexCompiler.cs: IL コンパイラで単一位置バックトラック最適化に対応し、
Oneリテラルに加えてMultiリテラルもサポート。繰り返されるLastIndexOfの代わりに直接位置チェックを実行。 - RegexGenerator.Emitter.cs: IL コンパイラの変更をソースジェネレータ エミッターに反映。
- Regex.Match.Tests.cs: 境界、アンカー、マルチリテラル、グループラッピングなどのシナリオをカバーするテストケースを追加。
パフォーマンスへの影響
該当パターンでの LastIndexOf 呼び出し回数削減により、バックトラッキング時の実行速度が改善。特にループが多くの文字を消費する場合に効果的。具体的なベンチマーク数値は提供されていません。
関連Issue
なし
その他
内部実装の最適化であり、公開 API の変更なし。後方互換性に影響なし。
#125621 [cDAC] Remove reflection from register access in ContextHolder
- 作成者: @max-charlamb
- 作成日時: 2026年03月16日 16:33:17(UTC)
- マージ日時: 2026年03月18日 17:04:22(UTC)
- ラベル: area-Diagnostics-coreclr
概要
cDAC(Compact Diagnostic Access Component)のスタックウォーク機能において、ContextHolder<T>の反射ベースのレジスタアクセスを削除し、各プラットフォーム固有のコンテキスト構造体での明示的な切り替え実装に置き換えました。これにより、AOTトリミング互換性を改善し、ホットパスのパフォーマンスオーバーヘッドを削減します。
変更内容
ContextHolder.cs: 反射コード(
System.Reflection、[DynamicallyAccessedMembers]、GetField())を削除し、IPlatformContext実装への委譲に変更。Sealedクラス化。IPlatformContext.cs / IPlatformAgnosticContext.cs: レジスタアクセスAPIを拡張。
TrySetRegister/TryReadRegisterをレジスタ名と番号両方のオーバーロードで追加。Targetパラメータを削除。AMD64Context.cs、ARM64Context.cs、ARMContext.cs、X86Context.cs、RISCV64Context.cs、LoongArch64Context.cs: 各アーキテクチャのレジスタ名マッピングを実装。
string.Equals(..., StringComparison.OrdinalIgnoreCase)による割り当て不要な大文字小文字区別無しマッチングと、ABI/PE仕様に準拠したswitchベースの番号ディスパッチを採用。アンワインダー(AMD64Unwinder.cs、ARMUnwinder.cs、ARM64Unwinder.cs、LoongArch64Unwinder.cs、RISCV64Unwinder.cs): 重複していたレジスタフィールドアクセスの
switch式を削除し、TrySetRegister(int)/TryReadRegister(int)呼び出しに統一。エラーハンドリングは保持(AMD64/ARM64/ARMは無効なレジスタ番号でArgumentOutOfRangeExceptionを投げ、LoongArch64/RISCV64はサイレント無視)。BaseFrameHandler.cs: レジスタ更新ロジックを新しい
TrySetRegister/TryReadRegisterシグネチャに対応。PlatformContextTests.cs: 全6アーキテクチャにおけるレジスタ番号ラウンドトリップと範囲外動作のテスト追加。
パフォーマンスへの影響
反射削除による改善:
typeof(T).GetField()とSetValueDirect/__makerefの反射呼び出しを排除。ホットパスから反射オーバーヘッドを完全削除。割り当て削減:
ToLowerInvariant()による文字列割り当てを排除し、OrdinalIgnoreCase比較で大文字小文字区別無しマッチングを実現。レジスタアクセス時のGCプレッシャー軽減。コード最適化:
switchベースのディスパッチはJITにより最適化されやすく、直接フィールドアクセスに展開される可能性が高い。
関連Issue
なし
その他
AOT互換性: 反射除去により、AOTトリミングで
[DynamicallyAccessedMembers]が不要となり、アセンブリトリミングの対象外化。コード重複削減:
#125571 [main] Update dependencies from dotnet/hotreload-utils, dotnet/icu, dotnet/runtime-assets
- 作成者: @dotnet-maestro[bot]
- 作成日時: 2026年03月15日 02:02:15(UTC)
- マージ日時: 2026年03月18日 16:25:01(UTC)
- ラベル: area-codeflow
概要
dotnet/runtime の依存関係を更新するPullRequestです。dotnet/icu、dotnet/hotreload-utils、dotnet/runtime-assets から複数のパッケージを最新版に更新しています。これは定期的な依存関係の同期を目的とした自動更新です。
変更内容
- eng/Version.Details.props: バージョン情報の更新(+18行/-18行)
- eng/Version.Details.xml: バージョン詳細情報の更新(+36行/-36行)
更新内容:
Microsoft.NETCore.Runtime.ICU.Transport: 11.0.0-alpha.1.26128.1 → 11.0.0-alpha.1.26167.1 (dotnet/icu)Microsoft.DotNet.HotReload.Utils.Generator.BuildTool: 11.0.0-alpha.0.25625.1 → 11.0.0-alpha.0.26159.1 (dotnet/hotreload-utils)- テストデータ関連パッケージ16個: 11.0.0-beta.26159.1 → 11.0.0-beta.26166.1 (dotnet/runtime-assets)
- Microsoft.DotNet.CilStrip.Sources、Microsoft.NET.HostModel.TestData、System.ComponentModel.TypeConverter.TestData、System.Runtime.TimeZoneData など
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
- 自動更新PR(dotnet-maestro[bot]による作成)
- Maestro依存関係管理システムを通じた定期同期
- ICU言語データ、ホットリロードユーティリティ、ランタイムテストアセットの更新を含みます
#125536 Add property and event parent lookup table entries in AddPropertyToPropertyMap and AddEventToEventMap
- 作成者: @tommcdon
- 作成日時: 2026年03月13日 20:42:57(UTC)
- マージ日時: 2026年03月18日 19:26:31(UTC)
- ラベル: area-Diagnostics-coreclr
概要
ホットリロード中に複数のメタデータ差分を適用する際に、既存型へのプロパティ/イベント追加と新しい型の作成が交互に行われると、System.ArgumentOutOfRangeException: Token 2000000 is not valid がスローされる問題を修正します。
根本原因は、AddPropertyToPropertyMapとAddEventToEventMapがインダイレクト(ポインタ)テーブルパスを使用する際に親ルックアップテーブルのキャッシュを更新していなかったため、FindParentOfPropertyHelperが古いキャッシュからRID 0を返してしまっていました。
変更内容
- src/coreclr/md/enc/metamodelrw.cpp
AddPropertyToPropertyMapのインダイレクトテーブルブランチにAddPropertyToLookUpTable呼び出しを追加AddEventToEventMapのインダイレクトテーブルブランチにAddEventToLookUpTable呼び出しを追加AddMethodToTypeDefとAddFieldToTypeDefで既に実装されていた同じパターンをプロパティとイベントに適用
パフォーマンスへの影響
影響なし(バグ修正のための機能追加)
関連Issue
その他
この修正は、Razorビューの再生成など[CreateNewOnMetadataUpdate]属性を使用するホットリロードシナリオにおいて安定性を向上させます。変更はランタイムのメタデータ処理(内部実装)に限定されており、公開APIへの影響はありません。
#125529 [release/10.0] Backport #125488: Add curl retry flags to wasi-sdk Linux download
- 作成者: @Copilot
- 作成日時: 2026年03月13日 17:35:39(UTC)
- マージ日時: 2026年03月18日 20:21:11(UTC)
- ラベル: Servicing-approved area-Infrastructure
概要
release/10.0ブランチにおいて、Linux環境でのwasi-sdk curl ダウンロード失敗を減らすため、curl コマンドにリトライフラグを追加するバックポート。レート制限やネットワーク遅延などの一時的なダウンロード失敗に対する耐性を向上させます。
変更内容
- src/mono/mono.proj: Linux向けwasi-sdk ダウンロード時のcurl呼び出しに以下のフラグを追加
--silent --show-error --fail --retry 3 --retry-delay 5- これにより、3回までのリトライが5秒間隔で実行され、エラー時の詳細情報が表示されます
パフォーマンスへの影響
影響なし。この変更はビルド信頼性の向上を目的としており、成功時の実行時間には影響を与えません。
関連Issue
#125488(main ブランチの元PR)
その他
- MSBuild
<Exec>要素への変更のみで、実装コード変更なし - 追加されるcurl フラグは業界標準で、main ブランチのPR #125488で既に検証済み
- リスク評価:非常に低い(インフラストラクチャ改善のみ)
#125525 Fix most of the diagnostic EH tests with interpreter
- 作成者: @janvorli
- 作成日時: 2026年03月13日 16:20:11(UTC)
- マージ日時: 2026年03月18日 12:14:12(UTC)
- ラベル: area-CodeGen-Interpreter-coreclr
概要
インタープリタでの例外処理(EH)診断テストのサポートを改善するPRです。デバッガスタックウォーク、例外インターセプション、IL↔ネイティブオフセットマッピングの動作をインタープリタに対応させることで、21個の診断EHテストのうち18個が成功するようになりました。また、最近のデバッグエラーハンドリング リファクタリングで発生していたLinux環境での退行も修正されています。
変更内容
- frames.h:
InterpreterFrame::GetInterception_Impl()を追加し、フォルト時の例外インターセプション状態をデバッガに報告 - exceptionhandling.cpp: インタープリタ対応のコードアドレス取得と
ICodeManager::ResumeAfterCatch経由での再開処理を実装 - compiler.h/cpp: IL→ネイティブマッピングに
STACK_EMPTYフラグを追加し、IL スタックが空の箇所を明示。例外インターセプションがリジューム地点を正確に検出できるよう改善 - dacdbiimpl.cpp:
InterpreterFrameが最初のフレームの場合、正確なコンテキスト抽出を実装。GetThreadContextが未実装の場合のフォールバック処理を改善 - dacdbiimplstackwalk.cpp:
System.Runtime.StackFrameIterator.*メソッドとInterpreterFrameを内部フレーム列挙時にスキップし、デバッガスタックトレースのノイズを削減
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
本PR により、インタープリタ下での例外処理診断機能がほぼ動作するようになりました。デバッガスタックウォーク時のコンテキスト抽出とフレーム列挙の精度が向上し、内部ヘルパーフレームが適切に非表示化されます。
#125482 [main] Update dependencies from dotnet/xharness
- 作成者: @dotnet-maestro[bot]
- 作成日時: 2026年03月12日 10:30:13(UTC)
- マージ日時: 2026年03月18日 16:34:06(UTC)
- ラベル: area-codeflow
概要
dotnet/xharnessの依存関係を更新するPull Requestです。XHarness関連パッケージを11.0.0-prerelease.26160.2から11.0.0-prerelease.26168.1にバージョンアップしています。
変更内容
.config/dotnet-tools.json: ツール設定の更新eng/Version.Details.props: バージョン詳細プロパティの更新eng/Version.Details.xml: バージョン詳細XMLの更新
更新対象パッケージ:
- Microsoft.DotNet.XHarness.CLI
- Microsoft.DotNet.XHarness.TestRunners.Common
- Microsoft.DotNet.XHarness.TestRunners.Xunit
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
このPRは自動化されたdotnet-maestro[bot]による依存関係更新で、dotnet/xharnessのmainブランチからの最新ビルド(20260318.1)に追従するものです。
#125471 Add a directive to asm files to manually inject a .note.GNU-stack section when using clang 22
- 作成者: @jtschuster
- 作成日時: 2026年03月12日 01:31:32(UTC)
- マージ日時: 2026年03月18日 17:23:31(UTC)
- ラベル: area-PAL-coreclr
概要
clang 22でコンパイルされたELF出力ファイルが実行可能スタックをリクエストしないようにするため、.note.GNU-stackセクションを明示的に出力する回避策を追加します。NO_EXEC_STACK_DIRECTIVEマクロを定義し、ELF + clang 22以上でビルドされるアセンブリファイルに追加しています。
変更内容
- マクロ定義:
src/coreclr/pal/inc/unixasmmacros.incおよびsrc/coreclr/nativeaot/Runtime/unix/unixasmmacros.incにNO_EXEC_STACK_DIRECTIVEマクロを定義(ELF + clang 22+のみ有効) - アセンブリファイル: CoreCLR VM/Runtime/PAL/Debug/NativeAOTの複数のアーキテクチャ(amd64、i386、arm64、arm、riscv64、loongarch64、s390x、ppc64le)のアセンブリファイル約160個に
NO_EXEC_STACK_DIRECTIVEを追加 - 修正:
src/coreclr/pal/src/arch/amd64/context.Sにunixasmmacros.incのincludeを追加(マクロが利用可能にするため) - 補足:
src/coreclr/runtime/i386/StubDispatch.SはNO_EXEC_STACK_DIRECTIVEを追加しましたが、必要なincludeが不足していた模様
パフォーマンスへの影響
影響なし
関連Issue
その他
この変更は内部実装(ランタイムアセンブリの生成方式)に関するもので、公開APIへの影響はありません。clang 22特有の問題への対処であり、条件付きで適用されます。
#125455 [wasm][interpreter] Defer managed calli cookie resolution to execution time
- 作成者: @radekdoulik
- 作成日時: 2026年03月11日 20:26:29(UTC)
- マージ日時: 2026年03月18日 13:12:11(UTC)
- ラベル: arch-wasm area-CodeGen-Interpreter-coreclr
概要
WebAssembly インタープリタにおいて、マネージド calli 命令のクッキー解決をコンパイル時から実行時に遅延させる変更です。ポータブルエントリポイント上の全マネージド/FCall calli 呼び出しについて、コンパイル時にクッキーを計算する代わりに実行時に MethodDesc から解決することで、デリゲートシャッフルサンクの対応が可能になり、約40シグネチャ分のハードコード化されたスタブが不要になります。
変更内容
- compiler.cpp: ポータブルエントリポイント上のマネージド/FCall calli では NULL クッキーを渡し、実行時に MethodDesc から解決するよう変更。PInvoke は従来通りコンパイル時にクッキーを計算
- interpexec.cpp: マネージド calli 実行時に、ポータブルエントリポイントの MethodDesc からクッキーを導出し、解釈メソッドは CALL_INTERP_METHOD で、FCall/Newobj はネイティブエントリポイント経由で InvokeCalliStub を呼び出し
- precode_portable.cpp/hpp: ネイティブエントリポイントと MethodDesc の両方を持つポータブルエントリポイント初期化メソッド
Init(void* nativeEntryPoint, MethodDesc* pMD)を追加 - jitinterface.cpp/RuntimeHelpers.CoreCLR.cs/corelib.h: Newobj ヘルパーに対応するダミー InternalCall メソッド
NewobjHelperDummy(IntPtr) -> objectを追加し、MethodDesc を持つよう対応 - callhelpers-interp-to-managed.cpp/ManagedToNativeGenerator.cs: ハードコード化された missingCookies テーブル(40シグネチャ)と対応する約288行の事前生成スタブを削除
パフォーマンスへの影響
バイナリサイズ削減:約288行の事前生成 interp-to-native スタブ削除により、WebAssembly ビルドでの静的スタブ生成コストが低減。実行時のクッキー解決は MethodDesc から直接導出されるため、シグネチャトークンルックアップを経由する場合よりも効率的と考えられます。
関連Issue
その他
内部実装の変更で、公開API への影響なし。ただし PortableEntryPoint の初期化パターンの拡張により、インタープリタとネイティブコード間の相互運用が改善されます。
#125139 Fix GetValue<object>() and TryGetValue<JsonElement?> on JsonValueOfJsonPrimitive types
- 作成者: @Copilot
- 作成日時: 2026年03月03日 18:00:32(UTC)
- マージ日時: 2026年03月18日 16:07:59(UTC)
- ラベル: area-System.Text.Json
概要
.NET 10で導入されたJsonValueOfJsonString、JsonValueOfJsonBool、JsonValueOfJsonNumberがGetValue<object>()とTryGetValue<JsonElement?>()でInvalidOperationExceptionをスローする回帰バグを修正します。これらの型のTryGetValue<T>メソッドがtypeof(T) == typeof(object)とtypeof(T) == typeof(JsonElement?)のチェックを欠いていたことが原因です。
var reader = new Utf8JsonReader("\"Hello World!\""u8);
reader.Read();
var node = converter.Read(ref reader, typeof(JsonNode), options);
// .NET 10: 修正前は InvalidOperationException をスロー
// .NET 9: 正常に動作
var o = node.GetValue<object>();
変更内容
- JsonValueOfJsonPrimitive.cs: 3つの型(
JsonValueOfJsonString、JsonValueOfJsonBool、JsonValueOfJsonNumber)のTryGetValue<T>メソッドにtypeof(T) == typeof(object)とtypeof(T) == typeof(JsonElement?)のチェックを追加。GetValue<object>()は全ての型で後方互換性を維持するためJsonElementを返すよう統一 - JsonValueTests.cs: 既存の
TryGetValue_From*テストにTryGetValue<object>アサーションを追加し、新たにGetValue_Object理論テスト(全プリミティブ種別のコンバーター経由での変換検証)とTryGetValue_NullableTypes_Deserializedテスト(JsonElement?および各nullableなプリミティブ型をカバー)を追加
パフォーマンスへの影響
影響なし
関連Issue
その他
- .NET 9の
JsonValueOfElementではValue is TypeToConvertパターンマッチングで暗黙的にJsonElement、JsonElement?、objectを処理していたが、新しい3つの型では明示的なチェックが必要 GetValue<object>()は全プリミティブ型でJsonElementを返す設計(.NET 8・9との互換性維持)
#124902 Migrate Windows build pools from VS2026 preview scout to production VS2026 image
- 作成者: @Copilot
- 作成日時: 2026年02月26日 14:48:49(UTC)
- マージ日時: 2026年03月18日 20:20:48(UTC)
- ラベル: area-Infrastructure-libraries
概要
Windows ビルドエージェントプールを Visual Studio 2026 Preview Scout イメージから安定版の VS2026 本番イメージに移行するビルドインフラストラクチャ更新です。プレビュー/スカウトイメージ参照を削除し、本番対応のイメージ名(内部ビルド:windows.vs2026.amd64、公開ビルド:windows.vs2026.amd64.open)に統一します。
変更内容
eng/pipelines/common/xplat-setup.yml— 公式(内部)および公開 Windows ビルドプール参照を本番 VS2026 イメージに更新eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml— OneFuzz ファジング展開ジョブを本番 VS2026 イメージに更新eng/pipelines/libraries/stress/ssl.yml— SSL ストレステスト Windows ジョブを本番 VS2026 イメージに更新eng/pipelines/libraries/stress/http.yml— HTTP ストレステスト Windows ジョブを本番 VS2026 イメージに更新
パイプライン設定ファイルのみの変更で、ランタイムコード自体への影響はありません。
パフォーマンスへの影響
影響なし
関連Issue
その他
- 本番 VS2026 イメージは Preview Scout イメージと比較して安定性と長期サポート(LTS)を提供します
- VMR(Visual Studio Marketplace Repository)での対応作業:dotnet/dotnet#4320
#124842 Handle Capture nodes in TryGetOrdinalCaseInsensitiveString
- 作成者: @danmoseley
- 作成日時: 2026年02月25日 02:33:20(UTC)
- マージ日時: 2026年03月18日 01:25:19(UTC)
- ラベル: area-System.Text.RegularExpressions
概要
TryGetOrdinalCaseInsensitiveStringメソッドがCaptureノードを透過的に処理し、ネストされたConcatenateノードを再帰的に探索するよう改善しました。これにより、\b(in)\b(IgnoreCaseオプション)のようなパターンが、単一文字列による高速なLeadingString_OrdinalIgnoreCase_LeftToRight戦略を使用できるようになります。
変更内容
- RegexNode.cs:
TryGetOrdinalCaseInsensitiveStringメソッドを修正し、Captureノードをスキップして内部のConcatenateを再帰的に処理。既存のFindPrefixesCoreと同じ動作に統一 - RegexPrefixAnalyzer.cs: 関連する軽微な変更(1行の修正)
- RegexFindOptimizationsTests.cs: キャプチャグループがordinal ignore-case接頭辞検出を妨げないことを検証する82行のテストケースを追加
パフォーマンスへの影響
改善あり: ソースジェネレーション時のコード生成が最適化され、複数の大文字小文字バリアント(["IN", "iN", "In", "in"]の4パターン)を検索する処理から、単一文字列"in"に対するOrdinalIgnoreCase比較へと簡素化されます。これにより、実行時の検索効率が向上します。
関連Issue
#124736(コードジェン差分で観測された問題)のフォローアップ
その他
この変更は正規表現エンジンの内部実装(RegexNodeの処理ロジック)に関するもので、公開APIは影響を受けません。既存のコードとの互換性への影響なし。
#124699 Fix: Allow inline regex options in conditional expression branches
- 作成者: @danmoseley
- 作成日時: 2026年02月21日 04:37:34(UTC)
- マージ日時: 2026年03月18日 16:09:23(UTC)
- ラベル: area-System.Text.RegularExpressions
概要
正規表現パーサーが条件式の yes/no ブランチ内でインラインオプション(例:(?i))を拒否していた問題を修正しました。これは .NET Framework からのリグレッションで、(?(test)(?i)yes|no) のような構文が Unrecognized grouping construct エラーを発生させていました。
修正は RegexParser.ScanGroupOpen() で ChildCount() > 0 チェックを追加し、テスト式が未追加の場合(ChildCount == 0)のみオプションをブロックし、ブランチ内(テスト式追加後)でのオプション使用を許可するものです。
変更内容
- RegexParser.cs:
_group.Kind == ExpressionConditionalの条件に_group.ChildCount() > 0の追加チェックを実装。これにより、条件式のテスト部分ではなくブランチ部分でのインラインオプション使用を許可。 - Regex.Match.Tests.cs: インラインオプションを含む 5 つのテストケースを追加(式条件、後方参照条件、先読み条件、オプショングループ構文、no-ブランチのオプション)。
- RegexParserTests.netcoreapp.cs: 1 つのテストケースを追加。
パフォーマンスへの影響
影響なし
関連Issue
その他
- すべての既存正規表現テスト(30,801 件)が net11.0 でパスすることを確認。
- .NET Framework 4.8.1 のテスト結果でも同様のパターンが有効であることが確認され、リグレッション判定が妥当であることが検証されました。
BackreferenceConditional(例:(?(1)(?i)yes|no))ではこの制限が適用されていなかったため、ExpressionConditionalへの制限が意図しない副作用であることが確認されました。
#124604 [clr-ios] Add options to strip inlining and debug info in Crossgen2 on Apple mobile
- 作成者: @kotlarmilos
- 作成日時: 2026年02月19日 16:36:36(UTC)
- マージ日時: 2026年03月18日 12:55:35(UTC)
- ラベル: area-crossgen2-coreclr os-ios
概要
Crossgen2に--strip-inlining-info、--strip-debug-info、--strip-il-bodiesオプションを追加し、Apple mobileプラットフォームで自動的に有効化することで、composite R2R dylib出力サイズを削減します。MAUI template appでは2.2 MBのサイズ削減を実現します。
変更内容
- Crossgen2RootCommand.cs: 新しいCLIオプション(
--strip-inlining-info、--strip-debug-info、--strip-il-bodies)を定義・登録 - Program.cs: パースされたCLIフラグを
NodeFactoryOptimizationFlagsに連携 - ReadyToRunCodegenNodeFactory.cs: ストリップフラグが設定されている場合、R2Rのinliningおよびdebugセクションの生成をスキップ
- CopiedMethodILNode.cs: IL body strippingを実装し、対象メソッドに対して最小限のスタブボディを生成
- Microsoft.NET.CrossGen.targets: MSBuildでApple mobile RIDに対してcrossgen2ストリップフラグを自動付与するロジックを追加
- Resources.resx: 新しいcrossgen2スイッチのオプション説明を追加
パフォーマンスへの影響
composite R2R dylib出力サイズが2.2 MB削減(MAUI template appでの実測値)。デバッグ情報とinlining情報の除去により、バイナリサイズは削減されますが、実行時パフォーマンスへの詳細な影響は提供情報に記載なし。
関連Issue
なし
その他
- 破壊的変更はなく、新オプションはApple mobile RIDで自動有効化されます
- 内部実装(
NodeFactoryOptimizationFlags)への変更であり、公開APIへの影響なし - MSBuild統合により、ユーザーは明示的なオプション指定なしにサイズ最適化が適用されます
#118207 Optimize Version JSON deserialization with UTF-8 parsing
- 作成者: @Copilot
- 作成日時: 2025年07月30日 13:01:33(UTC)
- マージ日時: 2026年03月18日 15:42:23(UTC)
- ラベル: area-System.Text.Json
概要
Version JSON逆シリアル化のパフォーマンス最適化PR。主な変更は、先頭のプラス記号の検証を削除してVersion.Parseの動作に合わせ、UTF-8パースのサポートを追加することで、UTF-8→UTF-16のトランスコーディングオーバーヘッドを排除します。.NET 11+ではUTF-8バイト直接パースにより、中間バッファの割り当てを削除し、スループットを向上させます。
変更内容
- VersionConverter.cs: 先頭プラス記号の検証削除、条件付きstackallocおよびArrayPoolを使用したバッファ割り当ての改善、ホワイトスペース検証への変更、UTF-8最適化の実装(
Version.TryParse(ReadOnlySpan<byte>)の活用)、IsWhiteSpaceByteヘルパー追加 - Value.ReadTests.cs:
"+1.1"テストケースを失敗ケースから成功ケースに移動、ホワイトスペース検証カバレッジ追加
パフォーマンスへの影響
改善あり
- ゼロコピーパース: Version文字列がUTF-8バイトから直接パースされ、UTF-16へのトランスコーディングが不要になる
- 割り当て削減: 中間char バッファの割り当てが排除される
- スループット向上: 高ボリュームなJSON逆シリアル化シナリオで特に有効(
.NET 11+)
関連Issue
その他
- 先頭・末尾のホワイトスペースは引き続き拒否(一貫性維持)
- 内部ホワイトスペース(例:
"1 .1")は正常に動作 - 先頭プラス記号を含む文字列(例:
"+1.1")は新たに正常に逆シリアル化される - System.Text.Json内の他の値コンバータでも同様のUTF-8最適化が候補(Byte、Int16/32/64/128、Decimal、Guid等)