Pull Request on 2026年05月30日

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

注意点

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



#128791 JIT: remove dead BBJ_RETURN-in-loop assertion in loop cloner

概要

JIT のループクローナーから、ループ内に BBJ_RETURN ブロックが存在しないという古い仮定に基づいた assertion とコメントを削除します。EH-ループクローニングがデフォルトで有効になったことで、BBJ_RETURN ブロックがクローン可能なループに合法的に出現するようになったため、この制約は不要になりました。

変更内容

  • src/coreclr/jit/loopcloning.cpp:
    • optIsLoopClonable() 関数のコメントから fgReturnCount に関する古い説明を削除
    • DEBUG-only assertion (VisitLoopBlocks) からループブロック内の BBJ_RETURN を拒否するチェックを削除(18行削除)

パフォーマンスへの影響

影響なし(デバッグアサーション関連の変更で、ランタイムパフォーマンスへの影響はありません)

関連Issue

なし

その他

この変更は単なるコードクリーンアップで、EH-ループクローニング機能がデフォルト有効化された後の技術的債務解消です。ループ内で return ステートメントが存在する場合でも、ループクローニングが正常に動作することが確認されているため、この制限の削除は安全です。


#128785 Align thunk gen formating with dotnet-format

概要

thunkジェネレータが生成するコードのフォーマットをdotnet-formatに準拠させるための修正です。新しい命令追加時に自動生成されるコードが一貫性のあるフォーマットで出力されるようになります。

変更内容

  • ReadyToRunInstructionSet.cs: フォーマッティング調整(+89/-90行)
  • ReadyToRunInstructionSetHelper.cs: フォーマッティング調整(+150/-151行)
  • CorInfoInstructionSet.cs: フォーマッティング調整(+1054/-1059行)
  • InstructionSetGenerator.cs: thunkジェネレータ自体のフォーマッティング調整(+44/-43行)

これらの変更は主に自動生成コードの出力フォーマットに関するもので、コア機能に影響しません。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPRは開発者の生産性向上を目的としたもので、新しい命令セット追加時にdotnet-formatによる事後的なフォーマッティング修正が不要になります。


#128780 [cDAC] Implement IsDelegate for cDAC

  • 作成者: @barosiak
  • 作成日時: 2026年05月29日 18:38:36(UTC)
  • マージ日時: 2026年05月30日 03:28:25(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDAC(Compact Debugger Access Component)にデリゲート型判定機能を実装します。型がSystem.MulticastDelegateを親MethodTableとして持つ場合、それをデリゲートと見なす新しいIRuntimeTypeSystem.IsDelegate契約APIを追加し、レガシーDAC実装からの移行を完了します。

変更内容

  • datadescriptor.inc: MulticastDelegateMethodTableグローバルポインタを追加
  • IRuntimeTypeSystem.cs: 新しいIsDelegate契約メソッドを契約インターフェースに追加
  • RuntimeTypeSystem_1.cs: MulticastDelegateMethodTableグローバルを読み込み、IsDelegateを実装
  • DacDbiImpl.cs: 新しい契約メソッドを使用してIsDelegateを実装(レガシーDAC実装から移行)
  • Constants.cs: グローバル名定数を追加
  • テストファイル群: デリゲート、非デリゲート、MulticastDelegate自体のケースをカバーするユニットテストと、モック記述子を追加
  • RuntimeTypeSystem.md: 新しいAPI説明と契約レベルの依存関係を文書化

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

この変更はcDACへのレガシーDAC機能の移植の一環です。デリゲート型判定のロジックは既存のネイティブ動作と一致するように設計されています。ランタイムの公開APIではなく、デバッガアクセス層の内部実装改善です。


#128774 [cDAC] Cache resolved read-only metadata address per module in EcmaMetadata_1

概要

cDAC (Compact Diagnostics And Inspection Container) の EcmaMetadata_1 において、読み取り専用メタデータアドレスをモジュールごとにキャッシュする最適化。これにより、毎回のPEヘッダウォークと不要なメタデータプリフェッチを削減し、ダンプ分析時のパフォーマンスを大幅に改善します。

変更内容

  • ILoader.cs: PrefetchMetadata メソッドの削除(-9行)。プリフェッチされたバイト列は実際には使用されず、呼び出し元が target.ReadBuffer 経由で直接メタデータスパンを読み取るため不要
  • EcmaMetadata_1.cs: 以下の最適化を実装
    • 読み取り専用メタデータアドレスの小規模キャッシュ追加(Flush() で _metadata とともにクリア)
    • ModuleHandle を record struct に昇格し、コンパイラ生成の IEquatable<T>/GetHashCode を使用(リフレクションベースの ValueType.Equals より約6倍高速)

パフォーマンスへの影響

大幅な改善 - SOS.WebApp3.Heap.dmp でのベンチマーク測定結果(GetMethodTableData + GetMethodTableName + GetMethodTableFieldData + GetObjectData をGCヒープ全体で3回反復):

メトリクス 改善率
Cold-iter reads -55% (137,522 → 61,306)
Warm-iter reads -80% (99,198 → 19,518)
Total reads -61% (385,928 → 150,351)
失敗した読み取り 変化なし
名前解決成功/失敗 686/0(変化なし)

メタデータページが完全にキャプチャされないダンプでも VirtualReadException が発生する前にキャッシュが機能し、パフォーマンス低下を防止。

関連Issue

#128717(部分的に修正)

その他

  • 変更は内部実装(cDAC診断ツール)の最適化であり、公開APIへの影響なし
  • 互換性への影響なし
  • 機能は変わらず(名前解決結果は同一)、診断パフォーマンスのみ改善

#128747 [Android] Clear pending JNI exceptions in pal_rsa.c to avoid CheckJNI aborts

概要

AndroidのSystem.Security.Cryptography.Native.Androidライブラリで、JNI例外処理が不適切により発生していたCheckJNI SIGABRTを修正。特に16384ビットRSA鍵などをConscrypt + BoringSSLプロバイダが拒否する場合に、JNI呼び出し間で保留中の例外をクリアせずに次の呼び出しを実行していた問題を解決。

変更内容

ファイル: src/native/libs/System.Security.Cryptography.Native.Android/pal_rsa.c

  • 9つの関数を強化: AndroidCryptoNative_SetRsaParameters、AndroidCryptoNative_GetRsaParameters、AndroidCryptoNative_RsaPublicEncrypt、AndroidCryptoNative_RsaPrivateDecrypt、AndroidCryptoNative_RsaSignPrimitive、AndroidCryptoNative_RsaVerificationPrimitive、AndroidCryptoNative_DecodeRsaSubjectPublicKeyInfo、AndroidCryptoNative_RsaGenerateKeyEx、AndroidCryptoNative_NewRsaFromKeys
  • JNI呼び出し間でON_EXCEPTION_PRINT_AND_GOTO(cleanup)マクロを使用して保留中の例外をチェック・クリア
  • 統一されたcleanup:/error:ラベルへの収束と、ReleaseLRef/ReleaseGRefヘルパー関数による参照リソース管理を実装
  • RSAパラメータの出力ハンドルを前もって初期化し、エラー時に確実にNULLリセット(マネージ側のセーフクリーンアップを保証)
  • 成功パスの動作は変更なし。失敗時はFAIL/RSA_FAILを返して回復可能なCryptographicExceptionに変換

パフォーマンスへの影響

影響なし。成功パスは変更されておらず、例外チェック処理はエラーパスに限定される。

関連Issue

#128660

その他

  • 修正の根本原因:KeyFactory.generatePrivate(rsaPrivateKeySpec)が16384ビット鍵を拒否するとInvalidKeySpecExceptionが保留状態になり、次のNewObject()呼び出しでJNI仕様違反となり、ART CheckJNIがSIGABRTで中止していた
  • テスト実施:Samsung Galaxy A16 5G(Android 16)とAndroidエミュレータ(API 36)で11715〜12373テスト実行、回帰なし(977〜977スキップ)
  • リスク評価:低い。単一ファイル修正、マネージAPI変更なし、成功パス不変、失敗パスはプロセス中止から回復可能な例外へ変更のみ
  • 同じパターンを持つpal_dsa.cやpal_ecc_import_export.cなどの他のファイルは今後の改善対象として検討対象外

#128705 Filter local interface DNS results by address family

  • 作成者: @simonrozsival
  • 作成日時: 2026年05月28日 14:38:29(UTC)
  • マージ日時: 2026年05月30日 11:50:02(UTC)
  • ラベル: area-System.Net

概要

SystemNative_GetHostEntryForNameがローカルホスト名の解決時にgetifaddrsで取得したインターフェイスアドレスを追加する際、リクエストされたアドレスファミリでフィルタリングしていなかった問題を修正します。getaddrinfoは既にhint.ai_familyでフィルタリングしていますが、ローカルインターフェイスの追加パスではこのフィルタが適用されておらず、IPv4のみのリクエストでもIPv6アドレスが含まれる可能性がありました。

変更内容

  • src/native/libs/System.Native/pal_networking.c: getifaddrsエントリのカウント処理と要素コピー処理の両方で、インターフェイスのアドレスファミリが要求されたプラットフォームファミリと一致するかをチェック。AF_UNSPECの場合はフィルタリングをスキップ(既存動作を維持)。インターフェイスのアドレスファミリを局所変数にキャッシュしてポインタのデリファレンスを削減。

パフォーマンスへの影響

軽微な改善:局所変数でのキャッシュにより、ifa->ifa_addr->sa_familyへの多重デリファレンスを削減。

関連Issue

#128371

その他

本修正の影響対象:

  • Android: 最小APIレベルが21から24に引き上げられたことで、Bionic getifaddrsが利用可能となり、ローカルホスト名の追加パスが実行されるようになった環境。特にWindows上の物理Androidデバイスで顕在化。
  • その他Unixプラットフォーム: ローカルホスト名の解決で明示的にIPv4またはIPv6を指定するリクエストにのみ影響。反対のファミリのインターフェイスアドレスが返されなくなります。

#128616 [cDAC] Implement GetExactTypeHandle DacDbi API

  • 作成者: @Copilot
  • 作成日時: 2026年05月27日 00:48:19(UTC)
  • マージ日時: 2026年05月30日 02:56:27(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDAC(Contract Data Access Component)とレガシーDBI(Debugger Bridge Interface)の相互運用層を拡張し、関数ポインタ型を含む正確な型ハンドル解決をサポートするGetExactTypeHandle DacDbi APIを実装しました。ローダーアロケータのコレクティビリティメタデータの読み取りと、DAC互換の関数ポインタ型比較を実現します。

変更内容

  • IDacDbiInterface.cs: GetExactTypeHandleシグネチャを型指定ポインタで更新し、ArgInfoListを追加
  • DacDbiImpl.cs: マネージドcDAC側でGetExactTypeHandleと正確な構築型解決のヘルパーを実装(配列/ポインタ/参照/ジェネリックインスタンス化/関数ポインタに対応)
  • RuntimeTypeSystem_1.cs: 構築型キャッシング時にcallConv判別子を追加、関数ポインタマッチング+ローダーモジュール選択ロジックを実装
  • IRuntimeTypeSystem.cs: GetConstructedTypeシグネチャをオプションcallConvパラメータで拡張
  • LoaderAllocator.cs: データディスクリプタからIsCollectibleとCreationNumberを読み取り
  • typehash.cpp: EETypeHashTable::CompareFnPtrTypeのDACCESS_COMPILEガード除去でDAC互換化
  • typedesc.h: 関数ポインタのreturn/arg配列取得をDAC安全なメンバーアドレス アクセスに変更
  • テスト追加: DacDbiExactTypeHandleDumpTests.csとExactTypeHandle.csproj/Program.csで新APIのテストケースを実装

パフォーマンスへの影響

影響なし

関連Issue

#128616

その他

レビューワーより以下の懸念が指摘されています:

  • TypeKey.Equals/GetHashCode不整合: EqualsメソッドがTypeHandleフィールドを比較しないが、GetHashCodeには含まれており、ハッシュコリジョン時のキャッシュ誤ヒットのリスク有り
  • 非ゼロcallConv使用時のキャッシュ不整合: FnPtr以外の要素型に対して非ゼロcallConvが渡されると、キャッシュ登録時のTypeKey構築が不統一となる可能性
  • DAC下でのポインタインデックス安全性: CompareFnPtrTypeがDAC互換化されたが、GetRetAndArgTypesPointer()から取得したDPTRに対する配列インデックスアクセスはDAC環境下で不安全(バッファ範囲外アクセスのリスク)

#128609 Add basic test for crossgen2 WebCIL

概要

crossgen2のWebCIL(WebAssembly内に埋め込まれたIL)コンパイル機能に対する基本的なテストを追加します。ILCompiler.ReadyToRunテストハーネスを拡張して、.dll以外の出力形式(.wasmなど)に対応し、WASM/ブラウザターゲット向けのWebCILペイロード生成と検証を行うxUnittestケースを実装しています。

変更内容

  • R2RTestRunner.cs: crossgen2出力のファイル拡張子を設定可能にし、.wasmなどの非.dll出力に対応
  • R2RDriver.cs: 未使用のCrossgen2Option列挙値と対応するマッピングを削除
  • WasmWebcilModule.cs: WebCIL検証用の新しいテストケース入力ファイル(12行)を追加
  • R2RTestSuites.cs: wasm/browserターゲット向けのcrossgen2コンパイルとWebCIL-in-WASM出力を検証するWasmWebcilModulexUnittestを追加
  • ILCompiler.ReadyToRun.Tests.csproj: テストプロジェクト設定に40行の変更

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPRは新機能の追加ではなく、既存のcrossgen2 WebCIL生成機能をテストするための基盤を整えるものです。内部テストハーネスの拡張のみで、公開APIへの影響はありません。


#128294 Replace EnumerateModulesInAssembly with combined GetModuleForAssembly; implement in cDAC

概要

DAC/DBI(デバッグアクセスコンポーネント/デバッグインターフェース)のモジュール照会APIをリファクタリングしました。EnumerateModulesInAssemblyコールバックを廃止し、GetModuleForAssemblyに「モジュールがロード済みか」を示すフラグを統合する変更です。cDAC(Microsoft.Diagnostics.DataContractReader.Legacy)に新APIを実装し、ダンプベースのテストも更新しました。

変更内容

  • IDL/インターフェース定義(dacdbi.idl、dacdbiinterface.h、IDacDbiInterface.cs):GetModuleForAssemblyシグネチャを拡張してロード状態フラグを返すように変更。EnumerateModulesInAssemblyと関連コールバック型を削除。
  • DAC実装(dacdbiimpl.cpp、dacdbiimpl.h):新しいGetModuleForAssemblyシグネチャを実装し、モジュール列挙処理を廃止。
  • Right-side(RS)実装(rsappdomain.cpp、process.cpp、shimprocess.cpp、rspriv.h):モジュールプリロード/列挙ロジックを統合API使用に切り替え、ロードフラグに基づいてキャッシュ操作を制御。
  • cDAC実装(DacDbiImpl.cs):GetModuleForAssembly(ロード状態フラグ付き)とGetAssemblyFromModuleを新規実装。
  • テスト(DacDbiLoaderDumpTests.cs):新しいGetModuleForAssemblyシグネチャの呼び出しとロード状態フラグの検証を追加。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

内部実装の変更で、公開APIには直接的な影響はありません。EnumerateModulesInAssemblyの廃止はDAC/DBIの内部契約レベルの変更です。


目次