Pull Request on 2026年05月06日

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

注意点

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



#127878 [cDAC] Switch runtime-diagnostics SOS test filter to -method for wildcard support

概要

dotnet/diagnostics PR #5821によるSOS テストクラスの分割に伴い、既存のclassFilter: SOSがマッチしなくなった問題を修正します。xunit v2の-classフィルタはワイルドカード非対応のため、代わりに正規表現対応の-methodフィルタを使用し、methodFilter: SOS*に切り替えることで、SOSプレフィックス付きの全クラスのメソッドにマッチさせます。

変更内容

  • eng/pipelines/diagnostics/runtime-diag-job.yml: methodFilterパラメータを追加し、診断ビルド(build.ps1)の既存の-methodfilter引数に接続
  • eng/pipelines/runtime-diagnostics.yml: cDAC、cDAC_no_fallback、DAXのテスト実行でclassFilter: SOSからmethodFilter: SOS*に切り替え

パフォーマンスへの影響

影響なし

関連Issue

dotnet/diagnostics #5821

その他

  • xunit v2の-classフィルタはHashSetベースの完全一致のみでワイルドカード非対応だが、-methodフィルタは正規表現ベースで完全修飾ClassName.MethodNameに対して動作するため、SOS*で全SOSプレフィックス付きクラスのメソッドにマッチします
  • 既存のclassFilterパラメータは後方互換性のため残置されています

#127842 Add Azure Linux 4 to libraries Helix extra-platforms (linux_x64)

概要

Azure Linux 4をライブラリのHelix extra-platforms キューセット(linux_x64)に追加し、CoreCLR内部ループテストの実行対象OSを拡張します。Azure Linux 4はまだGA版ではないため、opt-inカバレッジの拡張に留まり、GA対象プラットフォーム定義には変更を加えていません。

変更内容

  • eng/pipelines/libraries/helix-queues-setup.yml: Azure Linux 4.0用のHelix キューエントリを追加
    • イメージ: azurelinux-4.0-helix-amd64@sha256:d86d3499…
    • ホストキュー: AzureLinux.3.Amd64.Open(他のコンテナベースエントリと同じ)
    • 影響範囲: linux_x64 extra-platforms(CoreCLR内部ループ)のみ

パフォーマンスへの影響

影響なし

関連Issue

#127613(前回の試行)

その他

  • helix-platforms.ymlは意図的に更新されていません(GA版リリース用に予約済み)
  • Azure Linux 4 GA前の段階での、opt-inテスト対象の追加です
  • /azp run runtime-extra-platformsで実行可能

#127836 Set per-target compile PDB for cDAC descriptor object libraries

  • 作成者: @lewing
  • 作成日時: 2026年05月05日 21:00:17(UTC)
  • マージ日時: 2026年05月06日 02:34:32(UTC)
  • ラベル: area-NativeAOT-coreclr

概要

cDAC記述子オブジェクトライブラリがMSVC でコンパイルする際、デフォルトの vc140.pdb ではなく、ターゲット固有の決定的なPDBを生成するように修正しました。これにより、静的ライブラリ(例: Runtime.ServerGC.lib)にアーカイブされたオブジェクトファイルが後続のNativeAOT発行時にリンクエラー LNK4099 を引き起こすことを防ぎます。

変更内容

  • src/coreclr/clrdatadescriptors.cmake: generate_data_descriptors() が生成するOBJECTライブラリターゲットに対して、COMPILE_PDB_NAME および COMPILE_PDB_OUTPUT_DIRECTORY プロパティを設定。各記述子ライブラリが独自の決定的PDBを生成するようにしました(MSVC専用設定)。
  • src/coreclr/jit/emitwasm.cpp: 軽微な変更(1行修正)

パフォーマンスへの影響

影響なし

関連Issue

#126972 (cDAC記述子インフラストラクチャ追加により回帰が発生)

その他

  • この修正は、Windows NativeAOT発行時のリンク失敗を解決します。Linux/macOS/WASM/iOS/Androidではリンク成功済みのため、MSVC固有の問題です。
  • 修正内容は既に eng/native/functions.cmake の install_static_library で使用されているパターンに準拠しています。
  • Windows NativeAOT発行段階での動作検証が必要です(特に ILCompiler_publish、crossgen2_publish、ilasm.csproj の各レグ)。

#127833 Update branding to 9.0.17

概要

.NET Runtime 9.0のブランディング情報をバージョン9.0.16から9.0.17に更新するパッチリリース用の変更です。中央集約されたバージョン定義ファイルのProductVersionとPatchVersionをインクリメントします。

変更内容

  • eng/Versions.props: <ProductVersion>を9.0.16から9.0.17に、<PatchVersion>を16から17に更新(4行の変更)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

これはパッチリリース用の機械的なバージョン更新です。ビルド成果物のバージョン文字列に影響します。


#127832 Update branding to 8.0.28

概要

.NET 8.0.28 サービシングリリースに向けて、リポジトリのバージョンメタデータを更新します。ProductVersion を 8.0.27 から 8.0.28 に、PatchVersion を 27 から 28 に変更し、ファイルバージョンコンポーネントの一貫性を保ちます。

変更内容

  • eng/Versions.props: ProductVersion と PatchVersion をそれぞれ 8.0.28 と 28 に更新(+2/-2)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

なし


#127826 Add scalar FixedTimeEquals overload

  • 作成者: @vcsjones
  • 作成日時: 2026年05月05日 20:00:05(UTC)
  • マージ日時: 2026年05月06日 15:04:54(UTC)
  • ラベル: area-System.Security

概要

CryptographicOperations.FixedTimeEqualsに新しいスカラーオーバーロードを追加しました。バッファを単一バイト値と比較する際に、比較用スパンを生成する必要がなくなり、特にWindows X25519の共有秘密ゼロチェックのような定時間比較処理が簡潔になります。

// 新しいオーバーロード
public static bool FixedTimeEquals(ReadOnlySpan<byte> source, byte value)

変更内容

  • CryptographicOperations.cs: FixedTimeEquals(ReadOnlySpan<byte> source, byte value)の新しいパブリックAPIを実装(38行追加)
  • System.Security.Cryptography.cs (ref assembly): 新しいオーバーロードをref assemblyで公開(1行追加)
  • X25519DiffieHellmanImplementation.Windows.cs: Windows X25519の全ゼロ共有秘密チェックを新しいスカラーオーバーロードに変更(7行削除、1行追加)
  • FixedTimeEqualsTests.cs: スカラーオーバーロードのtrue/false両方のケースと、両オーバーロードのメソッド実装フラグを検証するテストを追加(61行追加、7行削除)

パフォーマンスへの影響

影響なし(アロケーション回避による微細な改善が期待できますが、具体的なベンチマーク値は提供されていません)

関連Issue

#127584

その他

パブリックAPI追加のため、ref assemblyの更新が含まれています。既存のFixedTimeEquals(ReadOnlySpan<byte>, ReadOnlySpan<byte>)オーバーロードは変更されておらず、新しいオーバーロードはその補足的な役割です。


#127824 Replace mobile-scan with platform-agnostic CI outer-loop failure scanner

概要

モバイル環境専用のCI失敗スキャンワークフロー(mobile-scan.md)をプラットフォーム非依存の汎用CI外部ループ失敗スキャナー(ci-failure-scan.md)に置き換えます。複数の外部ループパイプラインをカバーし、失敗分類(ビルド破損 vs テスト失敗 vs インフラ)と対応アクション(追跡Issue、Known Build Error、テストスキップPR、製品修正PR)を拡張します。

変更内容

  • .github/workflows/mobile-scan.md(削除): Apple/Android専用スキャナープロンプトを削除
  • .github/workflows/ci-failure-scan.md(新規):
    • スキャン対象パイプラインを拡大(runtime-extra-platforms + JIT/GC/PGO stress、libraries-jitstress、jit-experimental、ilasm、jit-cfg、superpmi-replay、randomized stress)
    • 実行頻度を日次から12時間ごと(ファジースケジュール)に変更
    • AIモデルをclaude-sonnet-4.5からclaude-sonnet-4.6に更新
    • 失敗分類ロジックを明示的に実装(ビルド破損、フェーズのみの失敗、Helix workitem、インフラ)
    • 対応範囲を拡大(src/libraries/**、src/coreclr/**、src/mono/**、src/tests/**、src/native/**、eng/testing/**)
    • Known Build Error形式でのIssue作成、スキップPR(GCStressIncompatible、ActiveIssue属性)、小規模な製品修正PR(≤20行、単一ファイル)をサポート
    • PR/Issue数の上限を引き上げ(5PR/3Issue → 10PR/5Issue)
    • すべてのIssue/PRタイトルに[ci-scan]接頭辞を付与
  • .github/workflows/ci-failure-scan.lock.yml(更新): 新プロンプトに対応した生成ワークフロー設定に更新

パフォーマンスへの影響

影響なし

関連Issue

#127817、#127827、#127828、#127829、#127830、#127831

その他

  • セキュリティ: 新たな秘密情報やアクションは導入されない。編集可能なファイルパスを拡大する代わりに、protected-filesポリシーでpackage.json、lockfiles、global.json、NuGet.Config、Directory.Packages.props、CODEOWNERS、.github/、.agents/への編集をブロック。CODEOWNERS による必須レビューは変わらず有効。
  • 留意点: protected_filesリスト内のNuGet.Config(大文字C)と実際のファイル名NuGet.config(小文字c)の不整合が報告されており、大文字小文字を区別するファイルシステムでは保護が機能しない可能性

#127823 Add StringBuilder.MoveChunks(StringBuilder) API

  • 作成者: @Copilot
  • 作成日時: 2026年05月05日 19:17:17(UTC)
  • マージ日時: 2026年05月06日 16:01:20(UTC)
  • ラベル: area-System.Runtime

概要

StringBuilder.MoveChunks(StringBuilder source) という新しい公開APIを追加します。このメソッドは、ソースのStringBuilderのチャンク チェーンを新しいStringBuilderインスタンスにO(1)で転送し、ソースをドレイン(空)にします。これにより、Roslyn等のコンシューマーがコピーなしで不変ビューを保持しながら、元のStringBuilderを解放できます。

namespace System.Text;

public partial class StringBuilder
{
    public static StringBuilder MoveChunks(StringBuilder source);
}

変更内容

  • StringBuilder.cs - MoveChunksメソッドを実装。既存のプライベートコピーコンストラクタを利用して、ソースのm_ChunkChars、m_ChunkPrevious、m_ChunkLength、m_ChunkOffset、m_MaxCapacityを新しいインスタンスに転送。ソースはドレイン後、m_ChunkCharsをArray.Empty<char>()に設定し、空だが完全に利用可能な状態を維持。引数がnullの場合はArgumentNullExceptionをスロー。
  • System.Runtime.cs - リファレンスアセンブリに新しい公開シグネチャを追加。
  • StringBuilderTests.cs - null引数、空ソース、単一チャンク、マルチチャンク チェーン、ドレイン済みソースへの再呼び出し、ドレイン後の利用可能性、MaxCapacity保持などをカバーする119行のテストを追加。

パフォーマンスへの影響

影響なし。転送操作はO(1)で実行でき、内部フィールドの参照付け替えのみです。既存コード パスで到達可能なフィールドのみを操作するため、オーバーヘッドはありません。

関連Issue

#97570、dotnet/roslyn#61326

その他

新しいAPIの追加のみで、既存メンバーの動作変更はありません。リスクレベルは低く、破壊的変更や後方互換性への影響はありません。


#127819 Fix CompositeFormat brace escaping ignored in string.Format fast-path

  • 作成者: @Copilot
  • 作成日時: 2026年05月05日 18:00:42(UTC)
  • マージ日時: 2026年05月06日 01:27:34(UTC)
  • ラベル: area-System.Runtime

概要

string.Format で CompositeFormat を使用する際、フォーマット穴がない場合にブレース エスケープ({{ → {、}} → })が無視される問題を修正しました。高速パスが未解析の元の形式文字列を返していたため、エスケープされたブレースが適切に処理されていませんでした。

変更内容

  • src/libraries/System.Private.CoreLib/src/System/String.Manipulation.cs

    • args.Length == 0 の分岐と _formattedCount == 0 の条件に、format._literalLength == format.Format.Length チェックを追加
    • エスケープされたブレースが存在する場合(未エスケープの長さが元の文字列より短い場合)は高速パスをスキップし、正しいセグメント反復パスにフォールスルーするように修正
  • src/libraries/Common/tests/Tests/System/StringTests.cs

    • Format_Valid_TestData に3つの新しいテストケースを追加:"{{"→"{"、"}}"→"}"、"{{text}}"→"{text}"

パフォーマンスへの影響

影響なし。修正は高速パスの条件判定を追加するのみで、既存の高速パスは変更されません。エスケープされたブレースが存在しない場合は従来通り高速パスが動作します。

関連Issue

#127794

その他

この修正は StringBuilder.AppendFormat と MemoryExtensions.TryWrite には該当する高速パスがなく、すべてのケースで正しく動作していました。新しいテストケースは複数のテストメソッド(StringFormat_Valid、StringBuilderAppendFormat_Valid、MemoryExtensionsTryWrite_Valid)で再利用されます。


#127812 [iOS] In-Proc Crash Reporter

概要

Android向けに追加されたCoreClrインプロセスJSON形式クラッシュレポーター機能をiOS、tvOS、MacCatalystに拡張します。Apple固有のシステムメタデータ(OSバージョン、システムモデル、システム製造業者)抽出とucontext_tからのレジスタ抽出(x86_64/arm64対応)が追加されます。

変更内容

  • src/coreclr/clrfeatures.cmake: iOS/tvOS/MacCatalystビルドでFEATURE_INPROC_CRASHREPORTを有効化
  • src/coreclr/debug/crashreport/inproccrashreporter.cpp: Apple sysctlベースのメタデータ出力とApple固有のucontext_tレジスタ抽出(IP/SP/BP)を実装
  • src/coreclr/debug/crashreport/inproccrashreporter.h: Apple向けヘッダー定義を追加
  • src/coreclr/pal/src/exception/signal.cpp: 例外処理シグナル関連の微細な変更
  • src/coreclr/vm/ceemain.cpp, eepolicy.cpp, eepolicy.h: ポリシー実装の軽微な調整

パフォーマンスへの影響

影響なし(診断/デバッグ機能の追加のため)

関連Issue

#126916

その他

  • 本変更はCoreClrランタイム内部実装への変更であり、公開APIへの影響なし
  • createdumpのAppleペイロード互換性向上を目的とした拡張
  • ARM64とx86_64の両アーキテクチャに対応

#127789 [mobile] Disable RoundTrip_AllWindowLogs on iOS / tvOS / MacCatalyst / Android

概要

System.IO.Compression テストスイートの RoundTrip_AllWindowLogs テスト(Deflate/ZLib/GZip variants)が、Apple モバイル(iOS/tvOS/MacCatalyst)および Android プラットフォームで常に OperationStatus.DestinationTooSmall を返す問題に対応するもの。モバイル CI での問題をブロック解除するため、該当プラットフォーム上でこのテストを一時的にスキップします。

変更内容

  • src/libraries/Common/tests/System/IO/Compression/EncoderDecoderTestBase.cs
    • RoundTrip_AllWindowLogs メソッドに [ActiveIssue] 属性を追加
    • スキップ対象:TestPlatforms.iOS | TestPlatforms.tvOS | TestPlatforms.MacCatalyst | TestPlatforms.Android
    • テスト用ライブラリの内部API変更(公開APIへの影響なし)

パフォーマンスへの影響

影響なし

関連Issue

#127563

その他

  • テストの無効化は一時的な対応
  • 根本原因(DestinationTooSmall を返すプロダクトリグレッション)は別途調査中
  • モバイルプラットフォーム(iOS/tvOS/MacCatalyst/Android)に限定した対応で、デスクトッププラットフォームのテストは継続

#127781 Centralize a couple JIT arithmetic helpers

概要

JIT コンパイラの算術ヘルパー関数を集約・統一し、重複コードを削減する内部リファクタリング。bitset および hashbv 関連の実装を整理し、bitsetasshortlong.h に機能を統合しています。

変更内容

  • bitset.cpp/h: 7行削除 - 重複していた算術ヘルパー関数を削除
  • bitsetasshortlong.h: 12行変更(+10/-2) - bitset の算術ヘルパーを統合
  • bitsetasuint64.h: 2行変更(+1/-1) - 関数参照を更新
  • hashbv.cpp/h: 合計54行削除 - 重複するヘルパーを削除・統合
  • 影響範囲: JIT コンパイラの内部実装のみ(ランタイムの公開API には影響なし)

パフォーマンスへの影響

影響なし(コード統合によるリファクタリングのため、機能変更はなし)

関連Issue

なし

その他

本変更は内部リファクタリングであり、JIT コンパイラの保守性向上を目的としています。ユーザーコード への影響はありません。


#127679 Fix scoped Utf8JsonReader to carry original position

概要

JsonSerializer.Deserializeで既存のUtf8JsonReaderを使用する際、JsonExceptionが報告する行番号とバイト位置情報が不正確になる問題を修正します。スコープ付きリーダー作成時に元のリーダーの位置情報(_lineNumberと_bytePositionInLine)をキャプチャし、トークンタイプごとに値トークンの直前を指すようにリワインドして、JsonReaderState経由でスコープ付きリーダーに渡すことで、正確な位置情報の追跡を実現します。

変更内容

  • JsonSerializer.Read.Utf8JsonReader.cs: スコープ付きリーダー作成時に呼び出し元リーダーの行/バイト位置をキャプチャして調整し、保存された位置メタデータで初期化するロジックを追加(+41行)
  • ReadValueTests.cs: プリミティブ値、プロパティ名、none-トークン、マルチセグメントリーダーなど複数のリーダー状態でのJSON例外位置情報の保持を検証する回帰テストを追加(+247行)

パフォーマンスへの影響

影響なし

関連Issue

#97893

その他

  • 変更はシステムライブラリ内部実装(JsonSerializerとUtf8JsonReader)の修正で、公開API署名への影響はなし
  • 互換性への影響なし(既存の不正な動作を修正するため)
  • Copilotのレビューで、マルチセグメント文字列やエスケープされた文字列を含むテストケースの拡充が提案されている点に注意(テスト可能性の観点から)

#127659 Intrinsify string.FastAllocateString

  • 作成者: @EgorBo
  • 作成日時: 2026年05月01日 19:30:58(UTC)
  • マージ日時: 2026年05月06日 16:33:16(UTC)
  • ラベル: area-CodeGen-coreclr

概要

String.FastAllocateStringをJIT intrinsicとしてマークし、RyuJITで最適化を行うPRです。結果を非nullとして追跡し、ARR_LENGTH(FastAllocateString(len))をlenに折り畳み、グローバルアサーションstring.Length(result) == lenArgを出力します。これにより、文字列連結後のインデックスアクセスなどで不要な境界チェックが削除されます。

int Foo()
{
    string a = "aaa";
    string b = "bbb";
    string c = a + b;
    return c[3]; // このPRでこの境界チェックが削除される
}

変更内容

  • src/coreclr/System.Private.CoreLib/src/System/String.CoreCLR.cs: FastAllocateStringに[Intrinsic]属性を追加
  • src/coreclr/jit/namedintrinsiclist.h: VNF_StrFastAllocate新規値関数を追加
  • src/coreclr/jit/valuenum.cpp:
    • VNF_StrFastAllocateの値番号追跡ロジックを実装
    • ARR_LENGTH(StrFastAllocate(len))の折り畳みを実装
    • グローバルアサーション生成ロジックを追加
  • src/coreclr/jit/importercalls.cpp: intrinsic呼び出しハンドリングを追加
  • src/coreclr/jit/gentree.cpp: 配列長取得関数を拡張
  • NativeAOT対応ファイル: NativeAOT環境での実装調整

パフォーマンスへの影響

境界チェック削除による実行速度の改善が期待されます。具体的なベンチマーク数値は提供されていません。

関連Issue

#127655

その他

CopilotレビューによるコメントとしてJITテストの追加と、コメント記述の改善提案が提起されています(VNF_StrFastAllocateが配列割り当てロジックと統合される際、コメントが配列特有の説明になっている点の改善提案など)。


#127462 Add generic Random NextInteger/NextBinaryFloat APIs

概要

System.Randomに汎用の数値生成API (NextInteger<T>()、NextBinaryFloat<T>()) を追加します。IBinaryInteger<T>とIBinaryFloatingPointIeee754<T>を実装する任意の型に対応し、一般的な型には高速パス、その他は棄却サンプリングで対応します。

// 使用例
Random random = new();
int value = random.NextInteger<int>();
int ranged = random.NextInteger<int>(0, 100);
double floatValue = random.NextBinaryFloat<double>();

変更内容

  • System/Random.cs: 3つの汎用NextInteger<T>()オーバーロードとNextBinaryFloat<T>()を実装。float/double/NFloatには最適化された高速パス、その他のIBinaryInteger<T>/IBinaryFloatingPointIeee754<T>実装には汎用フォールバック(棄却サンプリング)を搭載
  • System.Runtime/ref/System.Runtime.cs: 参照アセンブリに新API署名を追加
  • Random.cs (テスト): 引数検証、境界値、範囲外の値、派生クラスの仮想メソッドディスパッチなど、エッジケースを網羅したユニットテストを追加(カスタム参照型ラッパーも含む)

パフォーマンスへの影響

共通型(int, long, float, double, NFloat)には専用の高速パスが実装されており、これらのパフォーマンス劣化はありません。その他のジェネリック型は棄却サンプリングフォールバックを使用するため、範囲によっては複数回のサンプリングが必要になる可能性があります。

関連Issue

#75431

その他

なし


#127454 Fix TensorPrimitives.IndexOfMax

概要

TensorPrimitives.IndexOfMax および関連メソッドのインデックス計算バグを修正するPRです。特に小さい要素型(byte、ushortなど)において、正しいインデックスが要素型の最大値を超える場合に不正なインデックスが返されていた問題を解決します。新しい IIndexOfMinMaxOperator インターフェースを導入し、要素サイズ(1/2/4/8バイト)に応じた専用のベクトル化実装を提供することで、水平集約による正確なインデックス検索を実現しています。

変更内容

  • IIndexOfMinMaxOperator.cs(新規): 既存の IIndexOfOperator に代わり、Compare メソッドでマスク結果を返す新インターフェースと、Vector128/256/512サイズ別の IndexOfMinMaxCore 実装を追加
  • TensorPrimitives.IndexOfMax/Min/IndexOfMaxMagnitude/IndexOfMinMagnitude.cs: 各メソッドを新インターフェースに対応させ、共有コア実装を使用するよう更新
  • テスト追加: byte(インデックス > 255)および ushort(インデックス > 65535)でのリグレッションテストを追加
  • 内部実装(非公開API)の変更

パフォーマンスへの影響

影響なし(バグ修正による正確性の向上が主目的。パフォーマンスベンチマークは提供されていません)

関連Issue

#124233 #127610

その他

  • PR #124274 からのフィードバックを反映
  • 水平集約による最終的なインデックス決定により、左から右への検索で IndexLessThan メソッドが不要になった
  • 一部のコメント化されたTODOテストが復活

#126549 Optimize ImmutableSortedSet<T>.SetEquals to avoid unnecessary allocations

概要

ImmutableSortedSet<T>.SetEqualsメソッドを最適化し、不要な中間SortedSet<T>の生成を排除してメモリアロケーションとGCプレッシャーを削減しました。パターンマッチングにより互換性のあるソート済みセット間で直接比較を実施し、デュアル列挙子による線形スキャン(O(n))で従来のO(log n)*.Contains()ルックアップを置き換えています。

変更内容

  • ImmutableSortedSet_1.cs: SetEqualsメソッドに型特定の高速パス実装を追加

    • ImmutableSortedSet<T>またはSortedSet<T>の検出時に比較器が一致すれば最適化ロジックを適用
    • ReferenceEqualsチェックとICollection.Countによる即座な終了判定
    • デュアル列挙子による順序保証の線形比較ロジック
    • 比較器不一致時の改良されたフォールバック(従来のルックアップからO(n)スキャンへ)
  • ImmutableSortedSetTest.cs: 新規テストケース追加(90行)

    • 比較器ミスマッチシナリオ(OrdinalとOrdinalIgnoreCase)
    • 重複要素を含むコレクションのテスト
    • 早期終了とカウント最適化の検証
    • 空セットおよびエッジケースの網羅

パフォーマンスへの影響

顕著な改善を確認:

高速パス(互換ソート済みセット比較)

  • ImmutableSortedSet同士(同一比較器): ~4.7倍高速化、メモリアロケーション0
  • BCL SortedSet同士(同一比較器): ~5.7倍高速化、99.99%メモリ削減(3907KB → 312B)

早期終了最適化(カウント不一致)

  • ImmutableSortedSet(小規模): ~2,165,000倍高速化、メモリアロケーション0
  • BCL SortedSet(小規模): ~1,077,000倍高速化、メモリアロケーション0

フォールバックパス(非ソート済みコレクション)

  • List/Array: ~1.8倍高速化、メモリ削減なし(新規SortedSet生成は継続)

100,000要素でのベンチマーク結果より、互換ソート済みセット間比較での劇的改善を達成。

関連Issue

#127279

その他

  • 内部実装の変更であり、公開APIに破壊的変更なし
  • 互換性: 既存の動作は保持、結果の正確性を保証
  • テストケースで複数シナリオ(比較器ミスマッチ、重複、エッジケース)を網羅し正確性を検証

#125895 Add cDAC ObjectiveCMarshal contract and IsTrackedReferenceWithFinalizer API

概要

Objective-C相互運用性の診断に対応する新しいObjectiveCMarshal cDACコントラクトと、RuntimeTypeSystemコントラクトへのIsTrackedReferenceWithFinalizer APIを追加しました。これにより、追跡参照オブジェクトのタグ付きメモリポインタを取得し、追跡参照とファイナライザーを持つ型を識別できます。

// ObjectiveCMarshal コントラクト API
TargetPointer GetTaggedMemory(TargetPointer address, out TargetNUInt size);

// RuntimeTypeSystem コントラクト API
bool IsTrackedReferenceWithFinalizer(TypeHandle handle);

変更内容

  • 新規cDACコントラクト: IObjectiveCMarshalインターフェースとObjectiveCMarshal_1実装を追加。オブジェクトのシンクブロックからInteropSyncBlockInfo.TaggedMemoryを抽出し、Objective-C追跡参照のタグ付きメモリポインタを返却。
  • ランタイム型システム拡張: MethodTableFlags_1.csにIsTrackedReferenceWithFinalizerフラグ(0x04000000)を追加、RuntimeTypeSystem_1.csに対応するAPI実装。
  • レガシーDAC統合: SOSDacImpl.csのISOSDacInterface11に完全なcDAC実装を提供(IsTrackedTypeとGetTaggedMemoryメソッド)。
  • データ構造: datadescriptor.inc、syncblk.h、InteropSyncBlockInfo.csにTaggedMemoryフィールドを追加(FEATURE_OBJCMARSHALでガード)。
  • テスト: ユニットテスト127行、ダンプテスト70行、モックディスクリプタの拡張、macOS専用デバッグアプリケーション追加。全既存1322個のcDACユニットテストが合格。

パフォーマンスへの影響

影響なし

関連Issue

#118250(ドラフトPR)

その他

  • Apple プラットフォーム上でFEATURE_OBJCMARSHALが有効な場合にのみ新規コントラクトが使用されます(条件付きコンパイル)。
  • SOSDacImpl.csでは#if DEBUGアサーションを使用してレガシーDAC実装と照合検証しています。
  • macOS専用テスト基盤を追加し、非macOS環境ではスキップされるようDumpTests.targetsで制御。
  • このPRはGitHub Copilotで生成されました。

目次