Pull Request on 2026年04月23日

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

注意点

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



#127313 Adopt RuntimeFeature.IsMultithreadingSupported for CoreCLR PlatformDetection

概要

CoreCLR テスト用の PlatformDetection.cs で、WASM マルチスレッド検出の反射(リフレクション)ベースの回避策を削除し、SDK 11.0.100-preview.3 で利用可能になった RuntimeFeature.IsMultithreadingSupported API を直接使用するように更新しました。

変更内容

  • src/tests/Common/CoreCLRTestLibrary/PlatformDetection.cs
    • GetIsMultithreadingSupported() リフレクションヘルパーメソッドを削除
    • System.Reflection の未使用 using ディレクティブを削除
    • 関連する TODO コメントを削除
    • RuntimeFeature.IsMultithreadingSupported の直接呼び出しに置き換え(差分: +1/-30)

パフォーマンスへの影響

改善あり。リフレクションベースの API チェックから直接的な API 呼び出しに変更されたため、マルチスレッドサポート検出時のリフレクションオーバーヘッドが排除されます。

関連Issue

#124748

その他

なし


#127312 Fix race condition: set _canceled before SignalCore in ProcessWaitState

概要

ProcessWaitStateでプロセス終了を待機中にキャンセルが発生した際、_canceledフラグの設定とシグナル送信の間にレース条件が存在していた問題を修正しました。_canceledをSignalCore()呼び出し前に設定することで、リーピングスレッドが常に正しいキャンセル状態を観察できるようにします。

変更内容

  • ProcessWaitState.Unix.cs: Unix向けロック保護されたキャンセルパスを追加し、_canceledのvolatile修飾子を削除(_gateロック取得がメモリバリアを提供)
  • SafeProcessHandle.cs/Unix.cs/Windows.cs: プラットフォーム別のCancel()ヘルパーメソッドを導入し、キャンセル・タイムアウト時の呼び出し経路を一元化

パフォーマンスへの影響

ロック取得の追加により若干のオーバーヘッドが生じる可能性がありますが、キャンセル/タイムアウト時の低頻度パスであるため、通常運用への実質的な影響はありません。volatile削除により、非キャンセル時の読み取り性能がわずかに向上します。

関連Issue

#127312

その他

この修正はProcessSafeHandle_WaitForExitOrKillOnCancellation_KillsOnCancellationテストのCI上での間欠的な失敗を解決します。Unix/Windows両プラットフォームで一貫性のあるキャンセル動作を実現するため、プラットフォーム固有の実装を統合した設計になっています。


#127307 ignore unreachable preds in optVisitReachingAssertions

  • 作成者: @EgorBo
  • 作成日時: 2026年04月23日 00:28:13(UTC)
  • マージ日時: 2026年04月23日 18:46:38(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITコンパイラのoptVisitReachingAssertionsメソッドを更新し、到達不可能なブロックに由来するSSA PHI引数を許容するように改善しました。これまで保守的に処理を中止していたケースを回避し、より効率的に解析できるようになります。

変更内容

  • src/coreclr/jit/compiler.hpp: 到達不可能な先行ブロックを分類するローカルヘルパーを追加(+21行)
  • 到達不可能なブロック(通常の先行ブロックが存在しないが、EHハンドラ/フィルタエントリ例外を持つ)からのPHI引数スキップ処理を実装
  • スキップされたブロックを訪問済みとしてマーク
  • 後続の「phi-preds cover block preds」チェックで誤った失敗が発生しないよう対応
  • JITDUMPログ出力機能を統合

パフォーマンスへの影響

ポジティブな影響が期待されます。これまで保守的に早期中止していたケースをスキップできるため、不要な再コンパイル/最適化パスを回避でき、JITコンパイル時間の短縮につながる可能性があります。

関連Issue

なし

その他

  • ランタイム内部実装(JITコンパイラ)の変更であり、公開APIへの影響はありません
  • 破壊的変更ではなく、既存の動作を改善するものです

#127301 Revert "Handle canonical types in casting logic"

概要

PR #127146で導入された「キャスティングロジックにおける正規型(canonical types)の処理」機能を全面的に削除するリバートです。この変更により、正規型に関連する複数のコンポーネントが削除され、NativeAOTコンパイラの型システムがより簡潔な状態に戻されます。

変更内容

  • 正規型キャスティング処理の削除:CastingHelper.Canon.cs(93行)とTypeSystemConstraintsHelpers.Canon.cs(48行)を完全削除
  • 非正規型キャスティング処理の削除:CastingHelper.NonCanon.csとTypeSystemConstraintsHelpers.NonCanon.csを削除
  • 基本実装の簡略化:CastingHelper.csとTypeSystemConstraintsHelpers.csの実装を削除されたロジックに対応させて削除・簡略化
  • テストおよび検証コードの削除:ConstraintsValidationTest.cs(176行)と関連するテストアセンブリ、Datafrowテストコードを削除
  • プロジェクトファイル修正:不要になった参照をILVerification.projitemsから削除

パフォーマンスへの影響

影響なし(削除による変更のため、パフォーマンスベンチマークは提供されていません)

関連Issue

#127259

その他

このリバートにより、PR #127146で導入された正規型のキャスティング/制約検証機能が完全に削除されます。リバート理由の詳細はIssue #127259を参照してください。


#127286 [browser] Make WASM framework asset CopyToOutputDirectory configurable

概要

Blazor WASM フレームワークアセットの CopyToOutputDirectory 動作を MSBuild プロパティで設定可能にする変更です。#126407 での変更によって library-tests が回帰していた問題を解決します。デフォルトは Never(static web assets ミドルウェア経由で obj/fx/ から提供)のままで、テスト環境では PreserveNewest に設定することで、bin/ から直接実行するテストをサポートします。

変更内容

  • Microsoft.NET.Sdk.WebAssembly.Browser.targets (内部実装): 新しいプライベート MSBuild プロパティ _WasmFrameworkCopyToOutputDirectory を導入(デフォルト値: Never)。Computed/webcil アセット、Framework アセット、および post-UpdatePackageStaticWebAssets item update の3箇所の CopyToOutputDirectory 値をこのプロパティ経由でルーティング
  • eng/testing/tests.browser.targets (テスト設定): ブラウザテストビルドで _WasmFrameworkCopyToOutputDirectory を PreserveNewest に設定し、フレームワークアセットが出力ディレクトリにコピーされるようにする

パフォーマンスへの影響

影響なし。この変更はアセットの出力ディレクトリへのコピー有無を制御するもので、通常の dotnet run / Blazor WASM シナリオではデフォルト動作は変わりません。

関連Issue

#127257、#126407

その他

なし


#127268 Add Video sub-class to MediaTypeNames with common video MIME types

  • 作成者: @ManickaP
  • 作成日時: 2026年04月22日 09:10:49(UTC)
  • マージ日時: 2026年04月23日 09:25:10(UTC)
  • ラベル: area-System.Net

概要

System.Net.Mime名前空間のMediaTypeNamesクラスにVideoネストされたクラスを追加し、一般的なビデオMIMEタイプの定数を提供します。Mp4、Mpeg、Ogg、QuickTime、WebMの5つのビデオコンテナフォーマット定数が追加されます。これらはWebアプリケーションで最も広く使用されるビデオMIMEタイプです。

public static class Video
{
    public const string Mp4 = "video/mp4";
    public const string Mpeg = "video/mpeg";
    public const string Ogg = "video/ogg";
    public const string QuickTime = "video/quicktime";
    public const string WebM = "video/webm";
}

変更内容

  • src/libraries/System.Net.Mail/src/System/Net/Mime/MediaTypeNames.cs: MediaTypeNames.Videoネストされたクラスに5つのビデオMIMEタイプ定数を追加(+19行)
  • src/libraries/System.Net.Mail/ref/System.Net.Mail.cs: 公開API契約を更新し、新しいVideoネストされた型を含める(+8行)
  • tests/Unit/MediaTypeNamesVideoTest.cs: 新しい定数が正しいMIMEタイプ文字列と一致することを検証するユニットテストを追加

パフォーマンスへの影響

影響なし

関連Issue

#124392

その他

  • 本PRはGitHub Copilotの支援により作成されました
  • コーデック固有のタイプ(H264、VP8など)は、HTTP Content-Typeヘッダーとしてはほとんど使用されないため、意図的に除外されています
  • これらのMIMEタイプは既にMediaTypeMapにマッピングされており、新しい定数の追加で一貫性が向上します

#127251 Fix x64 data breakpoint handling after CORINFO_HELP_ARRADDR_ST inlining

概要

PR #126547でWriteBarrier FCallがネイティブ(FCall)からマネージドコードに変換された後、x64データブレークポイントのデバッガアンウインドロジックが不正な動作をしていました。本修正により、デバッガがCastHelpers.StelemRefのJITヘルパーで停止するのではなく、ユーザーコードまで正常にアンウインドするようになります。

変更内容

  • src/coreclr/debug/ee/controller.cpp: x64のFEATURE_DATABREAKPOINTアンウインドロジックを拡張。VirtualUnwindToFirstManagedCallFrame実行後、CastHelpersクラスに属するマネージドフレームが存在する場合、ユーザーコードに到達するまでアンウインドを継続するようにループ処理を追加しました。MethodTableを使用してCastHelpersフレームを識別することで、ティアード コンパイル後も安定性を保証しています。

パフォーマンスへの影響

影響なし(デバッガのアンウインドロジック変更のため)

関連Issue

#126547

その他

  • 本修正はx64データブレークポイントのみに適用されます。x86は生のシングルフレームスタックポップ(EIPをESPから復元)を実行するため影響を受けません。ARM64はデータブレークポイントをサポートしていません。
  • 内部実装(デバッガコントローラー)の変更であり、公開APIに影響はありません。

#127244 [cDAC] Implement SetCompilerFlags for cDAC

概要

cDAC(Compact Data Access Component)のDacDbiImplにSetCompilerFlagsメソッドを実装し、デバッガアセンブリ制御フラグを設定できるようにします。ILoaderコントラクトを使用してフラグを更新し、Edit and Continue(EnC)が有効化できない場合はCORDBG_S_NOT_ALL_BITS_SET成功HRESULTを返します。

変更内容

  • DacDbiImpl.cs - SetCompilerFlags実装を追加し、フラグ設定後にEnC有効化可否を判定
  • CorDbHResults.cs - CORDBG_S_NOT_ALL_BITS_SET成功HRESULTを追加
  • ILoader.cs/Loader_1.cs - DACF_IGNORE_PDBSフラグとEncCapableモジュールフラグをコントラクトに追加
  • ProfControlBlock.cs - MainProfilerProfInterfaceとNotificationProfilerCountフィールドをデータディスクリプタとして公開
  • DacDbiImplTests.cs - 8つのテストケースを追加(フラグセット/アンセット、EnC前提条件失敗:EnC非対応、PDB無視、プロファイラ存在、アーキテクチャ全体でのJITオプション切り替え)
  • MockDescriptors/MockDescriptors.ReJIT.cs - テスト用モック記述子を追加

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPRはネイティブDAC(Data Access Component)のセマンティクスをcDACで再現するものです。内部実装の変更で、デバッガの機能をサポートするための基盤整備です。


#127239 Harden permissions for pipe used in SharedServer.

概要

Unix名前付きパイプ(Unixドメインソケット)のファイルシステム権限を強化するため、PipeOptions.CurrentUserOnly使用時にソケットファイルのモードを明示的にユーザーのみ(0600)に設定します。ディスク上のエンドポイント権限を「現在のユーザーのみ」という意図に合わせ、リグレッションテストを追加しています。

変更内容

  • NamedPipeServerStream.Unix.cs: SharedServer作成時にCurrentUserOnly指定の場合、バインドされたソケットパスに0600(UserRead | UserWrite)の権限を適用。失敗時のクリーンアップ処理を追加。オプションチェックをPipeOptions.HasFlag(...)にリファクタリング。
  • NamedPipeTest.CurrentUserOnly.Unix.cs: CurrentUserOnly指定時にソケットパスがユーザーのみの権限を持つことを検証するリグレッションテストを追加。

パフォーマンスへの影響

影響なし

関連Issue

#127239

その他

  • Unix(Linux/macOS)プラットフォームのみに影響する変更です。
  • これはセキュリティ強化で、CurrentUserOnlyオプションを使用する場合、他のユーザーがパイプにアクセスできないことを保証します。
  • 公開API(PipeOptions.CurrentUserOnly)の動作は変わりませんが、Unix環境での実装時の権限設定がより厳密になります。

#127184 JIT: Avoid changing def registers that may assume an implicit kill

概要

LSRA(線形スキャン・レジスタアロケータ)でレジスタ割り当て時の競合解決ロジックを修正しました。BuildDef(tree, SRBM_REG)が固定レジスタへの定義で、そのレジスタに既存のインターバルが割り当てられている場合、定義レジスタの変更を避けることで、暗黙的なスピルが正しく発生するようにしています。

変更内容

  • src/coreclr/jit/lsrabuild.cpp: resolveConflictingDefAndUse関数内のロジックを修正
    • canChangeDefゲートを導入し、マルチレジスタノードの定義レジスタ再割り当てを防止
    • 固定レジスタ定義に対し、そのレジスタに現在アクティブなインターバルが存在する場合、定義レジスタの変更を制限
    • 暗黙的なスピルが期待通り発生することを保証

パフォーマンスへの影響

影響なし(バグ修正による動作正確化)

関連Issue

#127130 #127131

その他

この修正はストレステスト時に誘発されたレジスタアロケーション関連の誤コンパイル/テスト失敗に対応しています。JIT内部実装の修正であり、公開APIへの影響はありません。


#127182 Fix IJW OverflowException with 17+ by-ref parameters

概要

IJW(C++/CLI)リバースP/Invokeにおいて、17個以上のby-refパラメータを持つマネージド関数をネイティブコードから呼び出す際に発生していたOverflowExceptionを修正しました。

根本原因はStubSigBuilder::EnsureEnoughQuickBytesがバッファサイズを1回だけ2倍にしていたため、カスタム修飾子が保持される場合(PR #106000によるRegression)にシグネチャが512バイトを超えるとバッファオーバーフロー(CQuickBytesのインラインバッファ:256→512バイト)が発生し、引数カウント情報が破損していました。

変更内容

  • src/coreclr/vm/stubgen.cpp: EnsureEnoughQuickBytesのループロジックを修正し、リクエストされたサイズに足りるまで繰り返しバッファを2倍に成長させるように改善
  • src/tests/Interop/IJW/IjwNativeCallingManagedDll/IjwNativeCallingManagedDll.cpp: 18個のby-refパラメータ(const int&とconst IntWrapper&)を持つマネージド関数をネイティブコードから呼び出すIJWテストケースを追加
  • src/tests/Interop/IJW/NativeCallingManaged/NativeCallingManaged.cs: リフレクション経由でテストシナリオを実行する回帰テストを追加

パフォーマンスへの影響

影響なし。バッファサイズ計算ロジックの修正であり、パフォーマンスに有意な変化はありません。

関連Issue

#127166、#106000

その他

  • この変更はP/Invoke仲介コードの内部実装(ランタイムのシグネチャ構築ロジック)に対するバグ修正です
  • PR #106000でカスタム修飾子の保持が有効化されたことが、このレグレッションの引き金となっていました
  • GitHub Copilotの支援下で作成されました

#127117 JIT: eliminate redundant span checks across loop back-edge phis

概要

JITコンパイラのスパン範囲チェック最適化を改善し、ループ内でのSpan操作における冗長な境界チェックを削除します。ループバック辺のPhi引数に対して、追跡されたVNがADD(boundVN, cns)経由でチェック済み境界式と一致する場合の認識を強化することで、ループ内での繰り返される範囲チェックを削除します。

int Sum(ReadOnlySpan<int> data)
{
    Vector128<int> sum = default;
    while (data.Length >= Vector128<int>.Count)
    {
        sum += Vector128.Create(data);
        data = data.Slice(Vector128<int>.Count);
    }
    int result = Vector128.Sum(sum);
    foreach (var t in data)
        result += t;
    return result;
}

変更内容

  • rangecheck.cpp: RangeCheck::MergeEdgeAssertionsを拡張し、追跡されたVNがチェック済み境界式とADD(boundVN, cns)を通じて一致する場合を認識できるように改善。これにより、ループバック辺Phi引数が境界アサーションを継承し、冗長なチェックを削除可能に。
  • compiler.hpp: Compiler::optVisitReachingAssertionsをアップデートし、Phi引数のVNを潜在的に古いgtVNPairではなく、SSA定義のm_vnPairから読み取るように変更。これにより、アサーション伝播の精度を向上。
  • rangecheck.h: 新しいメソッドシグネチャの追加(+7行)。

パフォーマンスへの影響

改善あり。コード生成サイズが削減されます。提供されたコード例では、冗長な範囲チェック比較命令(cmp ecx, 4)と関連するジャンプが削除され、コード総バイト数が113バイトから79バイトに短縮(約30%削減)。これにより、命令キャッシュ効率とスループットが向上します。

関連Issue

#111309

その他

なし


#127074 JIT: Optimize async OSR resumptions

概要

Async OSR(On-Stack Replacement)の再開処理を最適化するPRです。従来、OSRメソッド内での再開はパッチポイントヘルパーを経由していましたが、このヘルパーのオーバーヘッドは10~20倍でした。本変更により、Tier0コードから直接OSRコードへのジャンプで再開し、パッチポイントヘルパーを完全に迂回します。

主な最適化内容:

  • GT_FTN_ENTRY(現在のコンパイル関数の入口アドレス)とGT_NONLOCAL_JMP(指定アドレスへの直接ジャンプ)という新しいIRノードを導入
  • OSRメソッドの継続情報にILオフセット(-1)の代わりにOSR入口アドレスを格納
  • Tier0のasync変換でGT_NONLOCAL_JMPを生成し、OSR再開時にパッチポイント経由ではなく直接ジャンプ
  • OSRメソッドのプロローグで疑似呼び出しスロット処理を実装
// 実行例:10,000,000回のawaitループの場合
// 最適化前: 6357.1 ms
// 最適化後: 457.1 ms (約13.9倍の高速化)

変更内容

コア変更:

  • async.cpp/h: 継続フィールドをOSR IL オフセットからOSRアドレスに変更、GT_NONLOCAL_JMPで再開
  • gtlist.h: GT_FTN_ENTRYとGT_NONLOCAL_JMPノード定義追加
  • gentree.cpp: 新ノードの比較・クローン・フラグ対応
  • lower*.cpp: 各アーキテクチャでGT_NONLOCAL_JMPのコンテインメントロジック追加

コード生成変更(全アーキテクチャ対応):

  • codegen*.cpp: GT_NONLOCAL_JMP/GT_FTN_ENTRYの生成、OSRプロローグ処理の改良
  • emit*.cpp: 関数入口ラベル実装、emitIns_R_L(..., insGroup*) オーバーロード追加(ARM64/RISC-V/LoongArch64)

その他:

  • jithelpers.cpp: パッチポイント遷移時のスタック/FP処理改善(amd64の疑似呼び出しスロット処理を削除)
  • liveness.cpp: GT_NONLOCAL_JMPを制御フロー命令として扱う
  • compiler.cpp: パッチポイント情報生成時のカリー保存マスク調整

パフォーマンスへの影響

大幅な改善:

  • ベンチマーク(10,000,000回のawaitループ):6357.1ms → 457.1ms(約13.9倍高速化)
  • OSR再開時のオーバーヘッドが10~20倍削減され、直接ジャンプで最小限のコスト

コード生成面での懸念:

  • Tier0コード:957バイト(前:960バイト、微減)
  • OSRメソッド:1072バイト(前:1067バイト、わずか微増)
  • パッチポイントヘルパー呼び出し排除による全

#127043 [Wasm RyuJit] EH, Unwind, and unwindable frames

概要

WebAssemblyのRyuJIT向けに、例外処理(EH)のアンワインド報告とアンワインド可能なフレーム実装を追加しました。Virtual IPスキームを導入して、EH領域と呼び出しサイトに一意のVirtual IP範囲を割り当て、ランタイムのスタックウォーキングと例外処理を可能にするための基盤を構築しています。

変更内容

  • fgwasm.cpp: 新しいfgWasmVirtualIPフェーズを追加。EH領域のVirtual IP範囲を計算し、各呼び出しの前にVirtual IPストアを注入し、アンワインド可能なフレームが必要な関数をマーク
  • compiler.h/cpp: Wasm固有のローカル変数フィールド(VirtualIP、ResumeIP、FunctionIndex)とフレームサイズ、アンワインド可能フラグを追加。新フェーズを低下化後かつFinalizeEH前に配置
  • codegenwasm.cpp: アンワインドスタック割り当てを記録し、キャッチfuncletのプロローグにアンワインド可能スロットを作成。localloc時のアンワインドマーカーを調整し、キャッチfuncletから値を返却。事前計算されたデータからEH句を報告
  • codegencommon.cpp/codegeninterface.h: EH句報告ロジックを共有ヘルパーgenReportEHClausesに抽出し、Wasmコードジェンでも利用可能に
  • unwindwasm.cpp: Wasmアンワインド予約・出力を実装し、関数ごとのフレームサイズを追跡
  • lclvars.cpp: VirtualIP/ResumeIP/FunctionIndexローカル変数をフレームレイアウトの最後に割り当て。フレーム図を追加
  • flowgraph.cpp/fgwasm.h: Wasmスロー補助の配置ロジックを調整してtry領域関連付けを許可。try-begブロックを領域エントリポイントとして扱う
  • jit.h/win64unwind.h: FrameSize情報を含むWasm固有のUNWIND_INFO定義を追加
  • 其他: PHASE_WASM_VIRTUAL_IP、WasmEHメモリ割り当て器などのコンパイラインフラを追加

パフォーマンスへの影響

影響なし(この変更はランタイムスタックウォーキング/EH処理の基盤実装であり、パフォーマンス最適化フェーズは別途実施予定)

関連Issue

なし

その他

  • 現在はVirtual IP割り当てにやや余裕がある設計。将来的に範囲圧縮の最適化予定
  • まだ未実装項目:GC報告でのVirtual IP使用、ホスト側処理(特にfunclet抽出)、ランタイムスタックウォーキングと例外処理
  • キャッチfuncletは実際のレジュームIPではなく、ランタイムへの値を返却するよう変更(レジュームIPはVirtual IPスペースとは異なる)
  • throw補助関数は従来のハンドラ領域ごとではなく、EH領域ごとに1つに統合され、呼び出し時に明確に定

#126794 [cDAC] Implement MarkDebuggerAttach* DacDbi APIs

  • 作成者: @Copilot
  • 作成日時: 2026年04月11日 19:28:10(UTC)
  • マージ日時: 2026年04月23日 22:11:37(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDAC(Common Data Access Context)デバッガー契約にMarkDebuggerAttachPendingとMarkDebuggerAttached APIを実装します。これらのAPIはg_CORDebuggerControlFlagsへのターゲットメモリ書き込みを通じてデバッガー制御フラグを設定します。また、ファイバーモード関連の不要なコードを削除しています。

変更内容

  • IDebugger.cs: MarkDebuggerAttachPending()とMarkDebuggerAttached(bool) メソッドをインターフェースに追加
  • Debugger_1.cs: 上記メソッドの実装を追加。CORDebuggerControlFlagsをターゲットメモリに書き込むロジックを実装
  • DacDbiImpl.cs: cDAC契約実装を呼び出し、エラーをHRESULTに変換する実装を追加(DEBUG時のレガシー検証機能付き)
  • Constants.cs: Globals.CORDebuggerControlFlagsグローバル名定数を追加
  • datadescriptor.inc: g_CORDebuggerControlFlagsをコアCLRデータディスクリプタに公開
  • cordbpriv.h: DBCF_PENDING_ATTACH/DBCF_ATTACHEDフラグにcDAC依存性アノテーションを追加
  • Debugger.md: 新APIグローバル依存関係およびフラグの動作を文書化
  • DebuggerTests.cs: テストターゲット配線と制御フラグ書き込み検証の単体テスト追加
  • ファイバーモードコード削除: process.cpp、rcthread.cpp、dbgipcevents.h、dbgtransportsession.cpp、corerror関連ファイルからファイバーモード関連の不要なコードを削除

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

Copilotレビュー時に、CordbProcess::UnrecoverableErrorの挙動変更について指摘されています。ファイバーモード処理の削除に伴い、条件が「全て除外(ファイバー処理)」から「合法的な致命的エラーのみ除外」に変更され、合法的な致命的エラー(例:CORDBG_E_INCOMPATIBLE_PROTOCOL)後にプロセスがゾンビ状態にならない可能性があります。この意図的な変更か動作仕様の見直しが必要な点として記録されています。


#126792 Use source-build-assets repo

概要

source-build-reference-packagesリポジトリがsource-build-assetsに名称変更されたため、VMR/source-buildシナリオ対応として中間依存関係を更新します。新しいリポジトリから生成された新しいパッケージバージョンに対応するため、バージョンとSHAも更新されます。

変更内容

  • eng/Version.Details.xml:
    • XML宣言を追加
    • Microsoft.SourceBuild.Intermediate.source-build-reference-packages依存関係エントリをMicrosoft.SourceBuild.Intermediate.source-build-assetsに置き換え(URI、バージョン、SHA、RepoNameを更新)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

本変更はソースビルド(source-build)とVMR(Virtual Monolithic Repository)のシナリオをサポートするための依存関係管理の更新です。source-build-reference-packagesリポジトリからsource-build-assetsリポジトリへの移行に伴う更新であるため、関連プロジェクトとの整合性確保が重要です。


#126543 Refactor UInt128 division

概要

UInt128 の除算アルゴリズムを128ビット値に特化した実装に最適化。BigInteger除算で使用されていた汎用的な処理を廃止し、128ビット範囲に限定した高速な除算ロジックに置き換え。DivRemを中核実装として、除算と剰余を同時に計算することで不要な乗算を排除。

変更内容

  • System/UInt128.cs: 除算アルゴリズムを128ビット特化版に完全リファクタリング

    • SIMD最適化を128ビット/128ビット除算に拡張(従来は128ビット/64ビット除算のみ対応)
    • DivRemを中核実装にし、DivideとRemainderがそれを活用するよう変更
    • 不要な乗算処理を削減し、コードサイズを削減(529バイト削減)
  • Int128Tests.GenericMath.cs / UInt128Tests.GenericMath.cs: ジェネリック数値演算テストの追加(各7行)

パフォーマンスへの影響

**Intel CPU(SIMD有効時)**での改善が顕著:

  • Div128BitsBy128BitsConst: 8.1ns → 2.2ns(73%削減)
  • Div128BitsBy128BitsVar: 13.2ns → 3.7ns(72%削減)
  • Div128BitsBy64BitsConst: 4.4ns → 2.2ns(50%削減)

Apple M1(ARM)でのSIMD活用時:

  • Div128BitsBy128BitsConst: 14.1ns → 4.4ns(69%削減)
  • Div128BitsBy64BitsConst: 29.6ns → 3.4ns(88%削減)

SIMD無効時(IntelDOTNET_EnableHWIntrinsic=0):

  • 128ビット/64ビット除算で顕著な改善(4.9倍向上)
  • 一部のケースでコードサイズ削減により軽微なオーバーヘッドが生じるが全体的には高速化

**剰余演算(Mod)**も同様に高速化:例えばMod128BitsBy128BitsConstで29%削減。

関連Issue

#125799

その他

  • 実装の中核がDivRemであるため、除算と剰余を同時に必要とする処理では効率的
  • コードサイズが529バイト削減され、キャッシュ効率向上による二次的な利益も期待できる
  • 変更は内部実装のみで、公開APIの破壊的変更なし

#125640 Remove unsafe code from StringParser

  • 作成者: @EgorBo
  • 作成日時: 2026年03月17日 01:52:06(UTC)
  • マージ日時: 2026年04月23日 18:13:31(UTC)
  • ラベル: area-System.IO

概要

System.IO.StringParserの数値解析メソッドからunsafeなポインタベースのコードを削除し、安全なspanベースのint/long/uint/ulong.Parse呼び出しに置き換えました。NumberStylesとCultureInfo.InvariantCultureを使用して、割り当てなしのまま安全性を向上させます。

変更内容

  • src/libraries/Common/src/System/IO/StringParser.cs

    • ParseNextInt32/Int64/UInt32/UInt64メソッドからunsafe/fixedポインタループを削除
    • ReadOnlySpan<char>ベースの安全なインデックス付きループに置き換え
    • *.Parse(ReadOnlySpan<char>, NumberStyles, CultureInfo.InvariantCulture)を使用
    • FormatExceptionをInvalidDataExceptionに変換(ThrowForInvalidData()経由)
    • 符号付き解析メソッドで先頭の+を明示的に拒否して元の動作を保持
    • System.Globalizationインポートを追加
  • src/libraries/Common/tests/Tests/System/IO/StringParserTests.cs

    • 無効な入力、空のコンポーネント、有効な値、オーバーフロー動作の検証テストを追加

パフォーマンスへの影響

影響なし。フレームワークのParseメソッドを使用することで、同等の効率性を保ちながら割り当てを回避しています。

関連Issue

#125640

その他

  • 破壊的変更: なし。例外契約は保持(OverflowExceptionは自然に伝播)
  • 適用範囲: 内部実装(System.IOの共有ユーティリティ)
  • セキュリティ: unsafeコードの削除により、メモリセーフティが向上

#125520 Fix UseSystemd() silently failing with ProtectProc=invisible

概要

UseSystemd() が ProtectProc=invisible で設定されたサービスで暗黙的に失敗する問題を修正。$SYSTEMD_EXEC_PID 環境変数(systemd v248+)を主要な検出方法として使用し、古いsystemdバージョン向けに /proc/{ppid}/comm をフォールバックとして保持します。また、NOTIFY_SOCKET に基づいて notifier を登録する仕組みを導入し、より堅牢な systemd サービス検出を実現します。

変更内容

  • SystemdHelpers.cs: GetIsSystemdService() に $SYSTEMD_EXEC_PID ベースの検出を追加し、PID一致確認を優先的に実行。従来の /proc/{ppid}/comm チェックはフォールバック用に保持。新たに IsSystemdNotify() メソッドを追加。
  • SystemdHostBuilderExtensions.cs: logger 登録は IsSystemdService() で条件付け、lifetime/notifier 登録は新設の IsSystemdNotify() で条件付けるよう変更。
  • SystemdNotifier.cs: NOTIFY_SOCKET 環境変数を読み込み後にクリアし、子プロセスへの継承を防止。
  • SystemdConstants.cs: 環境変数名の共有定数を新規作成。
  • テストプロジェクト: RemoteExecutor を使用したテストを追加し、$SYSTEMD_EXEC_PID の マッチング/ミスマッチ/欠落/不正フォーマットなどのシナリオをカバー。

パフォーマンスへの影響

影響なし

関連Issue

#125520

その他

  • 互換性: 破壊的変更なし。古いsystemd(Ubuntu 20.04 のsystemd 245、Debian 10 のsystemd 241など)にも対応する設計。
  • 検出ロジック: $SYSTEMD_EXEC_PID と現在のプロセスID(Environment.ProcessId)を比較して systemd サービスかを判定。ProtectProc=invisible の影響を受けない。
  • 既知の制限: Docker + notify シナリオでのタイムアウトは既存の問題(NOTIFY_SOCKET が notifier ソケットに プロキシされない)として記録済み。SystemdConsoleFormatter の $JOURNAL_STREAM 対応は別途 follow-up PR での実施予定。

#125397 [Async v2] Implement async method variant handling in AddMethod and UpdateMethod

概要

Edit-and-Continue (EnC) パスで Async v2 メソッドバリアント対応を実装するもの。EEClass::AddMethodDesc/EEClass::AddMethod を拡張して、非同期メタデータ(フラグと代替署名)を処理し、EnC メソッド更新ロジックが非同期メソッドバリアントを考慮するようにしました。

変更内容

  • class.h/class.inl: AddMethodDesc シグネチャを拡張し、非同期フラグとオプションの非同期署名パラメータを追加
  • class.cpp: 非同期戻り値型分類ロジックと非同期バリアント作成ロジックを EEClass::AddMethod に実装。EnC で追加される MethodDesc 作成時に非同期フラグ/署名を渡す
  • encee.cpp: EnC メソッド更新時に、メソッドの非同期カウンターパートのエントリポイントもリセット
  • method.hpp: メソッド記述に関連する非同期メタデータサポート用フィールド追加
  • debugger.cpp: デバッガー向けの非同期メソッドバリアント処理対応

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

本変更はランタイムのコンパイラ/メタデータ処理部分への内部実装変更であり、公開APIへの影響はありません。Edit-and-Continue機能の拡張に伴う変更で、C# の async/await メソッドの動的更新に対応します。


#114028 Annotate System.ServiceModel.Syndication for trimming and AOT

概要

System.ServiceModel.Syndication ライブラリを trimming と NativeAOT に対応させるため、外部リンカー抑止ファイルをコード内アノテーションに置き換えます。Activator.CreateInstance() が使用される箇所に DynamicallyAccessedMembers を追加し、リフレクション依存の API に RequiresUnreferencedCode / RequiresDynamicCode アノテーションを付与します。

変更内容

  • trimming/AOT アノテーション追加: Activator.CreateInstance(Type) を使用するメソッドに DynamicallyAccessedMembers(PublicParameterlessConstructor) を付与(SyndicationFeedFormatter、Atom10FeedFormatter、Rss20FeedFormatter など各フォーマッター)
  • RequiresUnreferencedCode / RequiresDynamicCode アノテーション: DataContractSerializer や XmlObjectSerializer を使用するメソッドに警告アノテーション追加
  • ILLink.Suppressions.xml 削除: 外部リンカー抑止ファイル(83行)を削除し、コード内アノテーションに統一
  • プロジェクト設定更新: AOT アナライザーを有効化し、非-.NETCoreApp TFM 向けに CodeAnalysis 属性ソースを追加
  • 参照サーフェス更新: ref プロジェクトに新しいアノテーションを反映

パフォーマンスへの影響

影響なし

関連Issue

#113990, #65218, #75480

その他

  • レビュー時に CategoriesDocument の DynamicallyAccessedMembers アノテーションについて、抽象クラスで internal なパラメータレスコンストラクタのため実装が不正確である可能性が指摘されています
  • CreateXmlContent(object) オーバーロードについて、RequiresUnreferencedCode のみで RequiresDynamicCode が不足しているという低信頼度コメントがあります

目次