Pull Request on 2026年03月20日

dotnet/runtimeにマージされたPull RequestをAIで日本語要約

注意点

このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。


目次

  1. #125843 Update EgorBot skill note about content between command and code block
  2. #125842 Require AI-generated content disclosure in copilot instructions and skills
  3. #125841 Fix cDAC dump tests on 32-bit ARM targets
  4. #125839 Remove ProcessStartOptions type, update ref, src and tests
  5. #125831 JIT: Disable continuation reuse temporarily
  6. #125829 Revert "[release/9.0] Fix intermediate artifact upload collisions for NativeAOT and Mono"
  7. #125822 Fix emcc version parsing failure on clean WASM builds
  8. #125814 Add retry for StackTraceTests.ToString_ShowILOffset AMSI hang
  9. #125813 Fix OleTxTests.Recovery CI timeout by bounding remote process wall-clock time
  10. #125812 Fix issue where i32.trunc_sat_f32_s wasn't properly encoded
  11. #125811 Fix ProcessThreadTests.TestStartTimeProperty flakiness due to /proc visibility race
  12. #125796 Fix bug in TraverseEhInfo
  13. #125772 [QUIC] Disable platform tests as well
  14. #125715 [release/9.0-staging] use AZL3 instead of Ubuntu for builds
  15. #125653 Fix inner build of community archs
  16. #125631 Use SHash as DAC instance hash
  17. #125594 [Wasm RyuJit] eh flow
  18. #125582 Fix broadcast output shape computation in tensor binary operations
  19. #125555 Fix IndexOutOfRangeException in FrozenHashTable when creating from huge collections
  20. #125545 Improve UnwindInfoTable's performance
  21. #125507 Consolidate overlapped I/O non-Windows stubs; remove stale ILLink workaround; remove incorrect [RequiresUnsafe] annotations
  22. #125416 Enable GC regions on macOS
  23. #125288 Add cDAC API GetCCWData
  24. #124893 Fix possible deadlocks on PosixSignalRegistration disposal on Windows
  25. #124645 Add JsonNamingPolicyAttribute for member-level naming policies in System.Text.Json
  26. #124628 Vectorize RegexInterpreter opcode loops for Oneloop, Onerep, Notonerep, and MatchString
  27. #124354 Add support for async thunk methods in GetNativeCodeInfo
  28. #122950 Support constructors with byref parameters (in/ref/out) in System.Text.Json
  29. #122274 Avoid writing jitdump code for block data

#125843 Update EgorBot skill note about content between command and code block

  • 作成者: @stephentoub
  • 作成日時: 2026年03月20日 15:59:35(UTC)
  • マージ日時: 2026年03月20日 16:57:08(UTC)
  • ラベル: area-skills

概要

EgorBotスキルの使用方法に関するドキュメントを更新し、@EgorBotコマンドラインとコードブロック間にテキストを挿入しないよう明確化しました。コマンドと処理コード間に挿入されたテキストはコマンド引数として解釈されてしまうため、その旨を警告として追加しています。

変更内容

  • .github/skills/performance-benchmark/SKILL.md: EgorBotの使用方法に関する注釈(NOTE)を拡張し、@EgorBotコマンドラインとベンチマークコードブロック間にテキストを配置してはいけないという警告を明示的に追加(+4行、-1行、合計5行)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPRはGitHub Copilotの支援を受けて生成されました。ドキュメント更新のみで、コード機能への変更はありません。


#125842 Require AI-generated content disclosure in copilot instructions and skills

  • 作成者: @stephentoub
  • 作成日時: 2026年03月20日 15:51:04(UTC)
  • マージ日時: 2026年03月20日 17:36:29(UTC)
  • ラベル: area-skills

概要

dotnet/runtimeリポジトリにおいて、Copilotがユーザー認証情報を使用してGitHubに投稿するコンテンツに対して、AI/Copilot生成であることを明示する開示ルールを追加しました。ボットアカウントやCopilotアプリアカウントからの投稿、またはユーザーの明示的なオプトアウトの場合は例外として扱われます。

変更内容

  • .github/copilot-instructions.md — 「AI-Generated Content Disclosure」セクションを新規追加し、統一的な開示ルールと例外条件(ボット/Copilotアカウント、ユーザーオプトアウト)を定義。
  • api-proposal — 既存の免責事項を統一的な開示用語に更新。
  • ci-analysiscode-reviewissue-triagevmr-codeflow-statusperformance-benchmark — 各スキルに開示ルールを追加。
  • add-new-jit-ee-apijit-regression-test — GitHub投稿機能がないため変更なし。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

設計上の特徴:

  • 柔軟な形式: 具体的なテンプレートは指定されず、簡潔で視認可能な注記(例:> [!NOTE])が必須
  • ユーザーオプトアウト: ユーザーが明示的に要求すれば開示の省略を許可
  • ボット/Copilot例外: 認識済みのボットまたはCopilotアプリアカウントからの投稿ではAI生成の出自が既に明らかなため不要

#125841 Fix cDAC dump tests on 32-bit ARM targets

  • 作成者: @max-charlamb
  • 作成日時: 2026年03月20日 15:35:53(UTC)
  • マージ日時: 2026年03月20日 18:51:44(UTC)
  • ラベル: area-Diagnostics-coreclr

概要

ClrMD の ELF32 シンボル解析バグ(microsoft/clrmd#1407)に対応するため、32ビット ARM ターゲットでの cDAC ダンプテストの失敗を修正します。ClrMD が 32ビット ELF モジュールのエクスポートシンボルアドレスを破損したアドレス(上位32ビットに st_size が混入)として返すため、ターゲットのポインタサイズが 4 バイトの場合にアドレスを 32ビットにマスクする対策を実施しました。

if (_dataTarget.DataReader.PointerSize == 4)
    address &= 0xFFFF_FFFF;

変更内容

  • src/native/managed/cdac/tests/DumpTests/ClrMdDumpHost.cs: GetExportSymbolAddress() の戻り値に対して、ターゲットのポインタサイズが 4 バイトの場合に 32ビットマスク処理を追加。ClrMD の上流バグを参照するコメントも含めました。

パフォーマンスへの影響

影響なし(テスト用のワークアラウンド修正のため)

関連Issue

microsoft/clrmd#1407

その他

  • このワークアラウンドは ClrMD の上流修正後に削除可能です
  • 検証済み: linux-arm32 クラッシュダンプに対して、cDAC ダンプテスト 103 個すべてがパス(90 パス、13 スキップ)、cDAC ユニットテスト 1274 個がすべてパス
  • 内部実装(テストホスト)の修正であり、公開 API への影響はありません

#125839 Remove ProcessStartOptions type, update ref, src and tests

  • 作成者: @Copilot
  • 作成日時: 2026年03月20日 15:25:38(UTC)
  • マージ日時: 2026年03月20日 18:42:50(UTC)
  • ラベル: area-System.Diagnostics.Process

概要

System.Diagnostics.Process名前空間からProcessStartOptions公開型を削除します。ソースコード、参照アセンブリ、テストおよびプロジェクトファイルから該当する型と関連リソース、テストケースをすべて削除する破壊的変更です。

変更内容

  • ソースコード: ProcessStartOptions.cs(255行)を削除
  • 参照アセンブリ: ref/System.Diagnostics.Process.csから型宣言を削除
  • リソース: FileNotFoundResolvePathリソース文字列を削除
  • テスト: ProcessStartOptionsTests.cs(179行)、ProcessStartOptionsTests.Windows.cs(199行)、ProcessStartOptionsTests.Unix.cs(169行)を削除
  • プロジェクトファイル: src および test の.csprojファイルから対応する<Compile>エントリを削除

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • すべてのビルドと既存345個のテストが合格しています
  • これは破壊的変更であり、ProcessStartOptions型に依存するコードは更新が必要になります

#125831 JIT: Disable continuation reuse temporarily

  • 作成者: @jakobbotsch
  • 作成日時: 2026年03月20日 13:46:24(UTC)
  • マージ日時: 2026年03月20日 16:32:17(UTC)
  • ラベル: area-CodeGen-coreclr runtime-async

概要

JIT async continuation reuse機能を一時的に無効化するため、JitAsyncReuseContinuations設定の既定値を有効(1)から無効(0)に変更しました。これにより、#125805と#125806で追跡されている障害をアンブロックします。

変更内容

  • src/coreclr/jit/jitconfigvalues.h: Release構成におけるJitAsyncReuseContinuationsの既定値を1から0に変更(ランタイムの内部実装)

パフォーマンスへの影響

async continuation reuse最適化が一時的に無効化されるため、async操作のパフォーマンスに若干の影響が生じる可能性があります。本変更は暫定的なもので、後続の対応を待機中です。

関連Issue

#125805#125806

その他

本PR作成者のコメント通り、月曜日までの時間がないため、問題の根本的な調査は後日に持ち越される予定。暫定的な修正となるため、今後の本格的な対応が必要。


#125829 Revert "[release/9.0] Fix intermediate artifact upload collisions for NativeAOT and Mono"

  • 作成者: @steveisok
  • 作成日時: 2026年03月20日 11:54:41(UTC)
  • マージ日時: 2026年03月20日 12:02:26(UTC)
  • ラベル: Servicing-approved area-Infrastructure-mono

概要

PR #125564の変更をRevertし、NativeAOTおよびMonoの中間成果物(intermediate artifacts)アップロードパスを、ジョブ固有から共有ディレクトリに戻すもの。runtime-official.yml内で、これら両技術の中間成果物が単一の共有サブディレクトリにアップロードされるように復元する。

変更内容

  • eng/pipelines/runtime-official.yml
    • NativeAOT中間成果物サブディレクトリ名をNativeAOTRuntimePacks(マトリックス修飾なし)に戻す
    • Mono中間成果物サブディレクトリ名を複数のMonoマトリックスジョブ/バリアントでMonoRuntimePacksに戻す
    • ワークロードパッケージダウンロードパターンをIntermediateArtifacts/MonoRuntimePacks/...(ワイルドカードなし)に更新
    • 1つの重複したパターンエントリが導入される

パフォーマンスへの影響

影響なし

関連Issue

#125564(Revert対象)

その他

このRevertにより、以前の中間成果物アップロード衝突の修正は取り消される。ビルド成果物パスの管理方針が共有ディレクトリに統一されることになる。


#125822 Fix emcc version parsing failure on clean WASM builds

  • 作成者: @ilonatommy
  • 作成日時: 2026年03月20日 08:47:50(UTC)
  • マージ日時: 2026年03月20日 11:33:54(UTC)
  • ラベル: arch-wasm area-Build-mono

概要

Clean WASM builds時に、Emscripten SDK提供フェーズで読み込まれた_VersionLinesが後続のemcc --version実行時にも残存し、バージョン解析に失敗する回帰を修正します。_VersionLinesRunWithEmSdkEnv実行前にクリアして、staleなバージョン情報の混在を防ぎます。

変更内容

  • src/mono/browser/browser.proj: _VersionLines item groupを RunWithEmSdkEnv 実行前にクリア(Clear メタデータ追加)し、emcc --versionの出力のみを確実に解析対象とするよう修正。合わせて、初回SDK提供時に_VersionLinesが汚染される可能性について説明するコメントを追加。

パフォーマンスへの影響

影響なし

関連Issue

#125822 を修正する変更

その他

  • 回帰原因: #123949で導入されたDependsOnTargets="AcquireEmscriptenSdk"が、初回ビルドで_VersionLinesを重複用途で流用させるようになったことが原因。
  • 影響範囲: Clean builds(src/mono/browser/emsdk/が未存在)のみ。その後のビルドでは SDK提供をスキップするため問題は発生しない。
  • パース失敗の詳細: 正規表現はemcc (description) X.Y.Z (hash)形式を想定するが、staleな3.1.56のみが渡されていた。

#125814 Add retry for StackTraceTests.ToString_ShowILOffset AMSI hang

  • 作成者: @danmoseley
  • 作成日時: 2026年03月20日 00:33:29(UTC)
  • マージ日時: 2026年03月20日 04:41:39(UTC)
  • ラベル: area-System.Diagnostics

概要

StackTraceTests.ToString_ShowILOffsetテストにおいて、Assembly.Load(byte[])がWindows Defender AMSI(マルウェア対策スキャンインターフェース)のRPC呼び出しをトリガーし、Helix CI環境の一部マシンで無限にハングする問題に対応。AMSI問題は.NETのバグではなくWindows OSレベルの外部問題であるため、テストの分割とリトライロジックを追加してCI安定性を向上。

変更内容

  • src/libraries/System.Diagnostics.StackTrace/tests/StackTraceTests.cs
    • Assembly.Load(byte[])ケースを専用のテストメソッドToString_ShowILOffset_ByteArrayLoadに分割
    • リトライロジック追加:最大3回の試行、各試行で30秒のRemoteExecutorタイムアウト
    • LoadFromとAssemblyBuilderの安定したケースは元のテストメソッドに残置
    • 各リトライ時に新しい子プロセスをRemoteExecutor経由で生成

パフォーマンスへの影響

影響なし(テスト実装の改善であり、製品コードのパフォーマンスに影響なし)

関連Issue

#125599
#122690(問題の根本原因診断)

その他

  • この問題は外部のWindows Defender RPC実装に起因する環境依存的なハングであり、.NETランタイム自体の不具合ではない
  • テスト分割により、AMSI問題の影響を隔離して、他の安定したテストケースへの波及を防止
  • RemoteExecutor各試行における30秒タイムアウトは、全体の60秒タイムアウトを超えないように設定されている

#125813 Fix OleTxTests.Recovery CI timeout by bounding remote process wall-clock time

  • 作成者: @Copilot
  • 作成日時: 2026年03月20日 00:24:14(UTC)
  • マージ日時: 2026年03月20日 21:52:27(UTC)
  • ラベル: area-System.Transactions

概要

OleTxTests.RecoveryテストがCI環境で無限にタイムアウトする問題を修正します。MSDTC(Microsoft Distributed Transaction Coordinator)が応答しない場合に子プロセスがハング状態になり、RemoteInvokeOptions.TimeOutがデフォルトでTimeout.Infiniteであるため、テストが完了しない状況を改善します。

RemoteInvokeOptionsTimeOut = 120_000(2分)を設定し、子プロセスを強制終了することでテストの実行時間を制限し、CI作業項目全体のタイムアウトを防ぎます。

変更内容

  • src/libraries/System.Transactions.Local/tests/OleTxTests.cs: RemoteInvokeOptionsTimeOut = 120_000を追加

パフォーマンスへの影響

影響なし。本変更はテスト実行時のハングを防ぐための制限値追加であり、正常系の実行時間に影響を与えません。むしろCI環境での不定期なタイムアウトによる作業項目全体の強制終了を防ぎます。

関連Issue

#122621

その他

  • 本修正はSystem.Transactions.Local.Tests内のテストのみに適用されます
  • テストはMSDTC環境が利用可能な場合にのみ実行されます
  • 2分後もなお応答がない場合、診断ダンプが半分の地点(1分時点)で生成される予定です
  • メインスレッドがハング状態にある場合、この修正では対応できず、その場合は別途対応(タイムアウト追加またはテストのスキップ)が必要になる可能性があります

#125812 Fix issue where i32.trunc_sat_f32_s wasn't properly encoded

  • 作成者: @davidwrighton
  • 作成日時: 2026年03月20日 00:22:43(UTC)
  • マージ日時: 2026年03月20日 18:16:22(UTC)
  • ラベル: arch-wasm area-CodeGen-coreclr

概要

WASM JIT コンパイラにおいて、プレフィックス付きオペコード(特に i32.trunc_sat_f32_s)のエンコーディングバグを修正します。セカンドバイトが 0x00 の場合に正しく2バイトで エンコードされていなかった問題を解決しました。

変更内容

  • src/coreclr/jit/emitwasm.cpp:
    • HasOpcodePrefix() 関数を追加し、プレフィックス付きWASMオペコード(0xFB/0xFC/0xFD)を識別
    • instrDesc::idCodeSize() でオペコードサイズ計算時に FitsIn<uint8_t> ではなくプレフィックス検出を使用
    • emitOutputOpcode() で1バイトと2バイトのオペコード出力判定にプレフィックス検出を使用

パフォーマンスへの影響

影響なし(コード生成の正確性修正であり、パフォーマンス面での変更ではありません)

関連Issue

#125812

その他

なし


#125811 Fix ProcessThreadTests.TestStartTimeProperty flakiness due to /proc visibility race

  • 作成者: @Copilot
  • 作成日時: 2026年03月20日 00:22:05(UTC)
  • マージ日時: 2026年03月20日 14:16:57(UTC)
  • ラベル: area-System.Diagnostics.Process

概要

ProcessThreadTests.TestStartTimePropertyはLinux/Monoで不安定でした。新しく起動したLongRunningスレッドの/proc/self/task/エントリが即座に表示されないことが原因です。1回のp.Refresh()Assert.Singleの組み合わせから、最大10回(100ms間隔)の制限付き再試行ループに変更し、スレッドが表示されるまでp.Refresh()を繰り返すようにしました。

int newThreadId = GetCurrentThreadId();

ProcessThread newThread = null;
for (int i = 0; i < 10 && newThread is null; i++)
{
    if (i > 0) Thread.Sleep(100);
    p.Refresh();
    newThread = p.Threads.Cast<ProcessThread>().FirstOrDefault(t => t.Id == newThreadId);
}

Assert.True(newThread is not null, $"Thread with id {newThreadId} was not found after retrying.");
Assert.InRange(newThread.StartTime.ToUniversalTime(), curTime - allowedWindow, DateTime.Now.ToUniversalTime() + allowedWindow);

変更内容

  • src/libraries/System.Diagnostics.Process/tests/ProcessThreadTests.cs: テストロジックを修正
    • 単一のp.Refresh()Assert.Singleから、最大900msの再試行ループに変更
    • FirstOrDefaultを使用して検索フェーズで誤った失敗を回避
    • スレッドIDは最初の再試行前に取得
    • スレッドが表示されない場合の説明的なエラーメッセージを追加
    • #104972で導入された正確なID マッチング処理を維持

パフォーマンスへの影響

影響なし(テストの信頼性向上のための変更)

関連Issue

#105526

その他

  • この修正により、Monoが誤ったスレッドIDを返す場合、再試行ループでも失敗し、実際の問題が表面化します。

#125796 Fix bug in TraverseEhInfo

  • 作成者: @rcj1
  • 作成日時: 2026年03月19日 20:26:08(UTC)
  • マージ日時: 2026年03月20日 00:54:09(UTC)
  • ラベル: area-Diagnostics-coreclr

概要

cDAC ExecutionManager の EEJitManager.GetExceptionClauses メソッドにおいて、例外ハンドリング情報の列挙時に、メソッドの実開始アドレスを正しく解決するバグを修正しました。GetRealCodeHeader に渡す前に FindMethodCode(...) を使用してコード開始アドレスを計算することで、他の EEJitManager ヘルパーメソッドとの動作を統一しています。

変更内容

  • ExecutionManagerCore.EEJitManager.cs: GetExceptionClauses メソッド内で、生の CodeBlockHandle アドレスの代わりに、FindMethodCode(...) で計算された codeStartGetRealCodeHeader(...) に渡すように変更
  • ExceptionHandlingInfoDumpTests.cs: テストケースを更新

パフォーマンスへの影響

影響なし

関連Issue

#125796

その他

内部実装の修正です。cDAC(Compact Debugging Access Component)の診断機能におけるメソッド開始アドレスの解決ロジックの改善であり、公開APIには影響しません。


#125772 [QUIC] Disable platform tests as well

  • 作成者: @ManickaP
  • 作成日時: 2026年03月19日 13:05:09(UTC)
  • マージ日時: 2026年03月20日 12:48:09(UTC)
  • ラベル: area-System.Net.Quic

概要

QUIC プラットフォーム検出テスト(MsQuicPlatformDetectionTests)がAzureLinux 3 VMs上で実行されないようにするためのテスト条件を追加します。MsQuicがメモリ不足エラー(QUIC_STATUS_OUT_OF_MEMORY)で失敗する環境でのテスト失敗を回避する目的です。

変更内容

  • src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicPlatformDetectionTests.cs: クラスレベルのテスト条件を追加し、AzureLinux 3 VMs上でのMsQuicPlatformDetectionTestsの実行をスキップするように変更

パフォーマンスへの影響

影響なし

関連Issue

#123216

その他

なし


#125715 [release/9.0-staging] use AZL3 instead of Ubuntu for builds

  • 作成者: @github-actions[bot]
  • 作成日時: 2026年03月18日 08:48:50(UTC)
  • マージ日時: 2026年03月20日 13:55:48(UTC)
  • ラベル: Servicing-approved area-Infrastructure

概要

release/9.0-stagingブランチにおいて、ビルドプラットフォームをUbuntuからAZL3(Azure Linux 3)に変更するバックポート。主にCI/CDパイプラインとSystem.Net.Quicテストの設定を更新します。

変更内容

  • eng/pipelines/common/xplat-setup.yml: ビルド設定でUbuntuをAZL3に置き換え(2行変更)
  • src/libraries/System.Net.Quic/tests/FunctionalTests/*.cs: 複数のテストファイル(8ファイル)でテスト対象プラットフォームをUbuntuからAZL3に更新(各1行変更)
  • src/libraries/System.Net.Quic/tests/FunctionalTests/QuicTestBase.cs: テスト基盤の変更(2行追加)

パフォーマンスへの影響

影響なし

関連Issue

#125544

その他

このPRはrelease/9.0-stagingブランチへのバックポートです。元のPRは#125544です。


#125653 Fix inner build of community archs

  • 作成者: @am11
  • 作成日時: 2026年03月17日 14:16:14(UTC)
  • マージ日時: 2026年03月20日 14:04:07(UTC)
  • ラベル: area-Infrastructure-coreclr community-contribution arch-loongarch64 arch-riscv

概要

RISC-V 64とLoongArch 64アーキテクチャの内部ビルド(CMake直接実行)失敗を修正します。CMakeの機能設定にFEATURE_DYNAMIC_CODE_COMPILED=1のアーキテクチャ別デフォルトが欠落していたため、Virtual Stub Dispatch(VSD)が無効化され、実装されていないアセンブリスタブへの未定義シンボルリンカエラーが発生していました。修正により、CMakeレベルで明示的にこれらのアーキテクチャにおいてVSD+動的コード生成を有効にし、トップレベルビルド(MSBuild経由)との一貫性を確保します。

変更内容

  • src/coreclr/clrfeatures.cmake: RISC-V 64/LoongArch 64に対してFEATURE_DYNAMIC_CODE_COMPILED=1を強制設定(9行追加)
  • asmconstants.h/asmhelpers.S/thunktemplates.S(RISC-V 64/LoongArch 64): アセンブリスタブの定義追加(各ファイル2行追加)
  • stubs.cpp(RISC-V 64/LoongArch 64): StubPrecode動的ヘルパーおよびキャッシュインターフェースディスパッチコアCLRスタブの実装追加/修正(35行追加・14行削除)

パフォーマンスへの影響

影響なし。本修正はビルド設定の正当化とアセンブリスタブ実装の補完であり、ランタイムのパフォーマンス特性は変わりません。

関連Issue

#125642

その他

  • 変更範囲は内部実装(ランタイムVM層のアーキテクチャ固有コード)に限定
  • RISC-V 64/LoongArch 64の両アーキテクチャに対して同一パターンで修正が適用
  • CMakeのデフォルト値設定によりMSBuildとの矛盾を解消するため、トップレベルビルドの既存動作に依存する必要がなくなります

#125631 Use SHash as DAC instance hash

  • 作成者: @hoyosjs
  • 作成日時: 2026年03月16日 19:05:20(UTC)
  • マージ日時: 2026年03月20日 23:28:45(UTC)
  • ラベル: area-Diagnostics-coreclr

概要

DacInstanceManager のハッシュテーブル実装を手書きの実装から SHash ベースの実装に置き換え。DAC がミニダンプ収集時に行う大量の検索操作の効率化により、深いスタック(2.5k フレーム、50スレッド)シナリオで約 9.5 倍の高速化を実現。

変更内容

  • src/coreclr/debug/daccess/dacimpl.h: std::unordered_map ベースの実装を SHash<DacInstanceSHashTraits> に置き換え。カスタム traits クラス DacInstanceSHashTraits を追加
  • src/coreclr/debug/daccess/daccess.cpp: ハッシュテーブル操作(AddFindSupersedeFlush など)を SHash API(LookupPtrReplacePtrRemoveRemoveAll など)に対応

パフォーマンスへの影響

改善: ミニダンプ収集で約 9.5 倍の高速化を実現。固定バケット配列による性能劣化が解消され、大量の検索・挿入操作が効率化される。特に深いスタックと多数のスレッドを含むシナリオで顕著。

関連Issue

なし

その他

  • 内部実装(ランタイムの DAC レイヤー)の変更
  • 公開 API への影響なし
  • #define DAC_HASHTABLE の削除により、以前の std::unordered_map 実装は完全に置き換わる

#125594 [Wasm RyuJit] eh flow

  • 作成者: @AndyAyersMS
  • 作成日時: 2026年03月16日 00:28:04(UTC)
  • マージ日時: 2026年03月20日 15:15:07(UTC)
  • ラベル: arch-wasm area-CodeGen-coreclr

概要

WebAssembly(Wasm)JITで例外処理後の制御フロー再開を実装する基盤整備を行うPRです。新しいfgWasmEhFlowフェーズにより、例外キャッチ後の継続フロー(continuation flow)をCFG/IRで明示化し、Wasm try_table命令による例外ハンドリングの生成をサポートします。

// 例外キャッチ後、制御変数を使用した分岐により適切な継続先へ遷移
// try_table命令でキャッチブロックを保護し、catch_refで例外参照を取得

変更内容

コア実装(例外フロー処理):

  • fgWasmEhFlowフェーズを追加:例外キャッチ後の制御変数と分岐ブロック、再スロー機構を生成
  • FlowGraphTryRegionsを追加:try領域の追跡とtry領域を考慮したRPO(Reverse Post-Order)走査の実装
  • GT_WASM_JEXCEPTGT_WASM_THROW_REFなどのWasm専用IRノードを導入

Wasm値型・命令・エミッタの拡張:

  • ExnRef値型を追加(registeropswasm.h/cpp)
  • try_tablecatch_refthrow_ref疑似命令を追加(instrswasm.h)
  • TRY_TABLECATCH_DECL命令フォーマットを追加(emitfmtswasm.h)
  • Wasm値型とイミディエート値のエンコーディングAPIを追加(emitwasm.h/cpp)

CFG・レイアウトの調整:

  • Wasm throw-helperの配置をWasm向けに調整
  • try領域を考慮したWasmインターバル拡張(Block/Loop/Tryの3種類)
  • try領域がループを跨ぐ場合、Wasmループの終端をtry保護範囲に合わせる

GenTree統合:

  • GT_WASM_JEXCEPTを条件付きジャンプとして扱う(gentree.h)
  • 新しいノードを比較・クローン・例外・表示ヘルパーに統合(gentree.cpp)
  • 副作用のあるノードとして扱い最適化で削除されないよう保護(liveness.cpp)

制御フロー:

  • GT_WASM_JEXCEPTを制御フロー命令として認識(fgstmt.cpp)

コード生成:

  • Try領域開始時にtry_tablecatch_refを発行(codegenwasm.cpp)
  • EHパターンのJTRUEの発行を抑止

パフォーマンスへの影響

影響なし

関連Issue

#121178

その他

本実装は完全ではなく、以下の点で改善予定:

  • 例外の再スロー処理がまだ不完全
  • 制御変数(将来的にはVirtual IPに進化予定)の設計がさらに変更される可能性あり
  • ランタイムがこの制御変数を設定して、特定のスタックフレームが現在の例外をキャッチしないことを示唆する機構は未実装

内部実装の変更であり、公開APIへの


#125582 Fix broadcast output shape computation in tensor binary operations

  • 作成者: @Copilot
  • 作成日時: 2026年03月15日 15:32:17(UTC)
  • マージ日時: 2026年03月20日 21:38:43(UTC)
  • ラベル: area-System.Numerics.Tensors

概要

テンソル二項演算(加算、乗算など)でブロードキャスト互換の異なるサイズの形状を持つテンソルに適用した場合、出力テンソルの形状が誤って計算される問題を修正しました。例えば、形状 [2, 3][2, 1] のテンソルを乗算する場合、期待される [2, 3] ではなく [2, 1] の形状で結果が返されていました。

変更内容

  • TensorOperation.cs: ValidateCompatibility メソッドを修正し、ブロードキャスト出力形状を各次元の要素ごとの最大値(右寄せアライメント後)で計算。従来のランク比較による単純な形状選択から、NumPyのブロードキャスティング規則に準拠したロジックに変更。小規模ランク(≤5)は stackalloc、大規模ランクは ArrayPool を使用。
  • TensorTests.cs: 無効化されていた「二重ブロードキャスト」テストケース(形状 [3] × [3, 1])を再有効化し、回帰テストケース([2, 3] × [2, 1])を追加。

パフォーマンスへの影響

影響なし。メモリ割り当て戦略は既存パターンに準拠(小規模ランクはスタック、大規模ランクはプール)。

関連Issue

#114ary(Pull Request説明に記載、リンク形式は不完全)

その他

  • 既存5389テストすべてがパスし、失敗はなし
  • 公開API(System.Numerics.Tensors ライブラリ)の動作修正であり、互換性への破壊的影響なし(正しい結果に修正されるため)

#125555 Fix IndexOutOfRangeException in FrozenHashTable when creating from huge collections

  • 作成者: @Copilot
  • 作成日時: 2026年03月14日 13:41:42(UTC)
  • マージ日時: 2026年03月20日 22:13:12(UTC)
  • ラベル: area-System.Collections

概要

大規模コレクション(約10億要素以上)からToFrozenSet()/ToFrozenDictionary()を作成する際に発生していたIndexOutOfRangeExceptionを修正しました。FrozenHashTable.CalcNumBucketsでのint型オーバーフローが原因でしたが、修正後は意図的にOutOfMemoryExceptionを発生させるようになります。

// 修正前: IndexOutOfRangeException
// 修正後: OutOfMemoryException(正しい失敗モード)
var frozen = new HashSet<int>(1_188_074_137) { ... }.ToFrozenSet();

変更内容

  • FrozenHashTable.cs:
    • CalcNumBucketsメソッドでminNumBucketsの計算時にlong型を使用してint型オーバーフローを防止
    • CreateメソッドでArrayPool.Rent(numBuckets + hashCodes.Length)呼び出し前にArray.MaxLengthチェックを追加(約1B以上要素でのintオーバーフロー防止)
  • FrozenSetTests.cs/FrozenDictionaryTests.cs: [OuterLoop]属性付きの回帰テスト追加(4M要素でテスト、約100MB)

パフォーマンスへの影響

影響なし

関連Issue

#125553

その他

  • 修正前の動作:約1.07B要素を超える場合にIndexOutOfRangeException(primes配列への無効アクセス)
  • 修正後の動作:同規模でのメモリ割り当て失敗時に明確なOutOfMemoryException
  • 回帰テストは実務的なCI環境(4M要素、~100MB)で実施
  • 整数オーバーフロー修正の境界値(>1.07B要素)は64GB環境で検証済み

#125545 Improve UnwindInfoTable's performance

  • 作成者: @eduardo-vp
  • 作成日時: 2026年03月14日 01:05:52(UTC)
  • マージ日時: 2026年03月20日 07:48:20(UTC)
  • ラベル: area-VM-coreclr

概要

Windows x64でのアンワインド情報発行のパフォーマンスを改善するPRです。UnwindInfoTableに保留中のバッファを追加し、RUNTIME_FUNCTIONエントリをバッチ処理してOS側の高コストなテーブル操作(RtlAddGrowableFunctionTable/RtlDeleteGrowableFunctionTable)の頻度を削減します。これによりJIT中の複数の同時コンパイルでのロック競合を緩和することが目的です。

変更内容

  • src/coreclr/vm/codeman.h: UnwindInfoTableに保留バッファフィールドを追加し、FlushPendingEntries()メソッドを宣言
  • src/coreclr/vm/codeman.cpp: バッファリングおよびフラッシュロジックを実装。単一ロックをUnwindInfoTablePublishLockUnwindInfoTablePendingLockの2つに分割し、ロック競合を軽減
  • src/coreclr/inc/CrstTypes.def: 新しいCrstロックタイプを定義し、ロック取得順序を指定
  • src/coreclr/inc/crsttypes_generated.h: 生成されたCrstマッピングを更新

パフォーマンスへの影響

OS側のテーブル再登録操作をバッチ化することで、エントリごとのロック取得コストと複数コンパイラによる競合を削減します。保留バッファへの書き込みはより軽いUnwindInfoTablePendingLockを使用するため、パブリッシング処理の高速化が期待されます。具体的なベンチマーク数値は提供されていません。

関連Issue

#123124

その他

レビューから指摘があります:PublishUnwindInfoForMethod内でAddToUnwindInfoTable()とその後のFlushPendingEntries()が連続実行される場合、両方でフラッシュ処理が発生するため、余分なロック取得が生じている可能性があります。フラッシング処理を1箇所に集約することが推奨されています。


#125507 Consolidate overlapped I/O non-Windows stubs; remove stale ILLink workaround; remove incorrect [RequiresUnsafe] annotations

  • 作成者: @Copilot
  • 作成日時: 2026年03月12日 18:48:01(UTC)
  • マージ日時: 2026年03月20日 20:46:46(UTC)
  • ラベル: area-System.Threading linkable-framework

概要

PreAllocatedOverlappedおよびThreadPoolBoundHandleの非Windows実装を統合し、プラットフォーム共通のPlatformNotSupportedスタブに置き換えます。非Windowsプラットフォーム(Unix、Browser、Wasi)ではオーバーラップドI/Oが未サポートであるため、別実装の必要がなくなります。また、古いILLinkディスクリプタワークアラウンドを削除し、不正な[RequiresUnsafe]アノテーションを除去しています。

変更内容

  • 新ファイル: PreAllocatedOverlapped.PlatformNotSupported.cs — 非Windowsで使用される新しいスタブ実装。コンストラクタとUnsafeCreatecallbackのnullチェック後にPlatformNotSupportedExceptionをスロー
  • 削除: PreAllocatedOverlapped.Unix.csPreAllocatedOverlapped.Browser.cs — 不要になったため削除
  • 削除: ThreadPoolBoundHandle.Unix.cs — 不要になったため削除
  • 更新: ThreadPoolBoundHandle.PlatformNotSupported.cs — プライベートコンストラクタにDebug.Fail("Unreachable")を追加
  • 更新: System.Private.CoreLib.Shared.projitems — Windows固有ファイルをTargetsWindows == trueセクションに移動し、非Windows条件をTargetsWindows != trueに統一。条件を簡素化し、ファイルを適切に並べ替え
  • 削除: ILLink.Descriptors.Shared.xml内の古いThreadPoolBoundHandle ILLinkディスクリプタワークアラウンド(mono/linker#649で修正済み)
  • 削除: Overlapped.csThreadPoolBoundHandle.Portable.csから不正な[RequiresUnsafe]アノテーションを除去
  • 更新: テスト — PreAllocatedOverlapped_NullAsCallback_ThrowsArgumentNullExceptionは全プラットフォーム対応に、他のテストはWindows固有にマーク

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

破壊的変更: 非WindowsプラットフォームでPreAllocatedOverlappedのコンストラクタは、nullcallbackに対してArgumentNullExceptionを先にスロー、その後PlatformNotSupportedExceptionをスロー。従来のUnix実装では不正な動作(コンストラクタが成功してメモリリーク)をしていたため、この変更は技術的には破壊的です。

内部実装の変更であり、公開APIの仕様は変わりません。


#125416 Enable GC regions on macOS

  • 作成者: @Copilot
  • 作成日時: 2026年03月10日 21:55:05(UTC)
  • マージ日時: 2026年03月20日 17:08:16(UTC)
  • ラベル: area-GC-coreclr

概要

GC regions(Windows/Linuxでのserver GC標準メモリモデル)をmacOSで有効化します。2022年に追加された!defined(__APPLE__)ガードを削除し、(!defined(HOST_APPLE) || defined(HOST_OSX))に置き換えることでmacOSのみ有効化し、大規模仮想アドレス空間予約をサポートしないiOS/tvOS/MacCatalystは引き続き無効化します。

変更内容

  • src/coreclr/gc/gcpriv.h: USE_REGIONSプリプロセッサガードの条件式を変更。!defined(__APPLE__)から(!defined(HOST_APPLE) || defined(HOST_OSX))へ修正し、macOS固有の有効化を実現。関連コメントと#endifアノテーションも更新。

パフォーマンスへの影響

GC regions有効化によるパフォーマンス改善が期待されます:

  • 動的ヒープカウント(DYNAMIC_HEAP_COUNT)の活用が可能に
  • マーク フェーズ プリフェッチ(MARK_PHASE_PREFETCH)の最適化が利用可能に
  • より効率的なメモリ管理により、特に大規模マルチコアシステムでのスループット向上が見込まれます

関連Issue

なし

その他

安全性の根拠:

  • クラッシュダンプサイズ: Linux上のMADV_DONTDUMP/MADV_DODUMP#if defined(MADV_DONTDUMP)でガード。macOS は読み取り不可能なPROT_NONEページを既にコアダンプから除外する仕様。
  • 仮想メモリ操作: gcenv.unix.cppVirtualReserveInnerVirtualCommitInnerVirtualDecommitはmacOSとLinuxで同じmmap/mprotectコードパスを使用。
  • テスト検証: 68,786テスト合格(System.Runtime 68,078 + System.Threading 708)、0失敗。
  • Apple非macOSプラットフォーム(iOS/tvOS/MacCatalyst)は引き続き除外。HOST_APPLE/HOST_OSXの区別はコードベースの既存パターン(例:pal/src/thread/context.cpp)と一貫性あり。

#125288 Add cDAC API GetCCWData

  • 作成者: @Copilot
  • 作成日時: 2026年03月07日 05:46:06(UTC)
  • マージ日時: 2026年03月20日 21:44:15(UTC)
  • ラベル: area-Diagnostics-coreclr

概要

cDAC(Compact Data Access Contract)の BuiltInCOM コントラクトに GetCCWData API を追加し、COM Call Wrapper(CCW)情報の取得を最適化しました。複数の個別読み取りを単一のデータ構造取得に統合することで、ターゲットメモリへのアクセス回数を削減します。

新しいAPI:

public TargetPointer GetObjectHandle(TargetPointer ccw);
public SimpleComCallWrapperData GetSimpleComCallWrapperData(TargetPointer ccw);
public TargetPointer GetStartWrapper(TargetPointer ccw);

変更内容

  • IBuiltInCOM インターフェース: SimpleComCallWrapperData 構造体を導入し、従来の GetRefCountIsHandleWeak を置き換える統合API を追加
  • BuiltInCOM_1 実装: SCCW(SimpleComCallWrapper)データの一括デコード処理を実装し、ラッパーナビゲーションヘルパーを追加
  • データ記述子更新: ComCallWrapper に Handle フィールド、SimpleComCallWrapper に OuterIUnknown フィールドを追加
  • SOSDacImpl: レガシ DAC の GetCCWData を新しい統合コントラクト呼び出しを使用して再実装
  • GC コントラクト: 複数の COM コントラクト呼び出しから単一の SCCW データ取得へ移行
  • テスト・ドキュメント: ユニットテスト、ダンプベーステスト、設計ドキュメントを更新

パフォーマンスへの影響

改善: ターゲットメモリへの読み取り回数を削減。従来は複数の個別プロパティ読み取りが必要だった箇所を、単一の GetSimpleComCallWrapperData 呼び出しで統合取得できるため、ディバッグ診断ツール(SOS)やメモリダンプ解析の効率が向上します。

関連Issue

なし

その他

  • ComRefcountMask グローバル定数が削除されました(使用されなくなったため)
  • レビュアーによるコメント: テスト内で TearOff 関連グローバルの設定方法に改善の余地がある(ポインタセルを適切に割り当てる必要がある)との指摘あり

#124893 Fix possible deadlocks on PosixSignalRegistration disposal on Windows

  • 作成者: @mrek-msft
  • 作成日時: 2026年02月26日 12:57:42(UTC)
  • マージ日時: 2026年03月20日 15:49:34(UTC)
  • ラベル: area-System.Runtime.InteropServices

概要

Windows上のPosixSignalRegistrationのデッドロック問題を修正します。マルチスレッド環境でハンドラ登録中に別スレッドがHandlerRoutineを実行する際、ロック(s_registrations)とKernelBase.dllのクリティカルセクション間のAB/BAデッドロックが発生していました。本修正は、コンソール制御ハンドラの一度限りの登録と登録解除の廃止により、デッドロックリスクを軽減します。

変更内容

  • PosixSignalRegistration.Windows.cs: s_isCtrlHandlerRegisteredOnceフラグを導入し、SetConsoleCtrlHandler(Add: true)の重複登録を防止。SetConsoleCtrlHandler呼び出しをs_registrationsロック外に移動してデッドロック回避。最後の登録が破棄されてもSetConsoleCtrlHandler(Add: false)による登録解除を実行しない仕様に変更(Windows固有)。
  • ConsoleLifetime.netcoreapp.cs: ハンドラを直接破棄可能となったため、ホスティング側でのハンドラ漏洩を排除。
  • ProcessTests.cs: PosixSignal関連の新規テストケースを追加(120行追加)。

パフォーマンスへの影響

影響なし。ただしデッドロック回避により、シャットダウン時のハング状態が解消されるため、信頼性が向上します。

関連Issue

#117753

その他

  • この変更はWindows環境に限定された修正です(Unixでの効果については言及されていません)。
  • ハンドラの登録解除を廃止することで、ハンドラがプロセス終了まで保持される点に留意してください。

#124645 Add JsonNamingPolicyAttribute for member-level naming policies in System.Text.Json

  • 作成者: @Copilot
  • 作成日時: 2026年02月20日 14:41:32(UTC)
  • マージ日時: 2026年03月20日 09:26:24(UTC)
  • ラベル: area-System.Text.Json

概要

System.Text.JsonにJsonNamingPolicyAttributeを追加し、型およびメンバーレベルでの命名規則の細粒度制御を実現します。これにより、グローバルなJsonSerializerOptions.PropertyNamingPolicyをオーバーライドできるようになります。

使用例:

[JsonNamingPolicyAttribute(JsonKnownNamingPolicy.CamelCase)]
public class MyPoco
{
    public string MyFirstProperty { get; set; } = "first";

    [JsonNamingPolicyAttribute(JsonKnownNamingPolicy.KebabCaseLower)]
    public string MySecondProperty { get; set; } = "second";
}

var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower };
JsonSerializer.Serialize(new MyPoco(), options);
// {"MyFirstProperty":"first","my-second-property":"second"}

変更内容

  • JsonNamingPolicyAttribute.cs: 新しい属性を追加。JsonKnownNamingPolicy用のパブリックコンストラクタと、カスタムJsonNamingPolicyサブクラス用の保護されたコンストラクタを提供
  • DefaultJsonTypeInfoResolver.Helpers.cs: DeterminePropertyNameメソッドで命名規則の優先順位を実装。メンバーレベル属性→型レベル属性→グローバルオプションの順序で解決
  • ソースジェネレータ (Parser.cs, KnownTypeSymbols.cs): コンパイル時に属性を解析。既知の命名規則は直接処理、カスタム派生属性はJsonKnownNamingPolicy.Unspecifiedにフォールバック
  • パブリックAPI (ref/System.Text.Json.cs): JsonNamingPolicyAttributeを公開API に追加
  • テスト: 反射ベースおよびソースジェネレータ経路での型レベル、メンバーレベル、混合、優先順位シナリオをカバー

パフォーマンスへの影響

影響なし。属性解析は型情報生成時の一度限りで、実行時シリアライズに追加のオーバーヘッドはありません。

関連Issue

#108232

その他

  • 優先順位: JsonPropertyName > メンバーレベルJsonNamingPolicyAttribute > 型レベルJsonNamingPolicyAttribute > JsonSerializerOptions.PropertyNamingPolicy > 元の名前
  • ソースジェネレータでカスタム派生属性が使用された場合、コンパイル時に解決できないため、ランタイムグローバルオプションの不正なオーバーライドを防ぐためメタデータ名を発行する仕様になっています

#124628 Vectorize RegexInterpreter opcode loops for Oneloop, Onerep, Notonerep, and MatchString

  • 作成者: @danmoseley
  • 作成日時: 2026年02月20日 07:13:03(UTC)
  • マージ日時: 2026年03月20日 00:00:51(UTC)
  • ラベル: area-System.Text.RegularExpressions

概要

RegexInterpreterの4つのオペコード(Oneloop、Onerep、Notonerep、MatchString)のホットパスをSIMD加速されたSpan操作に置き換えることで、正規表現マッチングの性能を大幅に向上させます。既存のNotoneloopベクトル化パターンを拡張し、左から右方向のマッチングのみを最適化します。

変更内容

RegexInterpreter.cs - 内部実装の最適化

  • Oneloop/Oneloopatomic (a+, a*): 文字ごとのループをIndexOfAnyExcept()に置き換え
  • Onerep (a{N}): 固定回数マッチをContainsAnyExcept()で高速化
  • Notonerep ([^x]{N}): 固定回数の否定マッチをContains()で高速化
  • MatchString (リテラル文字列): 文字列比較ループをSequenceEqual()で最適化

すべての最適化は左から右方向のマッチングのみに適用され、右から左方向(稀なケース)は未変更です。

パフォーマンスへの影響

顕著な改善 - 入力長とともにスケール:

パターン 短縮率
Oneloop a+ (64→256→1024文字) ~1.1x → ~2.1x → ~7x
Oneloop a* (256文字) ~3.3x
Onerep a{256} ~4.7x
Notonerep [^x]{256} ~7.2x
MatchString (52文字) ~1.8x
  • SIMD加速により16~32文字を一度に処理(従来は1文字ずつ)
  • 回帰なし、メモリ割り当て変更なし
  • 改善は入力長に比例

関連Issue

なし

その他

  • 公開API変更なし(内部実装のみ)
  • 破壊的変更なし
  • 左から右方向マッチングのみが対象(一般的なケース)で、右から左方向マッチングは従来ロジック維持

#124354 Add support for async thunk methods in GetNativeCodeInfo

  • 作成者: @tommcdon
  • 作成日時: 2026年02月12日 21:01:13(UTC)
  • マージ日時: 2026年03月20日 02:25:31(UTC)
  • ラベル: area-Diagnostics-coreclr runtime-async

概要

DacDbiInterfaceImpl::GetNativeCodeInfoがасинхронメソッドのネイティブコード情報取得時に、メソッドディフマップにキャッシュされたasync thunk(非同期サンク)ではなく、実際のasync実装メソッドのデータを返すように修正しました。ランタイムはデフォルトでメソッド参照の検索時にasync thunkをキャッシュするため、正しいメソッド情報が返されていない問題に対応しています。

変更内容

  • dacdbiimpl.cpp: GetNativeCodeInfoにasync thunk検出ロジックを追加し、実装メソッド取得処理を実装
  • method.hpp: async thunk検出用の新規メソッドIsAsyncThunkMethod()を追加(6行追加)
  • genmeth.cpp: async実装メソッド検索ロジックを拡張(32行追加/4行削除)
  • generics.cpp: 同様の検索ロジックを追加(9行追加)
  • instmethhash.cpp: メソッドハッシュ処理の調整(5行追加/2行削除)
  • CMakeLists.txt: ビルド設定の微調整(1行追加/1行削除)

変更は主に内部実装(VM層およびデバッグアクセス層)に限定され、公開APIへの影響はありません。

パフォーマンスへの影響

デバッグ時のメソッド情報取得で、async thunkに該当する場合にメソッドテーブルの全メソッドを反復する処理が追加されます。ただしIsDiagnosticsHidden()フィルタにより実装メソッドの特定時の走査範囲は限定されます。本番環境への影響はなし。

関連Issue

なし

その他

変更はデバッグ/診断機能に関連するもので、ランタイムのasync/await実装を利用する開発者への直接的な影響はありません。


#122950 Support constructors with byref parameters (in/ref/out) in System.Text.Json

  • 作成者: @Copilot
  • 作成日時: 2026年01月06日 23:49:21(UTC)
  • マージ日時: 2026年03月20日 17:57:36(UTC)
  • ラベル: area-System.Text.Json

概要

System.Text.Jsonがbyref修飾子(in/ref/out)付きのコンストラクタパラメータのdeserialization に対応しました。byref型(例:DateTime&)はジェネリック型引数として使用できず型検証に失敗していたため、基本型を抽出して処理するように修正されました。リフレクションベースとソース生成の両方で動作します。

// これが機能するようになりました
public class TestClass
{
    public TestClass(in DateTime dateTime, in TimeSpan timeSpan) { ... }
    public DateTime DateTime { get; set; }
    public TimeSpan TimeSpan { get; set; }
}

JsonSerializer.Deserialize<TestClass>(json);

変更内容

リフレクションベース:

  • ObjectConverterFactory.cs: byref型に対してGetElementType()を使用して基本型を抽出し、型検証とジェネリック変換器のコンストラクション時に使用
  • DefaultJsonTypeInfoResolver.Helpers.cs: JsonParameterInfoValuesに基本型を格納し、outパラメータをメタデータから除外
  • ReflectionEmitMemberAccessor.cs: byref値をローカル変数に格納してからアドレスを取得、コンストラクタに渡す(x86でのクラッシュ修正);outパラメータをデフォルト値で初期化
  • JsonTypeInfo.cs: コンストラクタパラメータが空の場合でも_parameterInfoValuesIndexを常に初期化

ソース生成:

  • ParameterGenerationSpec.cs: RefKindプロパティとArgsIndexプロパティを追加(パラメータrefキンドと位置を追跡)
  • JsonSourceGenerator.Parser.cs: IParameterSymbolからRefKindをキャプチャし、ArgsIndexを計算(outパラメータを除外)
  • JsonSourceGenerator.Emitter.cs: byrefパラメータの正しいコード生成(in:特別な処理なし、ref:一時変数+refキーワード、out:破棄パターン、ref readonly:一時変数+inキーワード)

テスト:

  • 様々なbyref修飾子の組み合わせをカバーする包括的なテストを追加
  • プリミティブ型、struct、参照型での動作確認
  • ソース生成出力ベースラインテストを追加

パフォーマンスへの影響

影響なし。byref型から基本型への変換はパイプラインの早段階で実行され、他のコードパスの既存動作は維持されます。

関連Issue

#46088

その他

  • 破壊的変更なし:この機能は制限事項の解除であり、既存の動作に影響なし
  • outパラメータの扱い:jsonからの値を受け取らず、コンストラクタがデフォルト値を受け取り、プロパティはセッター経由で設定される
  • リスク評価:低。変更はコンストラクタパラメータ処理パスに限定され、他のコードパスへの影響なし

#122274 Avoid writing jitdump code for block data

  • 作成者: @tommcdon
  • 作成日時: 2025年12月08日 02:25:11(UTC)
  • マージ日時: 2026年03月20日 02:22:59(UTC)
  • ラベル: area-Diagnostics-coreclr

概要

.NET 10で導入されたスタブ粒度の変更により、JITダンプがメモリコミット前にブロックデータを読み取ろうとして失敗する問題を修正します。ブロック割り当ての場合、JITダンプへのコード出力を抑制することで、linuxのperfツールがDOTNET_PerfMapEnabled設定を正しく処理できるようにします。

変更内容

  • src/coreclr/pal/src/misc/perfjitdump.cpp: PerfJitDumpState::LogMethodの処理を修正し、ブロック割り当て時にコード出力を回避するロジックを追加(8行追加、9行削除)
  • src/coreclr/vm/perfmap.cpp: スタブ粒度がブロック単位(DOTNET_PerfMapStubGranularityが0または1)の場合の処理を改善(11行追加、4行削除)
  • src/coreclr/pal/inc/pal.h: ヘッダーファイルの微調整(1行追加、1行削除)

パフォーマンスへの影響

影響なし。本変更は回避処理であり、パフォーマンス特性に変わりはありません。

関連Issue

#120419(原因となった変更: #113943

その他

この修正により、DOTNET_PerfMapStubGranularityが0または1に設定されている環境で、DOTNET_PerfMapEnabled設定が正常に機能するようになります。ブロック割り当ての際にメモリがまだリザーブされているだけでコミットされていない場合でも、後続のJITダンプイベントが失敗することはなくなります。


目次