Pull Request on 2025年12月27日

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

注意点

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


目次

  1. #122753 Fix debug build
  2. #122571 Refactor lock upgrade logic
  3. #122466 Resolve dllimport.cpp runtimeasync todos

#122753 Fix debug build

  • 作成者: @am11
  • 作成日時: 2025年12月27日 12:52:41(UTC)
  • マージ日時: 2025年12月27日 16:18:03(UTC)
  • ラベル: area-System.Threading community-contribution

概要

デバッグビルドで発生していたコード分析エラー(IDE0036)を修正するPR。System.Threading.Interlocked.CoreCLR.csの149行目でmodifiersの順序が正しくなかったため、修飾子の順序を統一してビルドエラーを解決しました。

変更内容

  • ファイル: src/coreclr/System.Private.CoreLib/src/System/Threading/Interlocked.CoreCLR.cs
  • 変更: +1/-1(1行の修正)
  • 内容: メソッドまたはプロパティの修飾子の順序を規約に合わせて修正

IDE0036ルールでは、修飾子の順序がpublic staticinternal asyncなど標準的な順序に従う必要があります。

パフォーマンスへの影響

影響なし

関連Issue

Issue #122753(デバッグビルドの失敗)

その他

  • このPRはコード分析スタイル規約の違反を修正するもので、機能的な変更はありません
  • dotnet-policy-service[bot]により、area-ownersのsubscriberへ自動で通知されています
  • .NETの開発環境でビルドを成功させるためには、修飾子の順序の統一が重要です

#122571 Refactor lock upgrade logic

  • 作成者: @jkoritzinsky
  • 作成日時: 2025年12月16日 00:23:24(UTC)
  • マージ日時: 2025年12月27日 01:37:17(UTC)
  • ラベル: area-VM-coreclr

概要

ロック(Monitor)のアップグレード処理におけるGCホール問題を修正するPR。NativeAOTで使用されているポインタオーバーロード版のCompareExchangeをCoreClrに適用し、ARM32プラットフォームで完全に形成されたrefが報告されることによるクラッシュを防止。

変更内容

  • Interlocked.CoreCLR.cs: ポインタオーバーロード版CompareExchangeを追加実装
  • syncblk.cpp/h/inl: ロックアップグレードロジックをネイティブコード内で実装し、マネージドコードでのref生成を回避
  • nativeaot/Interlocked.cs: 既存のポインタオーバーロード実装を調整
  • ecalllist.h: 新規ネイティブメソッドのエクスポート

パフォーマンスへの影響

ほぼ同等。ローカルベンチマーク結果:

  • PR版: 37.33 µs
  • main版: 36.97 µs
  • Ratio: 1.01(測定誤差範囲内)

ネイティブ実装により、マネージド版で必要だったスタックフレーム生成によるペナルティを回避。

関連Issue

  • #122275
  • #122482

その他

根本原因はARM32においてCompareExchangeがmust-expand intrinsicでないため、完全に形成されたrefがFCall時に報告され、オブジェクトヘッダアドレスを含む不正なヒープポインタ参照が生じていた点。NativeAOTではポインタオーバーロードで既に対応済み。


#122466 Resolve dllimport.cpp runtimeasync todos

  • 作成者: @jkoritzinsky
  • 作成日時: 2025年12月11日 21:16:00(UTC)
  • マージ日時: 2025年12月27日 02:16:15(UTC)
  • ラベル: area-Interop-coreclr runtime-async

概要

P/Invoke(DllImport)メソッドとデリゲートのInvokeメソッドに対して、asyncメソッドフラグが設定されるシナリオを防ぐための改善。Roslynはこれらのメソッドにasyncマークを付けないため、不正な組み合わせの検出と エラーハンドリングを強化しました。例えば以下のような不正なコードはロード時に失敗します:

[DllImport("kernel32.dll")]
private static extern Task QueryPerformanceFrequency(out long frequency);

変更内容

  • dllimport.cpp: asyncビット設定のメソッド検出時にアサート追加
  • methodtablebuilder.cpp: P/Invoke/COM Interop/UnmanagedCallersOnlyメソッドのasyncビット検証強化
  • PInvokeILProvider.cs・NativeAotILProvider.cs: async設定メソッドへの例外処理追加
  • comdelegate.cpp: COM delegateのasync検証追加
  • UnmanagedCallingConventions.cs: UnmanagedCallersOnlyのasync検証強化
  • テスト追加: RuntimeAsyncおよびInvalidCallbacks.ilでテストカバレッジ拡充

パフォーマンスへの影響

影響なし。主にバリデーション段階での検出であり、正常系のパスに影響はありません。

関連Issue

#121758(dllimport.cpp runtimeasync todos)

その他

レビュアーのVSadovから、Task/ValueTask戻り値のP/Invokeに関する既存シナリオのテスト追加提案があります。これは回帰テストとしての価値が高く、将来的な検討対象となります。MethodImplOptions.Synchronizedと同様に、MethodImplOptions.Asyncの不正な使用時にはTypeLoadExceptionが発生するようになりました。