#125011 Link pthread on OpenBSD
OpenBSD環境でpthreadライブラリをリンクするための変更です。System.Nativeネイティブライブラリのビルド設定を修正し、OpenBSD上でpthread機能を正常に利用できるようにしています。
dotnet/runtimeにマージされたPull RequestをAIで日本語要約
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
この月にマージされた 592 件を新しい日から順に並べています。タイトルをクリックするとその日のページの該当箇所へ移動します。Bot が作成した 53 件はタイトルのみにして、各日の最後にまとめています。
OpenBSD環境でpthreadライブラリをリンクするための変更です。System.Nativeネイティブライブラリのビルド設定を修正し、OpenBSD上でpthread機能を正常に利用できるようにしています。
Mach-O形式のセグメントヘッダー計算に関するバグを修正しました。セグメントのファイルオフセットが最初のセクションのアラインされたオフセットに設定されておらず、ファイルサイズがローダーコマンドを誤って含めていたため、filesize > vmsizeという不正な状態が発生していました。この修正により、llvm-objdumpやllvm-readobjなどのツールでの検証エラーが解消されます。
OpenBSD上でのpthread_set_name_np関数の使用方法に対応するため、src/minipal/thread.hを修正しました。OpenBSDでは同関数が戻り値を返さないという仕様の違いを考慮した条件分岐を追加しています。
深くネストされた正規表現の文字クラス減算([a-[b-[c-[...]]]])により、パーサーとRegexCharClassメソッドが再帰呼び出しされることで、キャッチ不可能なStackOverflowExceptionが発生し、プロセスが終了する問題を修正しました。再帰処理を反復処理に変換することで、すべての正規表現モード(None、Compiled、NonBacktracking)に対応しています。
// 修正前:深いネストで StackOverflowException
var pattern = "[a-[b-[c-[d-[e-[...深いネスト...]]]]]]";
var regex = new Regex(pattern); // クラッシュ
// 修正後:安全に動作
var pattern = "[a-[b-[c-[d-[e-[...10000階層まで...]]]]]]";
var regex = new Regex(pattern); // 成功
OpenBSD環境でEMULTIHOPとENOLINKエラー定数が存在しないため、これらの定数をプラットフォーム固有で定義する修正です。pal_error_common.hにOpenBSD向けの条件付きコンパイルディレクティブを追加し、該当する環境でのビルドエラーを解決します。
OneLocBuild の自動化プロセスによる多言語リソースファイルの定期チェックイン。Microsoft.Extensions.Logging.Abstractions ライブラリの XLF(XLIFF)形式の翻訳ファイルが更新されています。13言語のローカライズ済みリソースファイルが同期されました。
cDAC(Common DAC)の GetHandleEnum および GetHandleEnumForTypes メソッドにおけるCOM参照カウント(refcount)の不一致を修正しました。レガシーDAC実装と同様に、QueryInterface経由で列挙子を返す際に参照カウントをインクリメントするよう改善されています。
JIT メトリクス報告機能を制御する新しい環境変数 DOTNET_JitReportMetrics を導入しました。従来は DEBUG ビルド時に無条件でメトリクスを報告していましたが、この変更により必要に応じてのみ報告するようになり、不要な JIT-EE 呼び出しのオーバーヘッドを削減できます。SuperPMI は特別扱いで常に報告機能を有効化します。
// 使用例: 環境変数で制御
// DOTNET_JitReportMetrics=1 で有効化
if (JitConfig.JitReportMetrics())
{
Metrics.report(this);
}
JIT回帰テスト(vsw/373472)から誤って再追加されたActiveIssueAttributeを削除するPull Requestです。WASM プラットフォーム向けのテスト無効化を解除し、Apple モバイルプラットフォーム向けの既存の除外設定は維持されます。
ArrayEEClass (メタデータクラス) を削除し、多次元配列のランク情報を MethodTable::BaseSize から計算するように変更しました。ArrayClass は単にランクのみを保持していたため、既に BaseSize に エンコードされている情報は冗長でした。この変更により、CoreCLR が NativeAOT と同じアプローチに統一されます。
// ランク計算の例
DWORD boundsSize = GetBaseSize() - ARRAYBASE_BASESIZE;
DWORD rank = boundsSize / (sizeof(DWORD) * 2);
cDAC(Common Data Access Contract)に GetSyncBlockData API を追加し、SyncBlock情報の診断アクセスを可能にするPull Requestです。SyncBlockはオブジェクトの同期情報を管理する重要なランタイム構造体であり、このAPIを通じてデバッガやプロファイラが同期状態やロック情報を読み取れるようになります。
// ISyncBlock.cs - 新規インターフェース
public interface ISyncBlock : IContract
{
TargetPointer GetSyncBlock(uint number);
TargetPointer GetSyncBlockObject(uint number);
// その他メソッド定義
}
Thin Lock実装におけるスレッドID取得の最適化。従来のプリコンパイルされたスレッドID(DWORD tid)ではなく、Thread*ポインタを渡し、スレッドIDが必要なコードパスでのみGetThreadId()を呼び出すように変更。これによりCPUのパイプライン性能向上を目指し、.NET 11の生成アセンブリを.NET 10に近づけることで性能回復を実現。
// 変更前: スレッドIDを事前計算
AcquireHeaderThinLock(GetThread()->GetThreadId());
// 変更後: Thread*ポインタを渡す
AcquireHeaderThinLock(GetThread());
// GetThreadId()は必要なパスでのみ呼び出し
Windows上でDirectory.Delete(path, recursive: true)を実行する際、NTFSジャンクション(ディレクトリジャンクション)を含むディレクトリ削除が失敗する問題を修正しました。ジャンクションとボリュームマウントポイントが同じリパースタグ(IO_REPARSE_TAG_MOUNT_POINT)を共有していることが原因で、DeleteVolumeMountPointの失敗がジャンクション削除時も発生していました。エラーハンドリングを改善し、RemoveDirectoryが成功する場合はエラーを無視するようにしました。
// 修正前:DeleteVolumeMountPoint失敗がexceptionを汚染してRemoveDirectoryの成功を妨ぐ
// 修正後:エラーを一時変数に段階化し、RemoveDirectoryも失敗した場合のみ昇格
Exception? mountPointException = null;
if (!Interop.Kernel32.DeleteVolumeMountPoint(mountPoint))
mountPointException = ...; // 一時的に段階化
if (!Interop.Kernel32.RemoveDirectory(dirPath) && exception == null)
exception = mountPointException ?? Win32Marshal.GetExceptionForWin32Error(errorCode, fileName);
JIT コンパイラの非同期呼び出し最適化をリファクタリングしました。新しい getAsyncOtherVariant JIT-EE API を導入して、async/task-returning メソッドの別の非同期バリアントを返せるようにしました。従来の AwaitVirtual トークンを削除し、JIT 側で直接呼び出しの場合に最適化を実装することで、VM とのインターフェースを簡潔化しています。
macOSのSystemNative_FSync関数に存在するC演算子優先度バグを修正しました。バグによりfcntl(fd, F_FULLFSYNC)のエラーが暗黙に無視され、SMBネットワーク共有上でファイルが破損・切り詰められる問題を解決します。FileStream.Flush(flushToDisk: true)を使用するデータベースやトランザクションログなどに影響します。
// 修正前(バグ): result が boolean値(0または1)を取得
// while ((result = fcntl(fileDescriptor, F_FULLFSYNC) < 0) && errno == EINTR);
// 修正後(正常): result が実際の戻り値(エラー時は-1)を取得
// while ((result = fcntl(fileDescriptor, F_FULLFSYNC)) < 0 && errno == EINTR);
このPRは、DownlevelLibraryImportGeneratorから診断ロジックを専用アナライザーDownlevelLibraryImportDiagnosticsAnalyzerへ分離する設計変更です。これはPR #123780でLibraryImportGeneratorに対して実施された変更を同じパターンで適用するもので、Roslynの推奨事項に従い、ジェネレータはコード生成に集中し、診断はアナライザが責務を持つアーキテクチャへの移行です。
ロギングソースジェネレータのテスト基準値を更新するテスト修正です。先行するPR(#124638と#124589)の関連する変更がテスト実行時に相互に影響を与えたため、生成されたコードの型表示フォーマットを修正し、生成されたシグネチャでglobal::System.Int32の代わりにint C#キーワードを使用するように統一しました。これによりCI失敗を解決しています。
ロギングジェネレータの診断メッセージにおいて、C#キーワード('out'、'partial'、'void'、'static'、'params'、'scoped'、'ref struct'など)をシングルクォートで囲むことで、翻訳品質の向上を目指すPRです。PR #124957のチェコ語翻訳の品質が低かったため、キーワードを明示的にマークすることで機械翻訳エンジンが翻訳対象外として認識しやすくなります。
OneLocBuildタスクによる自動チェックイン。Microsoft.Extensions.Logging.Abstractionsライブラリの翻訳ファイル(.xlf形式)を複数言語にわたって更新。翻訳パイプラインから生成されたローカライズされたリソースファイルの同期処理です。
DecodeWithWhiteSpaceBlockwise メソッド内の型チェック(is演算子)にコピーペーストエラーがありました。UTF-16文字(ushort)のBase64デコーディングパスで、Base64DecoderByteのチェックが残されていたため、常に偽となり、不要な追加処理が発生していました。Base64DecoderCharへの修正により、デコーダが正しく識別され、効率的な処理パスが使用されるようになります。
cDAC(Compiled Data Access Component)の RangeSectionFragment.Next ポインタから collectible タグビット(ビット0)を取得する修正です。ネイティブランタイムはこのビットをフラグとして使用していますが、cDAC が未処理のポインタを読み込んでいたため、スタックウォーク中に misaligned メモリアクセスが発生し、VirtualReadException が起こっていました。修正は単純で、ポインタ読み込み時にビット0をマスクするだけです:
Next = target.ReadPointer(address + (ulong)type.Fields[nameof(Next)].Offset) & ~1ul;
JITコンパイル中の過度なメモリ割り当ての問題を解決するため、Value Number (VN) キャッシング機構とグローバルアサーション伝播の最適化を含む前のコミットを元に戻すリバート変更です。IL サイズベースのシンプルなアサーション数ヒューリスティックに復元され、VN キャッシュの複雑な機構が削除されます。
このPRは、xclrdata.idlとclrdata.idlで定義されているIXCLRDataおよびICLRData COM インターフェースの、マネージド[GeneratedComInterface]定義を追加します。デバッガやDiagnosticツール向けのCOM相互運用性を強化し、ネイティブCOMインターフェースへのマネージドアクセスを実現します。
// IXCLRDataAppDomain などのマネージド定義が追加
[GeneratedComInterface]
internal partial interface IXCLRDataAppDomain : IUnknown
{
// インターフェース定義
}
このPull Requestは、非同期Main()メソッドの処理に関する一時的なコードを削除し、新しいAPIを採用するリファクタリングです。coreCLRのエントリーポイント処理を簡潔にし、System.Runtime.CompilerServices.AsyncHelpersを活用した新しい実装パターンへ移行します。Issue #121064の修正に対応しています。
Webcilfォーマットの標準化と堅牢性向上を目指すPRです。セクション配置の16バイト境界アライメント、デバッグディレクトリ修正ロジックの改善、ビッグエンディアン環境でのヘッダーパース버그修正、およびAPI命名規約をWebCil*からWebcil*に統一しています。
System.Text.Json テストスイート全体で、@" 型の冗長な文字列リテラルを C# 12 の raw string literals (""") に変換しました。121個のテストファイル中、2,050個の変換を実施。テストコードのみの変更で、JSON等のテストデータの可読性が大幅に向上します。すべての 58,449 テストが合格済み。
Before/After 例:
// Before
string json = @"{""Name"": ""Angela"", ""Manager"": { ""$ref"": ""1"" }}";
// After
string json = """{"Name": "Angela", "Manager": { "$ref": "1" }}""";
dotnet/runtimeのJIT(Just-In-Time)コンパイラのフローグラフ関連ファイルに対するコード品質改善PRです。コメントのタイポ修正、型付けミスの修正、到達不可能なコードの削除、変数シャドーイングの解決など、複数の技術的負債を解消しています。機能的な変更ではなく、コード保守性の向上が主目的です。
WebAssembly(WASM)環境においてILヘルパースタブを持つメソッドのプレスタブ処理を修正しました。Issue #121955で報告された問題に対応するもので、CoreCLRのプレスタブ実装とインタープリタコンパイラの処理の整合性を改善しています。
CoreCLRの interpreter において AsyncHelpers.TailAwait intrinsic を実装し、instantiating と unboxing stubs で使用するようにしました。これにより不要な continuation の生成が削減され、NativeAOT と同様の最適化が CoreCLR にも適用されます。
// TailAwait は非同期操作を tail call で実行し、
// 追加の continuation 構造なしで awaiter を処理可能にします
Azure Pipelines のテスト結果公開における回帰問題を回避するため、runtime-diagnostics.yml に対応策を追加しました。テスト結果の公開処理に関連する設定が変更され、パイプラインの動作が改善されています。
illumos プラットフォームにおいて、X.509 証明書ストアのディレクトリ読み込みでファイル名が 1 文字のみ読み込まれる問題を修正しました。sizeof(d->d_name) の使用を削除し、NAME_MAX または MAXNAMLEN を使用することで、完全なファイル名の読み込みを実現しています。
// illumos では dirent 構造体の d_name フィールドのサイズが固定されておらず、
// sizeof(d->d_name) では正確なバッファサイズが得られない問題がありました
// 修正により NAME_MAX/MAXNAMLEN で適切なバッファサイズを確保
EEHashTableのバケット配列解放時にGCX_COOP(協調的GCモード遷移)をEpoch-Based Reclamation(EBR)に置き換え。これにより、GC関連のロック競合を減らし、より安全で効率的なメモリ回収メカニズムを実装します。HashMap同様のパターンに統一しました。
cDAC(Compact Diagnostics and Analysis Code)におけるEEClass検証の不具合を修正したPull Requestです。SOSデバッガが無効なメモリアドレスをGetMethodTableDataに渡す際、そのアドレスが偶然MethodTableへのポインタを持つため初期検証をパスしてしまう問題を解決しました。修正後は、EEClass全体が読み取り可能で有効であることを確認してから処理を進めるようになります。
このPRは、cDAC(Common Data Access Component)APIにGetHandleEnumとGetHandleEnumForTypesという2つの新しいAPIを追加するものです。これらのAPIは、.NETランタイムのハンドルテーブルを列挙するための機能を提供し、診断ツールがGCハンドルやCOMラッパーオブジェクトの情報にアクセスできるようになります。
WebAssemblyのRyuJIT対応において、型インデックスのリロケーション機構を実装しました。WasmTypeNodeシンボルが型情報を管理し、オブジェクトライタがシグネチャに対してモジュール内でのインデックスを割り当て、WASM_TYPE_INDEX_LEBリロケーションを解決します。現在はテスト用にvoid(int, int)シグネチャ(マネージド静的メソッドの低レベル表現)がハードコードされています。
LoggerMessage ソースジェネレータが汎用ログメソッドをサポートするようになりました。従来は SYSLIB1011 エラーで拒否されていた汎用メソッドが生成可能に。allows ref struct 制約(C# 13)を持つメソッドのみ SYSLIB1011 が発生します。ボックス化を避けた高性能なログ出力が実現可能です。
// 従来: SYSLIB1011エラー。現在: 動作可能(TCodeはボックス化されない)
[LoggerMessage(0, LogLevel.Trace, "Received {Code} ({Length} bytes)")]
public static partial void PacketReceived<TCode>(ILogger logger, TCode code, int length)
where TCode : struct, Enum;
新しいパブリックAPI RuntimeFeature.IsMultithreadingSupported を追加し、ランタイムがマルチスレッド機能をサポートしているかを実行時に判定できるようにしました。これにより、シングルスレッド環境(WebAssemblyなど)での条件分岐が容易になります。
if (RuntimeFeature.IsMultithreadingSupported)
{
// マルチスレッド処理
}
else
{
// シングルスレッド処理
}
Adler32ハッシュアルゴリズムの実装をSIMD命令を使用してベクトル化し、パフォーマンスを大幅に向上させました。大量のデータに対するハッシュ計算が高速化されます。
// 従来: スカラー計算による逐次処理
// 新版: SIMD命令による並列化
System.Net.WebProxyとIWebProxyScriptに対する包括的なXML documentation(IntelliSense対応のドキュメント)をbackportしました。dotnet-api-docsから移植され、11個のコンストラクタ、6つのプロパティ、3つのメソッドをカバーしています。.NET Framework固有の内容や実装詳細を除外した実用的なドキュメント整備です。
NativeAOT対応のSystem.Private.CoreLibでruntime-asyncコンパイラ機能を有効化しました。この機能により、async メソッドがコンパイラ生成のステートマシンではなくランタイムのネイティブ非同期サポートを使用するよう変換され、パフォーマンスが向上します。Preview機能の使用警告(CA2252)はプロジェクトレベルで抑制しています。
// runtime-asyncが有効になると、async メソッドは以下のように変換される
public async Task MyAsyncMethod()
{
await SomeOperation();
}
// → コンパイラがAsyncHelpers.Awaitを注入してランタイムネイティブ非同期に変換
InterpreterがJITと共有コードを使用するため、JITのCompAllocatorを採用しました。これにより、メモリ割り当てを効率的に管理し、割り当てコストをカテゴリ化・計測できるようになります。新しいjitsharedディレクトリを作成し、InterpreterとJIT間のコード重複を削減します。環境変数DOTNET_JitMemStats=1で統計情報サマリーを、=2でメソッド別データを取得できます。
System.Reflection.Context.Tests のコードカバレッジを約35%から87%に大幅に向上させるPRです。新たに21個のテストファイルを追加し、649個のテストすべてが合格しています。テスト内容は、カスタムタイプ、メソッド、コンストラクタ、イベント、プロパティ、フィールド、パラメータ、モジュール、アセンブリなど、反射コンテキスト機能の各要素を網羅的にテストしています。
重複するTypeDefを持つモジュール読み込みをテストするために設計されたテストケース(test5.il/test5.ilproj)を削除するPRです。このテストは、PEファイルの二進後処理(.cptファイルを使用した修正)を必要としていますが、そのセットアップがリポジトリに含まれていないため、実際にはテストシナリオが機能していませんでした。削除対象のテストは本質的に不完全で、その目的を達成していません。
正規表現の最適化において、先行する大文字小文字を区別しないプリフィックス抽出後に分岐が単一ノードに縮小される場合、ExtractCommonPrefixNodeが処理を停止していた問題を修正しました。例えば(http|https)というパターンでhttpではなくhttのみが抽出されていた不具合を解決しています。修正により、Concatenationと単一ノード両方の分岐を適切に処理し、共通プリフィックスを完全に抽出できるようになりました。
// 修正前: (http|https) IgnoreCase => "htt"を抽出
// 修正後: (http|https) IgnoreCase => "http"を抽出
複数のヒープが存在する場合のGCハンドル列挙の完全性を確保するバグ修正です。DAC(Debugging Access Component)がマルチヒープ環境でGCハンドルを正しく列挙できていなかった問題を解決します。これにより、デバッガやダンプ解析ツールが複数ヒープを持つシステムで正確なGCハンドル情報を取得できるようになります。
Windows で UNC アクセスが無効化されている環境で ResolveLinkTarget_Succeeds テストが失敗する問題を修正します。returnFinalTarget=true の場合に UNC パスの実際の解決を試みることが原因で、テストが IOException: The specified network name is no longer available で失敗していました。本変更はテストデータ生成ロジックを修正し、UNC パスに対しては returnFinalTarget=false のみを適用することで問題を回避します。
SVE2のscatter命令(非時間順序版)において、インデックスベースの形式でシフト済みオフセット値を保持するための一時レジスタが不足していた問題を修正しました。SVE1では3つのscatter形式(アドレスベクトル、単一アドレス+インデックスベクトル、単一アドレス+バイトオフセットベクトル)がサポートされていますが、SVE2のインデックス版はオフセットをシフトしてから命令を呼び出す必要があるため、このシフト値を保持する一時レジスタを確保するようにしました。
WebAssembly(WASM)ブラウザ環境におけるアセンブリのレイジーロード機能とサテライトアセンブリ対応を追加するPull Requestです。アセンブリの遅延読み込みにより、初期ロード時間の短縮とメモリ使用量の最適化を実現します。Issue #120226に関連した実装で、TypeScript/JavaScriptの相互運用層を中心に変更されています。
このPull Requestは、macOS上でWASMブラウザテストを実行するため、Chrome ブラウザとChromeDriverのプロビジョニング機能を追加します。Linux/Windows向けの既存プロビジョニング設定と同様の構成をmacOSに実装し、Chrome 143.0.7499.40、V8 14.3.127などのバージョン情報を含みます。
macOS環境でReadyToRun(crossgen2)コンパイル時に継続的に失敗していたFileSystemWatcher_SymbolicLink_TargetsDirectory_Create_IncludeSubdirectoriesテストを無効化しました。このテストはシンボリックリンク経由のディレクトリ監視でファイルシステム変更イベントの監視に関するもので、ReadyToRunコンパイル時にのみ問題が発生するため、該当条件下でのみスキップするように修正されています。
cDAC(Compact Data Access Components)ベースの SOSDacImpl に ISOSDacInterface::GetThreadAllocData を実装しました。スレッド単位の GC アロケーションバイト数カウンター(AllocBytes と AllocBytesLoh)を gc_alloc_context から公開し、診断ツールがメモリ割り当て情報を取得できるようにします。
// ThreadAllocData レコード(新規)
public record ThreadAllocData
{
public ulong AllocBytes { get; set; }
public ulong AllocBytesLoh { get; set; }
}
このPRはcDAC (Compact DAC)でISOSDacInterface::GetObjectClassNameの実装を追加し、レガシーのスタブを置き換えるものです。オブジェクトのMethodTableから型名を取得する機能をcDAC側で実装し、アンロード済みモジュールへの対応や複数のテストケースを含めています。
// 基本的な実装パターン
var methodTableAddress = obj.GetMethodTableAddress();
var typeHandle = runtimeTypeSystem.GetTypeHandle(methodTableAddress);
var typeName = TypeNameBuilder.AppendType(typeHandle, FormatNamespace | FormatFullInst);
JIT のオブジェクト割り当て最適化コード (objectalloc.cpp) における複数のバグ修正とリファクタリング。エスケープ分析の誤りを修正し、AnalyzePseudoForCloning メソッドを新規抽出。これにより、不正なエスケープ判定やDUMP出力の不整合を解決。
Windows上でTar作成時に、シンボリックリンク/ジャンクション以外の再解析ポイント(reparse point)を処理する際の動作を改善。従来は暗号的なエラーメッセージ(LinkTargetがnullのためLinkNameが空文字列エラー)が発生していましたが、本変更により以下の動作に統一:
JITの独立ビルドにおいて、throwing版のoperator new/deleteは上書きされていますが、nothrow版は上書きされていないため、libstdcのnothrow実装が内部的にthrowing版を呼び出す際、標準ライブラリではなくJITのアサート付きオーバーライド版を呼び出してしまう問題を修正しました。src/coreclr/jit/alloc.cppにnothrow版のoperator new/deleteオーバーライドを追加することで、libstdcがアサート付きの関数を呼び出さないようにしました。
versioningされた仮想/インターフェースメソッドのコール計数インフラストラクチャから専用のフォワーダースタブを廃止し、メソッド自体の一時エントリポイント(precode)を再利用することで、メモリオーバーヘッドと複雑性を削減しました。vtableスロットはprecodeをリセットして指し、precodeターゲットは呼び出し計数スタブにリダイレクトされます。これにより、vtableスロットが削除可能な呼び出し計数スタブを直接指すことがなくなりながら、フォワーダースタブの割り当てが完全に排除されます。
Assembler::EmitGenericParamConstraintsメソッドにおいて、ジェネリック型パラメータの制約情報を格納するバッファ(pConstraintsArrとpGPConstraintsArr)のメモリリークを修正しました。外側の配列ポインタのみが削除され、各型パラメータごとの内側のメモリ割り当てがリークしていた問題を解決します。SVACE静的解析ツールにより発見されました。
ARM64アーキテクチャのJITコンパイラにSM4(暗号化)とSHA3(ハッシュ)命令セットを追加し、既存の暗号関連命令の実装を修正するPRです。umull/smull、stlurb、ldapur、smaddl などの命令グループの定義を修正し、テストケースを追加・更新しています。
ServiceDescriptor.IsKeyedServiceプロパティに[MemberNotNullWhen]属性を追加し、静的null可能性分析の精度を向上させました。これにより、IsKeyedServiceがtrueの場合にServiceKeyが非nullであることをコンパイラが認識でき、null許容演算子(!)の使用を不要にします。
if (descriptor.IsKeyedService)
{
object serviceKey = descriptor.ServiceKey; // null許容警告が発生しなくなる
}
このPRは、DAC/cDAC環境下でのReJIT有効性検出の問題を修正します。ProfAPI_RejitOnAttach設定をターゲットランタイムにキャッシュし、cDACがデバッガプロセスの環境変数を誤って使用する代わりに、このキャッシュ値を読み込むようにしました。これにより、ReJITManager::IsReJITEnabled()がDAC環境で正確に動作するようになります。
インタープリター フレーム(InterpreterFrame)から管理コード/ネイティブコードへの遷移処理を、スタックフレームイテレータ内に完全に隠蔽し、例外処理(EH)コードの特殊ハンドリングを削除するリファクタリング。また、インタープリター起動時の遷移フレームを常に使用し、callee saved floating point レジスタを拡張することで、libunwindの使用を削減し、デバッガのシングルステップ実装を簡素化しています。
WebAssembly RyuJIT コンパイラに localloc 命令のサポートを実装しました。スタック上に動的サイズのメモリを確保する機能を追加し、フレームポインタの管理、スタックアライメント(16バイト)、オーバーフロー検出対応を含みます。
StreamPipeReader.AdvanceTo() メソッドで、異なる PipeReader の SequencePosition を渡した場合に到達可能な Debug.Assert を修正しました。Debug AssertをValidation例外に置き換え、無効な consumedBytes 値をチェックして InvalidOperationException をスローするようにしました。これにより、デバッグビルドでのアサート失敗だけでなく、リリースビルドでの状態破損も防止されます。
// 修正前:デバッグビルドで失敗、リリースビルドで状態破損
PipeReader reader1 = PipeReader.Create(new MemoryStream(new byte[10]));
PipeReader reader2 = PipeReader.Create(new MemoryStream(new byte[1000]));
var result2 = await reader2.ReadAsync();
reader1.AdvanceTo(result2.Buffer.End); // Debug.Assertで失敗または状態破損
// 修正後:すべてのビルドで例外をスロー
reader1.AdvanceTo(result2.Buffer.End); // InvalidOperationException
RangeSectionMap::EnumMemoryRangeSectionMapLevelのテンプレートオーバーロードに存在する論理バグを修正するワンラインの変更です。IsNull()の条件が反転していたため、64ビット環境でレベルL2~L5のメモリ列挙時にNULLエントリを再帰処理し、有効なエントリをスキップしていました。この修正により、DAC(Debug Assist Component)によるメモリダンプ生成時に、正しくすべてのメモリ領域が列挙されるようになります。
このPRは、dotnet/runtimeのdev containerの設定にSSH(sshd)とGitHub Copilot CLIの機能を追加しています。開発環境でSSHアクセスおよびCopilot CLIの利用が可能になります。
cDAC(Compact Diagnostics Access Control)マネージドスタックアンワインダーの3つの正確性バグを修正します。AMD64アンワインダーでは、UWOP_PUSH_MACHFRAMEが誤ってマシンフレームフラグをfalseに設定してRIP/RSPを二重読込みする問題、UWOP_SAVE_NONVOL_FARオペコードの未実装により非volatile レジスタ復元が失敗する問題を修正。X86アンワインダーではデバッグ用のConsole.WriteLineを削除します。
// Bug 1: UWOP_PUSH_MACHFRAME - machineFrame = false → true に修正
case UnwindCode.OpCodes.UWOP_PUSH_MACHFRAME:
{
machineFrame = true; // 修正前: false
// ...
}
// Bug 2: 不足していた UWOP_SAVE_NONVOL_FAR ケースを追加
case UnwindCode.OpCodes.UWOP_SAVE_NONVOL_FAR:
{
uint frameOffset = GetUnwindCode(unwindInfo, index + 1).FrameOffset;
frameOffset += (uint)(GetUnwindCode(unwindInfo, index + 2).FrameOffset << 16);
SetRegister(ref context, unwindOp.OpInfo, _target.ReadPointer(frameBase + frameOffset));
index += 2;
break;
}
AMD64 cDAC アンウインダーの epilogue emulation において、単一バイト pop r64 命令(レジスタ 0–7)のレジスタ番号を誤ったバイトオフセットから読み込んでいたバグを修正しました。pop r64 は単一バイトのオプコード(0x58 + r)であり、レジスタは opcode バイト自体の下位 3 ビットにエンコードされているため、nextByte + 2 から読むと任意の命令列のバイトを読み込み、unwound レジスタコンテキストが破損していました。
// 修正前(誤り — opcode の 2 バイト先を読む)
byte registerNumber = (byte)(ReadByteAt(nextByte + 2) & 0x7);
// 修正後(正 — nextByte から直接読む)
byte registerNumber = (byte)(ReadByteAt(nextByte) & 0x7);
WASM RyuJitコンパイラがSystem.Private.CoreLibのcrossgen2処理中に検出された複数の問題を修正するPRです。構造体の処理、値番号付け、制御フロー、スイッチ最適化に関する5つの主要な修正が含まれています。
ARM32 のNativeAOT GC hijack パスにおいて、非同期継続を保持するr2レジスタが上書きされるバグを修正しました。RhpWaitForGcを通じてThread*をr3で保持することで、r2の値が保護される前に破壊されるのを防ぎます。
// ARM32 アセンブリレベルの修正
// 修正前: mov r2, r3 が r2 を上書きしていた
// 修正後: RhpWaitForGC が r3 から直接 Thread* を取得
Azure Pipelines の runtime-diagnostics ジョブで、テスト失敗時に自動的にクラッシュダンプとテストログをパイプラインアーティファクトとして公開するように更新しました。これにより、cDAC/DAC実行時の失敗調査が改善されます。
x86時代の例外処理(EH)レガシー機能であるCORINFO_HELP_ENDCATCH JITヘルパーを削除するクリーンアップPRです。JIT/EEインターフェース、ReadyToRunヘルパーマッピング、およびNativeAOT反射マップから該当機能を完全に削除し、JIT/EEインターフェースバージョンGUIDを更新します。
SOSDacImpl.csの約30個のメソッドで、引数・ポインタ検証チェックをtryブロック前から内部に移動し、早期リターンを例外スローに変更。これにより、catch ブロックのHResult変換と#if DEBUGブロックが確実に実行されるように修正。
// Before —検証がtry/catchをバイパス
if (data == null)
return HResults.E_INVALIDARG;
// After — 検証がエラーハンドリング の一部に
try
{
if (data == null)
throw new ArgumentException();
// ...
}
catch (Exception ex) { hr = ex.HResult; }
SubReadStream(ZIP非圧縮エントリで使用)では、Seek(offset, SeekOrigin.End)またはPosition = value > Lengthでストリーム終端を超えてシークが可能でしたが、Readメソッドの3つのオーバーロードすべてが_positionInSuperStream <= _endInSuperStreamを前提としており、負の値を計算してDebug.Assert(count >= 0)に到達していました。本修正では、終端を超える位置での読み取り時に0バイトを返すよう改善しています。
ms.Position = 0;
using var readArchive = new ZipArchive(ms, ZipArchiveMode.Read);
using var readStream = readArchive.Entries[0].Open(); // 非圧縮エントリ
readStream.Seek(1, SeekOrigin.End); // 終端を超えてシーク
readStream.Read(buffer, 0, buffer.Length); // ← Debug.Assertが発火していた
このPRは、cDAC(Compact Diagnostics And Contracts)のSOSDacImplにISOSDacInterface12::GetGlobalAllocationContextを実装し、グローバルな割り当てコンテキストへのアクセスを提供します。ネイティブのClrDataAccess::GetGlobalAllocationContextをミラーリングし、GCコントラクト層を通じてg_global_alloc_contextを公開します。
// SOSDacImpl.cs での実装例
public int GetGlobalAllocationContext(out TargetPointer allocPtr, out TargetPointer allocLimit)
{
try
{
_target.Contracts.GC.GetGlobalAllocationContext(out allocPtr, out allocLimit);
return S_OK;
}
catch
{
allocPtr = default;
allocLimit = default;
return E_FAIL;
}
}
cDAC(Compact Data Access Contract)のSOSDacImplクラスにGetRegisterNameメソッドを実装しました。レガシーDAC委譲からRuntimeInfoコントラクトベースの実装に移行し、実行時にGetTargetArchitecture()でターゲットアーキテクチャを動的に判定します。X64、X86、ARM、ARM64、LoongArch64、RiscV64の6つのアーキテクチャに対応し、コンパイル時の#ifdefガードが不要になります。
System.Management WMIインターオップレイヤーにおけるGCセーフティの問題を修正するPRです。ネイティブコールバックに渡されるIntPtrフィールドを含むオブジェクトが、ガベージコレクションされる可能性があったため、GC.KeepAlive呼び出しを追加してオブジェクトをルート化しました。
string.Join()メソッドがReadOnlySpan<string>型のオーバーロードに対応していることを活用し、不要な.ToArray()呼び出しを削除してメモリアロケーションを削減する最適化です。Http2Connectionのロギングコード内の2箇所で改善されています。
// 修正前
string.Join(", ", headers.Select(h => h.Key).ToArray())
// 修正後
string.Join(", ", headers.Select(h => h.Key))
xUnit v3への対応に向けて、ConditionalFactおよびConditionalTheory属性の使用を、型パラメータを受け取るコンストラクタへ移行するテストコード全体の大規模アップデートです。旧コンストラクタが非推奨化されたため、309ファイルにわたって統一的に変更されています。
このPRは、browser-wasmのパフォーマンスベンチマークパイプラインにおいて、既存のMono実装に加えてCoresCLRランタイムのビルドとテストサポートを追加するものです。新しいビルドジョブを追加し、パラメータ化することでCoresCLRとMono両方のランタイムでwasmベンチマークを実行できるようになります。
cDAC(Compact Data Access Component)の GetILAddressMap と GetILOffsetsByAddress メソッドが、デバッグメタデータを持たないメソッド(ILStubs など)に対して正しくないエラーコード(0x80131c49)を返していた問題を修正しました。レガシーDAC と同じ E_FAIL (0x80004005) を返すようにします。また、P/Invoke シナリオ向けの包括的なダンプベースの統合テストとOS対応テストスキップ機能を追加します。
// 修正前:デバッグ情報なしの場合、例外経由の予期しないHResultが返されていた
// 修正後:HasDebugInfo() で明示的にチェック
var hasDebugInfo = debugInfo.HasDebugInfo(pCode);
if (!hasDebugInfo)
{
throw (int)HResults.E_FAIL;
}
var offsetMappings = debugInfo.GetMethodNativeMap(pCode); // 非null返却
ARM64 JIT レジスタストレス時に、VectorTableLookup (TBL) 命令で4つの連続レジスタ割り当てに失敗する問題を修正しました。LSRA(Linear Scan Register Allocator)が d31→d0 のラップアラウンド時に、レジスタ使用状況マスク(consecutiveRegsInUseThisLocation)を誤った計算で扱っていたことが原因です。
正規表現エンジンで複数の選択肢プレフィックス(a|b|c|...)を持つパターンに対し、文字頻度ベースのヒューリスティックを導入。高頻度の開始文字にはSearchValues<string>(Teddy/Aho-Corasick)を使用し、低頻度の文字には既存のFixedDistanceSets(IndexOfAny)にフォールバック。regex-reduxで1.81倍高速化、Leipzigテストで3.28倍高速化を実現。ASCII以外のパターンはヒューリスティックを無視し、既存動作を保持。
// 例:パターン "a|b|c" の場合、a, b, c は英語テキストで高頻度なため
// SearchValues (Aho-Corasick) を使用して複数文字列を同時検索
// パターン "T|A|B" の場合、大文字は低頻度なため IndexOfAny を優先
WebAssembly RyuJit コンパイラに内部レジスタサポートを追加し、ADD/SUB/MUL操作のオーバーフロー検査を実装します。結果が複数回使用される場合に内部レジスタを活用し、long型のMUL操作についてはランタイムヘルパーに委譲します。
特殊なマーカー型(special marker type)を親に持つサブインターフェースで、複雑な型引数(例:IList<T>)を含む正確なインスタンス化がある場合、LoadExactInterfaceMapが誤った処理を行っていた問題を修正しました。pNewIntfMTに対する適格性チェックを正しく実行するようにロジックを分割し、特殊マーカー型の最適化を正確に適用できるようにしました。
ALPN(Application-Layer Protocol Negotiation)プロトコルリストのサイズフィールド型を short から ushort に修正し、Windows ネイティブ API および RFC 7301 に準拠させました。最大サイズを 32,767 バイトから 65,535 バイトに拡大し、境界値テストを追加して検証ロジックを強化しています。
// 修正前
private short ProtocolListSize; // 最大32,767バイト
// 修正後
private ushort ProtocolListSize; // 最大65,535バイト
LoggerMessage ソースジェネレータの修正により、ref readonly パラメータ修飾子が生成されたメソッド実装で保持されるようになりました。同時に、params、scoped、およびref struct パラメータについてコンパイル時エラー(SYSLIB1028、SYSLIB1029)を発行し、署名の不一致を防止します。
// ref readonly が保持される
[LoggerMessage(Message = "{p}", Level = LogLevel.Info)]
static partial void Log(ILogger l, ref readonly int p);
// ✓ 生成コード: ref readonly global::System.Int32 p
// params と scoped はコンパイルエラー(SYSLIB1028)
[LoggerMessage(Message = "{args}", Level = LogLevel.Info)]
static partial void Log(ILogger l, params object?[] args); // ✗ SYSLIB1028
Mono ランタイムの s390x および ppc64le アーキテクチャにおいて、デフォルトスタックサイズを 8MB に増加させました。また、DOTNET_Thread_DefaultStackSize 環境変数を新たにサポートし、ユーザーがスタックサイズを動的に制御できるようにしました。これにより、テールコール最適化の未実装による fsharp リポジトリのビルド失敗を解決します。
Composite ReadyToRun (R2R) コンパイルで box_this パターンの最適化を有効にする変更です。値型のメソッドが ref パラメータで渡される場合、制約付き呼び出しが行われます。従来のR2Rではこのパターンはスキップされていましたが、値型とメソッドが同じバージョンバブル内にある場合、安全に最適化できるようになりました。
struct MyStruct { public int Value; }
static string CallToString<T>(ref T val) where T : struct
{
return val.ToString(); // constrained. T callvirt ToString()
}
var s = new MyStruct { Value = 42 };
Console.WriteLine(CallToString(ref s));
System.Reflection.DispatchProxyのXML ドキュメントコメントをdotnet-api-docsから逆移植し、ドキュメント精度を向上。例外条件の検証ロジックを正確に反映し、パラメータなしコンストラクタに関する文法誤りも修正。コンパイラ生成のXMLドキュメントファイル出力を有効化。
DirectoryInfo.CreateSubdirectory(path) がルートディレクトリ(例:C:\)に対して呼び出された際に ArgumentException をスローする問題を修正しました。Path.TrimEndingDirectorySeparator がルートパスの末尾セパレーターを保持することが原因で、バウンダリ検証ロジックが誤ったインデックスを参照していました。修正後は、トリム後のパスが依然としてセパレーターで終わる場合(ルートディレクトリケース)に、検証前に明示的にセパレーターを除去するようになります。
このPRは、cDAC(Common Data Architecture)の診断機能を拡張し、GetCodeHeaderData APIを追加する変更です。GCInfo(ガベージコレクション情報)デコーダーを実装し、x64、ARM64、ARMプラットフォーム上でコードヘッダーデータを取得できるようになります。ランタイム診断とプロファイリングの機能向上が主な目的です。
JSON逆シリアル化の堅牢性を検証するための新しいファザー Utf8JsonReaderFuzzer を追加しました。このファザーはSpanベースとSequenceベースの Utf8JsonReader インスタンスの動作を比較することで、様々なデータ型とシナリオにおけるJSON読み込み機能を包括的にテストします。OneFuzzインフラストラクチャへのデプロイ設定も含まれています。
API レビュー会議の開催スケジュールに関するドキュメント更新です。2025年5月以降、木曜日のレビュー会議が実施されていないため、ドキュメントを修正し、会議は週1回(火曜日のみ)に変更されました。
OpenBSDターゲットのサポートを.NETランタイムに追加するための初期変更です。現在のところビルドはまだ完全には成功していませんが、CoreCLRがOpenBSDで動作するようになることを目指しています。
OpenBSD プラットフォーム上で __NumProc 環境変数を設定するようにビルドスクリプトを修正しました。これにより、OpenBSD でのネイティブコンパイル時にプロセッサ数の検出が正しく機能するようになります。
OpenBSD プラットフォームで mscordac(Microsoft Common Language Runtime Debugging Access Component)のビルドを可能にする変更です。CMakeLists.txt の設定を調整して、OpenBSD での条件付きビルドに対応しました。
NativeAOT outerloop テストの回帰を修正します。#111514 での変更により System.Diagnostics.Process テストの LongPath ヘルパーアセンブリの処理が破損していました。LongPath プロジェクト参照を ReferenceOutputAssembly=false に設定し、参照ではなくコンテンツとして扱うことで、テスト出力ディレクトリへの適切なコピーを復旧しています。
このPRは、cDAC RuntimeTypeSystemコントラクトにおけるMethodDescのサイズ計算方式を変更しています。従来はランタイムのs_ClassificationSizeTableグローバルテーブルを参照していましたが、ヒープダンプには存在しないため、データディスクリプタから直接サイズを計算するように改修されました。これにより、ヒープダンプシナリオでのデバッグ分析が可能になります。
// 変更前:グローバルテーブル参照
// size = s_ClassificationSizeTable[methodDescType]
// 変更後:データディスクリプタから動的計算
// MethodDescの基本サイズ + AsyncMethodDataスロットサイズ = 合計サイズ
CoreCLR テスト実行時にテストがクラッシュしても MSBuild ビルドが成功してしまい、run.py が前回実行の古い testRun.xml ファイルを読み込んでしまう問題を修正しました。MSBuild の Exec タスクの属性を IgnoreExitCode="true" から ContinueOnError="ErrorAndContinue" に変更することで、すべてのテスト実行を継続させつつビルドは失敗するようにしました。
WebAssembly RyuJIT のクロスジェン処理における複数のバグ修正です。ローカル変数の格納時のレイアウト取得の改善、BBJ_COND フロー制御の処理、P/Invoke プロローグの最適化、値番号付けのアサーション修正など、System.Private.Corelib のクロスジェン時に発見された問題を解決しています。
Android の scudo ヒープアロケータが ARM64 Top-Byte Ignore (TBI) を使用してヒープポインタにタグを付与する際、/proc/<pid>/mem での pread 呼び出しが失敗する問題を修正します。TBI タグ付きアドレスは CPU では無視されますが、カーネルのファイルオフセット処理では適用されないため、pread 実行前にトップバイトをストリップします。
// 修正例:pread 実行前にアドレスの上位バイトをマスク
ulong addressWithoutTbi = address & 0x00FFFFFFFFFFFFFFUL; // ARM64 TBI対応
pread(fd, buffer, size, addressWithoutTbi);
cDAC (Common Data Access Contract) API に GetStackLimits メソッドを追加しました。このAPIは、スレッドのスタック上限と下限を取得するための新しいコントラクトです。診断ツールがスレッドのスタック情報にアクセスする際に使用されます。
Uri(Uri, Uri) コンストラクタで UNC ファイル URI ベースと "file:" 相対 URI を組み合わせるとデバッグアサーション失敗が発生していました。根本原因は CreateThisFromUri が Debug_LeftConstructor フラグを含むすべてのフラグをコピーしていたことです。修正として、フラグコピー時に Debug_LeftConstructor フラグを除外します。
// 修正前後の比較
var baseUri = new Uri(@"\\aa", UriKind.Absolute); // file://aa/
var relUri = new Uri("file:", UriKind.Relative);
_ = new Uri(baseUri, relUri); // 修正前: Debug.Assert failure → 修正後: 正常動作
Uri.TryUnescapeDataStringメソッドが、デスティネーションSpanが入力内の最初の%のインデックスより小さい場合に、ArgumentOutOfRangeExceptionをスロー していた問題を修正しました。修正により、小さいバッファに対して適切にfalseを返すようになります。
// 修正前:ArgumentOutOfRangeExceptionがスロー
Uri.TryUnescapeDataString("aa%", [], out _);
// 修正後:falseを返す
Uri.TryUnescapeDataString("aa%", [], out _); // false
R2R(Ready-to-Run)コンパイル時にクラス初期化チェックをスキップしていた問題を修正するもの。iOS環境では、チェックをスキップされたメソッド全体がインタプリタ実行され、パフォーマンスが大幅に低下していました。本修正により、R2Rヘルパーを通じてクラス初期化チェック(InitClass/InitInstantiatedClass)を呼び出すようになり、インタプリタ実行回避が可能になります。
public class G<T>
{
static Type theType;
static G()
{
theType = typeof(T);
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static Type Touch()
{
return theType; // この呼び出しがR2Rで最適化されるようになる
}
}
Zstandard圧縮API(ZstandardStream、ZstandardEncoder、ZstandardDecoderなど)を独立したアセンブリ System.IO.Compression.Zstandard から System.IO.Compression に統合する変更です。マネージコードサイズが小さく、System.IO.Compression.Native への P/Invoke依存が共通のため、分離メリットがなく、将来の循環依存問題を防ぐためです。
このPRは、const vector パターンチェック時の最適化ロジックを修正しています。TBase サイズの要素をチェック時に、最初のビット以外のビットが設定されていないことを確実にするための変更です。Issue #124511の修正に対応しています。
このPRはJITコンパイラの最適化で、複数のターゲットを持つswitch文を分岐のない比較チェックに変換します。C#のパターンマッチング(x is A or B or C)の意図に合わせた最適なコード生成を実現します。例えば、Unicode カテゴリの判定で、複数の条件判定をブランチレス命令(setbe)に変換することで、より効率的なアセンブリコードを生成します。
cDAC(契約ベースのデータアクセスコンポーネント)の統合テスト基盤を追加しました。DebugeeアプリがFailFastでクラッシュし、生成されたダンプをClrMDで読み込むことで、cDACが実際のランタイムデータ構造を正しく読み取れることを検証します。Thread、RuntimeInfo、GCHeap、StackWalk、RuntimeTypeSystem、Loader、EcmaMetadataなど複数のcDACコントラクトをテストします。
ImmutableList<T>.Node.LastIndexOfメソッドのパラメータ検証をRequires.ArgumentからRequires.Rangeに変更し、ImmutableArray<T>.LastIndexOfと同じ検証方式に統一するPRです。また、テストケースを追加してパラメータ名の検証を含めるようにしました。
PersistedAssemblyBuilderでカスタム修飾子(modopt/modreq)のエンコーディングに関するバグを修正しました。C#のreadonly refやinキーワードを含むメソッド/フィールドシグネチャの参照を出力する際に失敗していた問題を解決します。.NET 9で導入されたバグで、回避策がない採用ブロッカーです。
32ビットプラットフォームでのOutOfMemoryException対策として、Iri_UnicodePlane3_13テストをリファクタリング。Unicode平面3~13(0x30000-0xDFFFF、約720K文字)をメモリ効率的に処理するため、0x10000文字(65Kチャンク)ずつ11回に分割して実行。テストカバレッジは変わらず、メモリ使用量を大幅に削減。
デバッガがコールスタックのルートをウォークする際にクラッシュする回帰を修正するプルリクエストです。前回のchangeset(#1fa1745)で導入されたスタックウォーキング処理の問題を、コンテキストをローカルコピーに指すように修正することで解決します。複数のアーキテクチャ(AMD64、ARM、ARM64、i386、LoongArch64、RISC-V64)で統一的に対応しています。
空のアセンブリ(0バイト配列またはストリーム)の読み込み時の例外メッセージを改善しました。従来の汎用メッセージ「Bad IL format.」から、より診断的で実用的なメッセージに変更されます。
// 変更前
Assembly.Load(new byte[0]);
// BadImageFormatException: Bad IL format.
// 変更後
Assembly.Load(new byte[0]);
// BadImageFormatException: Assembly image is empty. The stream or byte array must contain a valid PE file.
NRange.GetOffsetAndLengthメソッドの範囲検証バグを修正しました。64ビットプラットフォームでnintパラメータをuintにキャストすると、uint.MaxValueを超える値が切り詰められ、無効な範囲が検証をすり抜けていました。nuintキャストに変更することで、すべてのnint値に対して正しく比較されるようになります。
// 修正前: 64ビットプラットフォームで上位32ビットが切り詰められる
if ((uint)end > (uint)length || (uint)start > (uint)end)
// 修正後: すべてのnint値に対して正しく比較
if ((nuint)end > (nuint)length || (nuint)start > (nuint)end)
dotnet/runtimeのSystem.UriとSystem.UriBuilderクラスに対する脅威モデル(Threat Model)とセキュリティ設計ドキュメントを新規追加するPull Requestです。セキュリティレビューと実装設計に関する包括的なドキュメント化で、開発者がURI処理時の潜在的なセキュリティリスクを理解できるようになります。
VMR(Vertical Monolithic Repository)での管理対象のilasm(IL Assembler)ビルドを一時的に無効化するための変更です。source-build対応の完了を待つため、および現在出荷されていないため、ビルドプロセスから除外しています。
JIT コンパイラの Redundant Branch Optimization (RBO) フェーズにおける軽微なコード品質改善が行われました。コメントの誤字修正、ドキュメント更新、ブール式の簡略化、重複するビジターコードの統合が含まれています。機能的な変更はありません。
ブラウザ/WASM環境でWebcil 1.0フォーマットのアセンブリをロードするためのJavaScript実装を追加します。.wasmラッパーモジュールをインスタンス化し、Webcilペイロードを抽出して16バイト境界にアラインされたメモリに登録します。これにより、CoreCLRはブラウザ上でWebcilフォーマットのアセンブリを直接読み込めるようになります。
// 使用側のイメージ(JavaScript/TypeScript)
const module = await instantiateWebcilModule(wasmPath);
// 内部で以下が実行される:
// 1. getWebcilSize/getWebcilPayload エクスポートで生のWebcilを抽出
// 2. 16バイト境界にアラインされたメモリにコピー
// 3. .dll仮想パスで登録
Android プラットフォーム上で localhost サブドメイン解決テスト 2 件が一貫して失敗するため、[ActiveIssue] 属性を使用して Android でのテスト実行を無効化します。RFC 6761 の localhost サブドメイン処理実装により、AddressFamily.InterNetwork や AddressFamily.InterNetworkV6 を指定して "test.localhost" を解決する際、Android の getaddrinfo() が特定のアドレスファミリーでは EAI_NONAME エラーを返すことが原因です。
QUIC/HTTP3相互運用性テストにおいて、外部サーバ quic.nginx.org が Helix CI 環境から到達不可能になったため、テスト対象から完全に削除する変更です。2月21日以降、このサーバへの接続がタイムアウト(10秒)し、当該テスト Public_Interop_ExactVersion_BufferContent_Success で100%の失敗率(26失敗、0成功)が継続していました。
System.Collections.FrozenのConstants.IsKnownComparable<T>()メソッド内で重複していたtypeof(T) == typeof(decimal)チェックを削除しました。メソッドの機能は変わらず、冗長なロジックを排除したコード品質向上のための変更です。
このPRはCopilot AIスキル「jit-regression-test」の説明文を改善するドキュメント更新です。構造化された記述、明示的なストップシグナル、および統合されたヒントを追加することで、スキルの適切な起動と誤用防止を実現します。評価結果では、Claude Haikuのストップシグナル準拠が2/5から5/5に向上しました。
このPRはJITコンパイラのAssertion Propagation(AP)最適化を強化し、より多くのアサーションを生成可能にします。共変配列ストア後の範囲チェック削除、ゼロ除算チェックの最適化、到達不可能なコード削除など、複数の最適化シナリオに対応し、生成コードサイズを大幅に削減しています。
BBJ_RETURN ブロック内の境界チェック(range check)をクローニング対象として許可し、連続した配列/スパンアクセスの冗長な境界チェックを削除する最適化を実装しました。戻り値の式内の複数アクセスで、最後のインデックスのチェックのみが必要になります。
static int ArrayAccess(int[] abcd)
{
// 最適化前:4つの冗長なチェック
// 最適化後:abcd[3]のチェックのみ必要
return abcd[0] + abcd[1] + abcd[2] + abcd[3];
}
Uri.GetHashCode()とEquals()のハッシュ/等価性契約違反を修正しました。UNC派生のファイルURI(IsUncOrDosPath=true)と明示的なfile:/// URI(IsUncOrDosPath=false)が等値として比較される場合でも、異なるハッシュコードが生成されていた問題に対応しています。
var uri1 = new Uri("\\\\\u202a"); // UNC path → file:/// に正規化
var uri2 = new Uri("file:///"); // 明示的なfile URI
Console.WriteLine(uri1 == uri2); // True(修正前)
Console.WriteLine(uri1.GetHashCode()); // 異なるハッシュ(修正前)
Console.WriteLine(uri2.GetHashCode()); // 異なるハッシュ(修正前)
ブラウザベースのテスト環境でV8およびFirefoxに対するスモークテストをサポートするために、JavaScriptランタイムローダーにシェルバージョンチェック機能を追加しました。主にTypeScriptコードでのポーランド修正とローダーロジックの強化が行われています。
HTTP/2接続のセットアップ中にサーバーが切断された際、ObjectDisposedExceptionではなく実際の原因例外(_abortException)を伝播させるように改善しました。これにより、ネットワーク障害やサーバー側の問題など、実際の失敗理由がより適切に報告されるようになります。
// 修正前: 非情報的なObjectDisposedExceptionが発生
// 修正後: catch block で _abortException ?? e を使用
throw new HttpRequestException("...", _abortException ?? e);
ManagedNtlmの複数のエンディアネスバグを修正し、ビッグエンディアンアーキテクチャ上での不正な動作を解決するプルリクエストです。既存のNtlmテストケースで検証済みです。
HTTP/2キャンセレーション処理の改善に伴い、PostAsync_Cancel_CancellationTokenPassedToContentテストの無効化属性を削除するPRです。本テストは2021年1月に60秒タイムアウトの間欠的な失敗のため無効化されていましたが、HTTP/2実装の大幅な改書とキャンセレーション処理の改善により、根本的な競合状態は解決されたと考えられます。ローカルで20回の反復実行で問題なく動作することを確認済みです。
.NET runtimeの HTTP クライアント テスト GetAsync_UnicodeHostName_SuccessStatusCodeInResponse が削除されました。このテストは2019年に外部の韓国語ウェブサイト(스타벅스코리아.com)の到達不可により無効化されていましたが、最終的にテスト対象が不安定であるため削除されることになりました。
HTTP/2コネクションプール完全書き直し以降に発生していたAuthProxy__ValidCreds_ProxySendsRequestToServerテストの無効化を解除しました。このテストは2018年10月からHttp2Connection.InvalidateHttp2Connectionのアサーション失敗とコネクションリセットエラーにより無効化されていましたが、HTTP/2実装の刷新により問題が解決されたため復活させます。ローカルで20回の反復テストを実施して安定性を確認済みです。
HTTP クライアントの応答本体受信中のキャンセルテストを再有効化します。このテストは以前、CI 環境での遅延によるタイミング断言の失敗で無効化されていましたが、ValidateClientCancellationAsync でタイムアウト閾値が 30 秒から 60 秒に引き上げられたため、再有効化が可能になりました。
Dependency Injection AbstractionsライブラリのAddSingleton/AddScoped/AddTransientおよびTryAdd*メソッドに対し、複数登録時のセマンティクスとAdd*とTryAdd*のオーバーロード間の関連性を説明するドキュメント(<remarks>と<seealso>タグ)を追加しました。各呼び出しで無条件に登録が追加され、GetServiceは最後に登録されたインスタンスを返し、GetServices<T>はすべての登録を取得することを明確に記載しています。
WebAssembly (Wasm) RyuJIT コンパイラに対して、ブロック単位のメモリ操作(メモリ初期化とコピー)を最適化するための機能を追加しました。構造体のゼロ初期化やコピー操作を、ネイティブな memory.fill および memory.copy Wasm命令に対応させることで、より効率的なコード生成を実現します。
// memory.fill を使用したゼロ初期化の例
unsafe void zeroStruct(S *result) {
*result = default; // memory.fill 命令に変換される
}
// memory.copy を使用した構造体のコピー
unsafe void copyStruct(S *a, S *b) {
*a = *b; // memory.copy 命令に変換される
}
このPRはruntime-asyncの非同期タスク追跡機能を強化し、Visual Studioなどのデバッガーによる検査を容易にします。主な追加機能は:1) Continuationのタイムスタンプ追跡(await チェーン内の論理的タスクの開始時刻と実行時間を可視化)、2) TPLイベントの発行(タスクステータス変更の通知と実行スレッド情報の提供)です。
WASM向けJITコンパイラでスタックポインタ(SP)の参照をPHYSREG参照に書き直すことで、レジスタアロケーション(RA)の処理を簡素化する改善です。SPローカル変数をニュートラル化し、すべての明示的参照をPHYSREGノードに変換することで、SPの管理をローカル変数からコードジェン時の既知の場所に移譲しています。
CORINFO_RUNTIME_LOOKUP構造体にhelperEntryPointフィールドを追加し、R2R(Ready2Run)とNAOT(NativeAOT)においてREADYTORUN_GENERIC_HANDLEヘルパーのエントリポイント取得時の往復通信を排除しました。これにより、ランタイムへのコールバックを削除し、エントリポイント情報を直接構造体で表現することで効率化しています。
WebAssembly RyuJIT コンパイラの関数呼び出し処理の2つの問題を修正します。マネージド呼び出し規約を持つ呼び出しに対して、期待されたシグネチャに一致させるため、最後の引数として偽のPEポインタを渡すようにしました。また、メインメソッドまたはfuncletの最後の命令がリターンしない呼び出しである場合、unreachableの後にend命令が確実に発行されるようにしました。
WASM/CoreCLR corerun ホストのメモリ上限を2GBから4GBに拡大し、大規模配列割り当てをテストするJITリグレッションテストを再度有効化します。これにより、WebAssembly環境でのメモリ制約によるテスト失敗を解決します。
PersistedAssemblyBuilder のテストカバレッジをレビューフィードバックに基づいて整理しました。アセンブリ識別情報の検証、Save/GenerateMetadata ライフサイクルの相互作用、クロスアセンブリのジェネリック参照、カスタム属性エッジケースに焦点を絞ったテストに統合。AssemblyNameInfo ベースの同一性検証で簡潔化し、重複するヘルパーロジックを既存の共有ヘルパーに統合しました。
CI ワークフロードキュメンテーション内で、CI 失敗モードの抑制に関する提案の表現を明確化しました。失敗分析ドキュメントの 4 行を更新し、より正確な表現に改善しています。
src/native/managed/cdacreader ディレクトリは未使用で空の成果物であったため削除されました。このディレクトリは親ディレクトリのビルドターゲットに転送するだけの Directory.Build.targets ファイルのみを含んでおり、実際のプロジェクト、ソースコード、ビルドスクリプトからの参照はありませんでした。
WebAssembly向けのRyuJit JITコンパイラにおいて、ローカルスタックストア操作の再書き込み処理でtype bashing前に元の型情報をキャプチャするように修正しました。これにより、型情報の損失によって引き起こされていた問題を解決します。
WebAssembly (Wasm) RyuJit のコードジェネレータに数学関連の組み込み関数(intrinsics)のサポートを追加しました。これらの intrinsics は WebAssembly ネイティブ操作に直接マップされます。
WebAssembly向けRyuJITコンパイラの複数のバグ修正を含むPRです。crossgen実行時に発見された問題に対応し、null checks、overflow checks、スタック順序、戻り値型の分類などを修正しています。主な変更はcodegenwasm.cpp、regallocwasm.cpp、lowerwasm.cppに集中しており、WebAssembly JIT生成コードの正確性を向上させています。
JIT コンパイラにデフォルト値解析機能を追加し、async ホイスティング時に初期化されていないローカル変数を continuation にコピーすることを回避します。これにより、async/await を含むメソッドで生成されるマシンコードサイズを削減し、パフォーマンスを向上させます。
cDAC フレームワークでのプラットフォーム互換性の問題を修正しました。UEWatsonBucketTrackerBuckets データディスクリプタは Windows プラットフォームのみで利用可能であるため、非 Windows プラットフォームでスレッドデータを読み込む際のクラッシュを防止します。
このPRは、後続のAPI変更(#124603)に向けた準備作業として、内部およびテスト関連のプロパティ/メソッドの大規模な名前変更を実施しています。「Threading」を「Multithreading」に、「SingleThreaded」を「MultithreadingSupported」に変更し、論理を反転させています。
// 変更例
// Before
if (Thread.IsSingleThreaded) { ... }
Thread.ThrowIfSingleThreaded();
// After
if (!Thread.IsMultithreadingSupported) { ... }
Thread.ThrowIfMultithreadingIsNotSupported();
NativeAOT ランタイムのバインダーヘッダ (rhbinder.h) から未使用のマクロを削除するクリーンアップです。PInvokeTransitionFrame_MAX_SIZE マクロとそれに依存する PInvokeTransitionFrame_SaveRegs_count マクロ(AMD64/x86/ARM用の条件付き定義)がリポジトリ内で参照されていないため、12行のデッドコードを削除します。
ReadyToRun (R2R) コンパイルで --verbose オプション使用時の進捗ログ機能に存在した不具合を修正しました。ProgressReporter のインクリメント計算によって、処理対象が小さい場合にゼロ除算クラッシュが発生したり、100%を超える進捗率が出力される問題を解決しています。
Microsoft.OneCollect.RecordTrace パッケージを 0.1.33304 にアップデートし、perfmaps のない .NET プロセスを検出できるようになったため、NativeAOT での UserEvents トレーシングテストを再有効化します。これにより、#123697 のチェックリストが完了します。
ブラウザホスト用のローダー JavaScript/TypeScript コードを src/native/libs/Common/JavaScript 配下に統合し、複数のランタイムフレーバー(CoreCLR、Mono など)での再利用を可能にする準備を実施。MSBuild → CMake → Rollup パイプラインに RuntimeFlavor 情報を伝播させ、フレーバー別のバンドル処理に対応。
JIT回帰テストの登録モデルの変更に伴い、テストファイルをプロジェクトファイル(csproj)に明示的に登録する必要が生じました。グローブパターンでの自動包含ではなく、明示的な登録が必要な新しいモデルに対応しています。
AOT(Ahead-of-Time)コンパイルされたマネージド ilasm ツールの公開と Core_Root への統合を行う変更です。ilasm.csproj の設定を更新し、ビルド時に AOT 版の ilasm が生成・配置されるようにしました。ラウンドトリップテストでの使用は今後の予定とのことです。
GenerateMarkerFilesタスクがExpectedExitCode.txtマーカーを出力していなかった問題を修正します。マージされたテストまたはスタンドアロンテストペイロードで、期待される終了コードが確実に含まれるようになります。既存のマーカーパイプラインに3行のエントリを追加するシンプルな修正です。
P/Invoke IL スタブ生成時に複数スレッドが競合して重複した IL スタブを独立生成する問題を修正しました。ILStubCache の参照を再度有効化し、同一ターゲットメソッドに対して複数スレッドが異なる PCODE 値を生成する競合状態を防止します。
iOS環境でのパフォーマンス問題を修正するPRです。AggressiveOptimization属性を持つメソッドは、JIT(実行時コンパイル)が利用可能なプラットフォームではR2R(ReadyToRun)コンパイルをスキップして、実行時にJITでより最適化されたコードを生成させるべきです。しかしiOSではJITが無効化されているため、スキップすることで解釈実行となり、むしろパフォーマンスが悪化していました。本PRでは、JITが利用可能なプラットフォームでのみスキップするよう条件を修正します。
FromBase64Transform.TransformFinalBlockが空の入力(inputCount == 0)で呼ばれた場合、内部バッファ状態をリセットせず、_inputIndexに古いデータが残る問題を修正。部分ブロック処理時は正しくリセットされていたが、空入力時の早期リターンではリセット処理が欠けていたため、後続の変換操作が失敗する原因となっていました。
修正内容:
Reset()呼び出しを追加using FromBase64Transform transform = new();
byte[] partialBlock = [(byte)'A'];
transform.TransformBlock(partialBlock, 0, 1, destination, 0);
transform.TransformFinalBlock(Array.Empty<byte>(), 0, 0); // 修正前は状態がリセットされない
// 後続の操作が失敗していた
transform.TransformFinalBlock(completeBlock, 0, completeBlock.Length);
このPRは、CoreCLRランタイムのHashMapにEpoch-Based Reclamation (EBR)メカニズムを導入します。EBRにより、GC一時停止やCOOP遷移を不要とした低オーバーヘッドの安全な遅延削除が可能になり、非同期シナリオでのパフォーマンスと安全性が向上します。
// EBR有効化により、COOP遷移が不要に
// 従来: GC安全性のため COOP遷移が必要
// 新規: EBRがメモリ管理を保証
このPRは、.NETのLibraryImportGenerator(P/Invoke相互運用性用のソースジェネレータ)における診断生成の責務を分離しています。従来はLibraryImportGeneratorが診断を直接発行していましたが、新たにLibraryImportDiagnosticsAnalyzerを作成し、診断報告を専用アナライザーに移譲することで、Rosynチームの推奨に従った設計改善を実現しています。これにより診断のみをテストする場合の実行速度向上と、コード生成とは独立した診断検証が可能になります。
Apple モバイルプラットフォーム(iOS、iPadOS、macOS Catalyst)での .NET ランタイムおよびライブラリテストの完全実行を有効化します。193個のライブラリプロジェクトと74個のランタイムテストプロジェクトを対象に、テストスイートを拡充しました。互換性の問題がある34個の個別テストと22個のライブラリテストプロジェクトは一時的に無効化され、追跡用 Issue #124344 で管理されます。
.NET Runtimeのホストがサービス可能なアセット(serviceable assets)を正しく解決するかを検証するテストを追加しました。このテストは、.deps.jsonの相対ローカルパス機能の実装時に、サービス可能なアセットの動作を検証することで、将来の変更による回帰を防ぎます。
NativeAOT公開ビルドパイプラインの実行順序を修正し、ILC(IL Compiler)をComputeResolvedFilesToPublishListの後に実行するように変更しました。これにより、Issue #108909と#118298で報告されたビルド時のファイル処理に関する問題が解決されます。CopyNativeBinaryロジックも削除され、ビルドプロセスが簡素化されました。
ReadyToRun(R2R)コンパイル下でのテスト失敗を修正するPRです。R2Rプリコンパイル済みネイティブコードがメソッドテーブルやfixupを通じてcollectible AssemblyLoadContextから読み込まれた型への強い参照を作成し、テストの10回のGC反復内でALCがGC回収できず、型アンロード関連テストが失敗していました。2つのテストに[ActiveIssue]属性を追加/更新して、R2R実行時に一貫してスキップするようにします。
OpenSSLの仕様を正しく反映するように、X509CertificateLoaderのテストを修正しました。OpenSSLは証明書の後ろの有効なASN.1データを許可するため、プロセスIDをトレーリングデータとして使用したテストが非決定的に失敗していた問題を解決します。特定のPID値(例:32816 = 0x30 0x80 0x00 0x00)が有効なASN.1 BER SEQUENCEに見えるため、テストが例外を期待していても解析が成功してしまうケースが発生していました。
HTTP/3 nginx相互運用性テストを再有効化するPRです。quic.nginx.orgのテストURIは以前TLS alert 112エラーにより無効化されていましたが、外部サーバーの問題が解決されたため再度有効化します。InteropUrisWithContent()メソッド内のテストURIを復元します。
CoreCLR デバッガーの ICorDebugEnum::Clone 実装における CordbEnumerator のメモリリークを修正しました。クローンされた列挙子が内部の m_items 配列を解放せず、プロセスのクリーンアップ時に IsNeutered() アサーション失敗を引き起こしていた問題を解決します。クローンされた列挙子をプロセスの continue neuter リストに追加することで、適切なクリーンアップを保証します。
dotnet/runtimeのパフォーマンスベンチマーク用Copilot Skillの設定を改善したPRです。Copilotが生成するコマンドを簡潔化し、PR内での使用に最適化しました。主な変更は、不要なコードブロックラッピングの防止、-commitモードの削除、OSX ARM64ターゲットの推奨です。
RyuJIT コンパイラの呼び出し(call)ノードから gtCallCookie オペランドを削除するリファクタリングです。このオペランドはインポーター(IL解析)からモルフ(中間表現最適化)フェーズへの単純なデータ伝達にのみ使用されていたため、IR(中間表現)として保持する必要がなくなり、直接的なパラメータ渡しに変更することで、コンパイラのコード複雑性を低減しています。
インデックス-from-end パターン(arr[^4]、arr[^3]など)でJITが生成する冗長な境界チェックを排除するための最適化です。arr[^4]の境界チェックで配列長が4以上と判定された場合、後続のarr[^3]、arr[^2]、arr[^1]の境界チェックは数学的に冗長であり、これらを削除します。
public int DecodeRemaining(ReadOnlySpan<int> source)
=> source[^4] | source[^3] | source[^2] | source[^1];
build.sh -ninja false で ninja ビルドシステムの無効化がMSBuild経由では反映されない問題を修正しました。また、dotnet パスにスペースが含まれる場合の CMake パース問題も同時に修正されています。この変更により、ネイティブビルドシステムの生成時に -ninja false フラグが正しく保持されます。
EncApproxFieldDescIterator::FixUpEncFields メソッド呼び出しで、TRUE のハードコーディングを正しいイテレータオブジェクトに置き換える修正です。PR #85269 で見落とされていた問題を修正するもので、これまで偶然に動作していたコードを適切に修正しています。
Base64Url.DecodeFromChars において、非ASCII文字入力時にアウト・オブ・バウンド読み取りバグが発生していました。非ASCII文字(値 > 2048)がデコードマップ(256要素配列)へのインデックスとして直接使用されることで AccessViolationException が発生していた問題を修正します。
修正方法として、デコード前に System.Text.Ascii.IsValid チェックを追加し、非ASCII入力を早期に拒否するようにしました。Base64/Base64Urlは ASCII文字のみを使用するため、非ASCII入力は本質的に無効です。
GetTotalAllocatedBytesテストにActiveIssue属性を追加し、outerloopテストの実行から除外します。このテストは頻繁にOut-Of-Memory(OOM)エラーが発生するため、除外することでouterloopテストスイート全体の安定性を向上させます。
[ActiveIssue("issue-number", TestRuntimes.CoreCLR)]
public void GetTotalAllocatedBytes_Test()
{
// テスト実装
}
RangeOps::Multiplyがdependent bounds(依存バウンド)を持つ範囲でkeUnknownを返していた問題を修正しました。これにより、ループの帰納変数に対する範囲伝播が可能になり、ARM64のCSieveBenchmarkで約12%のパフォーマンス低下が改善されます。
修正により、以下のようなパターンで範囲最適化が有効になります:
for (int k = i + i; k <= Size; k += i)
{
array[k] = value; // 境界チェックが最適化可能に
}
WebAssemblyにおけるネイティブスタックトレースのシンボル解析機能を実装しました。EnableDiagnosticsとWasmEmitSymbolMapが有効な場合、wasm-function[1018]形式のWebAssemblyスタックトレースを実際のシンボル名(例:PROCAbort、TerminateProcess)に自動変換し、デバッグの可読性を大幅に向上させます。また、終了コード伝播、シャットダウン処理、例外ロギングの改善も含まれています。
HTTP/1 trailer headers はブラウザプラットフォームではサポートされていない永続的な制限であることを反映するため、テスト属性を ActiveIssue から SkipOnPlatform に変更しました。これにより、追跡対象のバグではなくプラットフォーム制限として正しく分類されます。
ARM64アーキテクチャにおける読み取り専用(RO)データセクションへの相対リロケーション処理を修正しました。ARM64では複数のROデータブロック(コード末尾のブロックと非同期関数用の別個ブロック)が存在するため、リロケーション処理を拡張して後者のブロックを正しく認識するようにしました。
iOS の HelloiOS サンプル において、RunAOTCompilation プロパティが Mono ランタイム専用の設定であることを明確にするため、条件付きで設定するように修正しました。従来は UseMonoRuntime=false(CoreCLR使用)時に RunAOTCompilation=true を指定すると、Mono の AOT 関連ターゲットを経由して ILStrip がエラーになる問題がありました。
<!-- 修正後: Mono ランタイムのみで AOT コンパイルを有効化 -->
<RunAOTCompilation Condition="'$(UseMonoRuntime)' == 'true'">true</RunAOTCompilation>
Xcode 26.2でのmacCatalyst ネイティブビルド失敗を修正するPRです。eng/native/build-commons.shからCMAKE_OSX_DEPLOYMENT_TARGETを削除し、clangの厳密なバージョン検証エラー(invalid version number in '-mmacosx-version-min=17.0')を解決します。macCatalystのバージョン番号(17.0)がmacOSのバージョン番号として誤釈釈されていた問題を修正し、実際のCatalystターゲット指定はconfigurecompiler.cmakeの-target arm64-apple-ios17.0-macabiトリプルで別途適用されます。
System.Formats.Tar APIのテストカバレッジを拡充するPRです。3つの主要なテストを追加しています:
Hot-Reloadを完全に無効化するための設定スイッチを追加しました。メタデータアップデーター機能を条件付きで無効にする新しい構成オプションを実装しています。これにより、アプリケーション側でホットリロード機能を完全に無効化することが可能になります。
WebAssembly(WASM)のJavaScript相互運用性を強化するため、float[]、Span<float>、ArraySegment<float>のマーシャリングサポートを追加しました。CoreCLRおよびMonoランタイムで機能し、インポート/エクスポートテストで動作を実証しています。
// 使用例
[JSImport("jsFunction", "module")]
public static partial float[] GetFloatArray();
[JSExport]
public static void ProcessFloatSpan(Span<float> data) { }
WebAssembly上のCoreClrランタイムテストをCI上で実行可能にするパッチです。Node.jsをテスト実行ホストとして使用し、デスクトップ環境に近いテスト実行フローを実現しています。CI パイプラインにbrowser_wasmビルド・テストジョブが追加され、WASM ランタイムの固有の問題に対応するためのテスト調整が含まれています。
RFC 6761に準拠した特殊用途ドメイン名のDNS解決処理を実装しました。invalidや*.invalidドメインは即座にHostNotFoundを返し、*.localhostサブドメインはOSリゾルバーを試行した後、失敗時はlocalhostへフォールバックしてループバックアドレスを返すようになります。
// 変更前:DNS照会を試行して失敗
await Dns.GetHostAddressesAsync("test.invalid"); // SocketException
// 変更後:即座にHostNotFoundを返す
await Dns.GetHostAddressesAsync("test.invalid"); // SocketError.HostNotFound
// *.localhostサブドメイン:OSリゾルバー→フォールバック
await Dns.GetHostAddressesAsync("foo.localhost"); // ループバックアドレス
ComWrappersに関連する3つの新しいcDAC(Common Data Access Component)APIを追加します:
GetComWrappersCCWData: CCW(COM Callable Wrapper)データの取得IsComWrappersCCW: オブジェクトがComWrappers CCWかどうかの判定IsComWrappersRCW: オブジェクトがComWrappers RCW(Runtime Callable Wrapper)かどうかの判定これらのAPIにより、デバッガやプロファイラなどの診断ツールがComWrappersの状態をより効率的に検査できるようになります。
Linux上でAES Key Wrap with Padding機能をOpenSSLネイティブ実装に移行するPRです。OpenSSL 1.0.1以降で利用可能なEVP_aes_###_wrap_padをRequired importとして扱い、プラットフォーム別の実装を分離しました。Androidは独立したコピーを保持しています。
Portable PDB メタデータ仕様にSHA-384およびSHA-512ハッシュアルゴリズムのサポートを追加しました。Portable PDBは.NETアプリケーションのデバッグ情報保存に使用され、Document テーブル内でハッシュアルゴリズムを用いてソースファイルの検証を行います。
eng/Versions.props内の古くなったコメントを更新するためのマイナー修正です。最近の.NET 11 SDKバージョンバンプ中に廃止されたコメントをバージョンに依存しない汎用的な説明に変更し、将来のメンテナンス負荷を軽減します。
TLS再開機能に関するテスト ClientDisableTlsResume_Succeeds を再度無効化するリバートです。Windows 2022 と Windows Nano プラットフォームでテスト失敗が発生しているため、[ActiveIssue] 属性を追加して Windows での実行をスキップします。
Mono インタプリタで System.Threading.Volatile.ReadBarrier() と System.Threading.Volatile.WriteBarrier() の intrinsic サポートを追加したバグ修正です。従来はこれらのメソッドが intrinsic スタブとしてインタプリタで実行されると、再帰的に自身を呼び出してスタックオーバーフローを引き起こしていました。本修正により、既存のメモリバリア opcode を emitすることで問題を解決します。
// 修正前: スタックオーバーフローが発生
Volatile.ReadBarrier(); // インタプリタ上で無限再帰
// 修正後: 適切にメモリバリアが実装される
Volatile.ReadBarrier(); // メモリバリア opcode として実行
NativeAOT環境でランタイム非同期処理を有効にした場合の不要な非同期サンク生成を回避する最適化です。IL scannerは直接呼び出しされるTask戻り値メソッドに対して非同期バリアント サンクの生成をスキップし、JIT オーバーヘッドを削減します。
// 直接呼び出しの検出により、不要なthunk生成を回避
if (IsCallEffectivelyDirect(method))
{
// async variant resolution をスキップ
}
JITコンパイラがAsyncSuspendイントリンシックを使用するメソッド(例:AsyncHelpers.Await)をインライン化しないようにする変更です。最近のインライン化改善により、これらのメソッドがインライン候補になってしまいましたが、インライン化するとAsyncメカニズムが破壊されるため、早期に除外する必要があります。
単一ファイル展開(Single File Deployment)時のProfile Optimization機能において、ファイルパスがnullになることですべてのモジュールがスキップされていた問題を修正しました。この修正により、単一ファイル形式で配布されたアプリケーションでもプロファイル最適化の恩恵を受けられるようになります。
Optimization Profileの読み込み処理でバグを修正しました。fread関数の戻り値を正しく処理していなかった問題を解決しています。freadは読み込んだバイト数ではなく要素数を返すため、その解釈を修正しています。
SafeEvpPKeyHandle.DuplicateHandle()のスレッド安全性問題を修正しました。複数スレッドが同時にDuplicateHandle()を呼び出している間に別スレッドがDispose()を実行すると、ハンドルフィールドがゼロにされ、結果として無効な値を持つ未解放のハンドルが返される競合状態が発生していました。
// 修正前: 競合状態が発生する可能性
IntPtr handle = this.handle; // Dispose()で0にされる可能性
// 修正後: DangerousAddRef/DangerousReleaseで保護
bool addedRef = false;
try
{
DangerousAddRef(ref addedRef);
IntPtr handle = this.handle; // 安全に読み取り
}
finally
{
if (addedRef)
{
DangerousRelease();
}
}
CMakeビルドスクリプトで複数のコマンドをquote処理することで、パスやプロパティに含まれるスペースを適切に処理できるようにしました。これにより、ファイルパスにスペースを含む環境でのビルド失敗を防止します。
JIT コンパイラの TreeLifeUpdater で LCL_ADDR(ローカル変数のアドレス)ノードの生存期間追跡を改善しました。これまで GTF_VAR_DEATH フラグが LCL_ADDR ノードで処理されていなかったため、非同期変換時にこれらの変数が不必要に生きているものと判定されていました。この修正により、より正確な変数生存期間分析が可能になります。
Linux上の診断ツール(clrmd、sos、dotnet-dump analyze)におけるクラッシュを修正するため、request.cppにnullチェック処理を追加しました。DAC(Data Access Component)への呼び出しでnull値が渡された場合、SIGSEGVで強制終了するのではなく適切に処理するようになります。
CoseMessage.DecodeSign1とCoseMessage.DecodeMultiSignメソッドで、内部検証時にArgumentExceptionが漏洩していた問題を修正。ドキュメントに定義された「デコード失敗時はCryptographicExceptionを投げる」という契約を守るようにしました。また、クリティカルヘッダ検証で不定長CBORアレイのサポートも追加されています。
ブラウザプラットフォーム向けにSystem.Net.Socketsの機能をサポート対象外化するPRです。ブラウザ環境ではソケット機能が利用できないため、すべてのメンバーでPlatformNotSupportedExceptionをスロー するよう実装しています。また、SocketAddressPal.Browser.csを新規追加し、Windows実装に類似した浅い実装を提供しています。
// ブラウザ環境での動作例
try
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
catch (PlatformNotSupportedException)
{
// ブラウザ環境では PNSE がスロー
}
ProcessStartOptions クラスを新たに追加し、プロセス起動時の実行ファイルパス解決をプラットフォーム対応で明示的に行えるようにしました。Windows では .exe 拡張子の自動追加、System32 ディレクトリの検索、PATH 環境変数の参照を実装し、Unix では PATH のみを検索します。遅延初期化されたコレクション(Arguments、Environment、InheritedHandles)を提供し、ProcessStartInfo より安全で制御性の高い代替手段となります。
このPRはNativeAOTの依存性分析フレームワークを簡素化するもので、INodeWithSizeインターフェース廃止し、IMAGE_REL_SYMBOL_SIZEリロケーションによるモジュールセクションサイズ報告に統一します。同時にModuleInfoRow ABI構造を{ SectionId, Length, Start }に再構成し、ランタイムがLengthフィールドを直接参照できるようにしました。
CRC-32とCRC-64の汎用パラメータ化実装が追加されました。既存の最適化済み実装(Crc32、Crc64)とCRC-32/C(x86/ARM intrinsics対応)はそのまま利用し、その他のパラメータセットはバイト単位のテーブルルックアップで実装されています。汎用ベクトル化は今後の改善予定とされています。
// パラメータセット指定によるCRC計算の使用例
var parameterSet = Crc32ParameterSet.Crc32; // 標準CRC-32
var crc = new Crc32(parameterSet);
crc.Append(data);
var hash = crc.GetCurrentHashAsUInt32();
Android CoreCLR でネイティブクラッシュ時にマネージドコールスタックをログに出力する機能を追加しました。Android では CreateDump が利用できないため、クラッシュレポートとしてマネージドフレームを含むスタックトレースを ADB ログに記録します。これにより、ダンプなしでもクラッシュの原因究明が容易になります。
// 例:マネージド例外時のログ出力
// "02-10 13:09:24.654 22261 22275 E DOTNET : Unhandled exception. System.InvalidOperationException..."
// "02-10 13:09:24.654 22261 22275 E DOTNET : at Program.Level3()"
// のようにスタックトレースが記録される
HTTP クライアントの MaxResponseHeadersLength テストにおける競合状態によるフレーキーな失敗を修正しました。クライアントが接続を強制切断した際に、サーバー側が複数の SocketError コード(Shutdown、ConnectionReset、ConnectionAborted)に対応することで、プラットフォーム間での非決定的な動作を安定化させています。
// 修正例
catch (IOException ex) when (ex.InnerException is SocketException se &&
(se.SocketErrorCode == SocketError.Shutdown ||
se.SocketErrorCode == SocketError.ConnectionReset ||
se.SocketErrorCode == SocketError.ConnectionAborted)) { }
JIT コンパイラの gtTreeContainsAsyncCall 関数を改善し、インライン候補内の非同期呼び出しを正しく検出するようにしました。インライン候補は後で元の呼び出しに置き換わる可能性があり、その呼び出しが非同期呼び出しを含む場合、適切なスピリング処理が必要です。Native AOT シナリオでのランタイム非同期有効時における null 参照クラッシュを修正します。
WebAssembly SDK ビルド時にシンボルファイル(PDB)を出力対象に含める機能を追加したPRです。ブラウザベースの .NET ワークロードをデバッグする際に必要なシンボル情報が正しくパッケージに含まれるようになります。
ValueTaskSourceの完了時に、継続状態(_continuationState)を保持し続けることで、オブジェクトのファイナライゼーションが遅延する問題を修正します。完了後は不要な状態をnullに設定することで、ガベージコレクションを促進し、特にHttp3ストリームのような短命なリソースの適切なクリーンアップを実現します。
ランタイムの非同期API(RuntimeAsync)から [RequiresPreviewFeatures] 属性を削除し、正式なAPI として確定させるPull Requestです。同時に不要になった SYSLIB5007 の抑制コメントも削除しました。このAPIはプレビュー段階を既に卒業していたため、属性の削除により開発者はこのAPIを警告なく使用できるようになります。
WASM向けのレジスタ割り当て機構を改善するPRです。複数回使用されるオペランド(multiply-used operands)に対して、新しいLIRフラグを導入し、レジスタアロケータが前方走査で効率的にライフタイムを追跡できるようにしました。また、SDSUノードが有効なレジスタを持つ場合、local.tee命令を通じてそれらを割り当てる契約を追加しています。これにより、任意のオペランドをマルチユース化できます。
// 新しいLIRフラグでマルチユースオペランドをマーク
node->SetFlag(LIR::Flags::MultiUseOperand);
// レジスタアロケータでlocal.teeを使用した割り当て処理
genProduceReg(node); // WASM固有のカスタマイズ
Visual Studio で CoreCLR を開く際の ./build.cmd -vs coreclr.slnx コマンド実行時に、FeatureDynamicCodeCompiled MSBuild プロパティが未定義のため CMake 構成に失敗する問題を修正しました。runtime.proj で条件チェックを修正し、プロパティが未定義の場合はデフォルト値として true を使用するようにしました。
zstd(Zstandard圧縮ライブラリ)のビルド時に /source-charset:utf-8 コンパイラオプションを追加し、ソースコードの文字エンコーディングを明示的にUTF-8として指定する変更です。これにより、異なるシステムロケール環境でのビルドの一貫性が向上します。
System.Net.HttpListenerのテストスイートをxUnit並列実行に対応させるため、ブロッキングパターンをasync/awaitに置き換えました。.ResultやTask.Run()でのデッドロックを排除し、テスト並列化制限を解除することで、テスト実行性能が向上します。
TLS セッション再開の無効化をテストする ClientDisableTlsResume_Succeeds テストを再有効化するPRです。このテストはWindows上でSChannel関連のバグによってフレーキーな動作を示していましたが、PR #113604で根本的なバグが修正されたため、[ActiveIssue] 属性を削除して再有効化します。
// テストの概要:AllowTlsResume = false が TLS セッション再開を正しく防止することを検証
[Theory]
[InlineData(true)]
[InlineData(false)]
public async Task ClientDisableTlsResume_Succeeds(bool testClient)
{
// TLS セッション再開が発生しないことをアサート
}
SOS診断ツールのdumplogコマンド実行時にGetManagedResolverでnullポインタ参照によるクラッシュが発生する問題を修正しました。診断コード内でnull状態のm_managedResolverハンドルが検出される場合の処理を追加し、ストレスログ出力時のクラッシュを回避します。
// 修正内容のイメージ
if (m_managedResolver == nullptr)
{
return nullptr; // null check追加
}
return ObjectFromHandle(m_managedResolver);
CustomMarshalerInfo::GetInstance の呼び出しを MethodDescCallSite/CallDescrWorker から UnmanagedCallersOnly (UCO) reverse P/Invoke に置き換えるリファクタリング。これにより、マネージ・アンマネージ間の相互運用コードの統一を進め、#123864 の Priority 1 項目を完了します。
Uri.cs内でIndexOfAnyとSearchValuesを活用し、ホスト名解析性能を最適化しました。特にLongHost(長いホスト名)のケースで約28%のパフォーマンス改善が実現されています(166.87ns → 120.22ns)。
CrossGen2を使用したライブラリテストにおいて、runtime-asyncを有効にした状態での実行レグを追加するPull Requestです。既存のクロスジェン アウターループパイプラインに新しいテスト実行構成を追加し、非同期ランタイム機能の互換性を検証します。
AspNet2のSuperPMI収集スクリプトの堅牢性を向上させる修正です。Helixマシンの制限に対応するため、NuGetキャッシュの設定を改善、ビルドタイムアウトを延長、.NET 11.0プレビューへの切り替え、接続数削減、TieredPGO設定の削除を実施しました。結果として、mchファイルサイズは892 MBとなっています。
System.Diagnostics.Tracing 名前空間の実装をリファクタリングし、EventSource.cs から ManifestBuilder と EventListener を専用ファイルに抽出しました。これにより EventSource.cs のサイズが 1,969行から 411行に削減され、コードの可読性と保守性が向上します。動作は変わらず、純粋なコード整理です。
ImmutableList<T> の LastIndexOf と FindLastIndex メソッドで上限値チェックが欠落していた問題を修正しました。従来は index == Count を指定しても例外をスローせず、不正な結果を返していました。この修正により ImmutableArray<T> の動作と一致するようになります。
// 修正前:index == Count で不正な結果を返していた
var list = ImmutableList.Create(1, 2, 3);
int result = list.LastIndexOf(2, 3); // 本来は ArgumentOutOfRangeException をスロー
// 修正後:ArgumentOutOfRangeException をスロー
// int result = list.LastIndexOf(2, 3); // throws ArgumentOutOfRangeException
coreclrのガベージコレクション関連コード内で検出された2つの潜在的な整数オーバーフロー脆弱性を修正しました。Svace静的解析ツールで発見された問題で、実際の発生例は未確認ですが、セキュリティ観点から対応が必要です。
ARM64向けにVector<T> API用のInstructionSet定義の基盤コードを追加しました。これにより、Vector<T>を対象アーキテクチャに応じてAdvSimd/SVEに適切にリダイレクトするための抽象化レイヤーが実装されます。
PersistedAssemblyBuilderにおけるカスタム修飾子(custom modifiers)のエンコーディングのバグを修正しました。SignatureHelperの実装を簡潔化し、Mono環境での修飾子エンコーディング処理を改善しています。Issue #123857に対応し、テストケースを追加してローカルで検証済みです。
レガシーランナーの廃止に伴い、issues.targetsファイルと関連する除外リスト管理インフラストラクチャを削除するPRです。空になったissues.targetsとそれをサポートするテスト除外機能(TestExclusion.cs、APKパッチング機能など)が完全に削除されました。これにより、テスト実行パイプラインの複雑さが低減され、メンテナンス負荷が軽減されます。
ARM64プロセッサのSVE2(Scalable Vector Extension 2)命令セットに非時間的スキャッタストア(non-temporal scatter stores)機能を実装しました。これにより、メモリへのベクトルデータ書き込み時にキャッシュを迂回する最適化が可能になります。
Android上のNativeAOT環境でRandomNumberGenerator.GetBytes()を呼び出すとSIGSEGVクラッシュが発生する問題を修正しました。原因はJNI環境(gJvm)が初期化されていなかったこと。JNI_OnLoadを弱シンボルで実装することで、静的リンク時も自動初期化が可能になります。
// 修正前:SIGSEGVで必ずクラッシュ
RandomNumberGenerator.GetBytes(1);
// 修正後:正常に動作
RandomNumberGenerator.GetBytes(1);
ARM64 SVE2のADD SATURATE命令のパブリックAPI設計を改善するPRです。従来のAddSaturateWithSignedAddend/AddSaturateWithUnsignedAddendの2つの分割されたメソッドを、単一のSve2.AddSaturateメソッドに統合しました。JIT側でオペランドの符号付き/符号なし型に基づいて、実際の命令(SQADD/UQADD vs USQADD/SUQADD)を自動選択するSpecialImportフラグを使用しています。
// 変更前
public static Vector<long> AddSaturateWithSignedAddend(...);
public static Vector<long> AddSaturateWithUnsignedAddend(...);
// 変更後
public static Vector<long> AddSaturate(...); // 複数のオーバーロード
ArrayBufferWriter<T>で現在の容量がint.MaxValue / 2の時に予期しなく再割り当てに失敗するバグを修正しました。バッファが満杯の状態で追加メモリをリクエストすると、オーバーフロー判定が誤った結果になり例外が発生していました。
// 修正前:int.MaxValue / 2 の容量で失敗
var abw = new ArrayBufferWriter<byte>(int.MaxValue / 2);
abw.Advance(abw.Capacity);
abw.GetMemory(1); // throws ArgumentException
Objective-C相互運用性の実装において、MethodDescCallSite/CallDescrWorkerを使用した呼び出し機構を、より現代的なUnmanagedCallersOnlyリバースP/Invokeパターンに置き換えました。具体的には、AvailableUnhandledExceptionPropagationとInvokeUnhandledExceptionPropagationの2つの関数がこの変更の対象です。
Azure Pipeline の report-green.yml を、エージェントベースのジョブからエージェントレスサーバージョブに移行しました。ドキュメントのみのPRで成功を報告し、Build Analysis へのハング防止が目的です。従来の PowerShell スクリプトを Delay@1 タスク(遅延0分)に置き換え、CI マシン割り当てを回避して no-op 動作を実現します。
// 変更前: エージェントベースのジョブ
jobs:
- job: ReportGreen
pool:
vmImage: 'windows-latest'
steps:
- powershell: # スクリプト処理
// 変更後: エージェントレスサーバージョブ
jobs:
- job: ReportGreen
pool: server
steps:
- task: Delay@1
inputs:
delayForMinutes: '0'
ISO 8601の24:00:00(endOfDayFrag)表記をXSD DateTime検証で正式にサポートしました。W3C XML Schema 1.1で定義されている24:00:00をXmlConvertとXML Schema検証層で受け入れるようになり、2007-04-05T24:00:00は2007-04-06T00:00:00と解析されます。以前はFormatExceptionが発生していた入力が正常に処理されるようになります。
// 以前: FormatException発生
// 現在: 正常にパース
var dt = XmlConvert.ToDateTime("2007-04-05T24:00:00", XmlDateTimeSerializationMode.RoundtripKind);
// dt == 2007-04-06T00:00:00
issue-labeler の予測閾値を環境変数で設定可能にし、デフォルト値を 0.40 から 0.05 に変更するPR。複数の訓練実行結果から、0.05 の閾値が最も高い正確性(91.91% の一致率)を示し、needs-area-label ラベルが必要なケースを最小化できることが確認されました。ISSUE_LABELER_PREDICTION_THRESHOLD 環境変数で閾値を動的に調整できます。
JITコンパイラのimpStoreNullableFieldsとimpLoadNullableFields関数において、SIMD型が誤ってTYP_STRUCTとして型付けされていた問題を修正しました。TypeHandleToVarTypeを使用することで、CORINFO_CLASS_HANDLEを適切にTYP_SIMD*型にマッピングするようになります。
動的コード実行機能が無効な場合、インタープリタライブラリをランタイムに静的リンクする変更です。これにより、FEATURE_DYNAMIC_CODE_COMPILED が false の場合、プラットフォームマニフェストエントリを作成する代わりに、インタープリタライブラリが直接ランタイムに組み込まれます。
// FEATURE_STATICALLY_LINKED の条件を拡張
// Before: モバイルプラットフォーム(WASM, iOS, tvOS, macCatalyst)のみ
// After: FEATURE_DYNAMIC_CODE_COMPILED が false の場合も静的リンク対象に
ReadyToRun コンパイラの async メソッド処理において、AsyncHelpers への参照が存在しないケースでアサーション失敗が発生していた問題を修正しました。不正確なアサーションを削除し、async メソッドが存在する場合は必ず System.Runtime.CompilerServices.AsyncHelpers を必須メタデータ参照として明示的に追加するように改善しました。
// 修正前:AsyncHelpersが既に参照されていることを前提としていた
Debug.Assert(asyncHelpers != null);
// 修正後:AsyncHelpersが参照されていなくても必須型リストに追加
requiredTypes.Add(asyncHelpers);
HTTPクライアントテストのSend_TimeoutRequestContent_Throwsテストにおけるレース条件を修正しました。サーバー接続がクライアントのタイムアウト前にクローズされることで、テストが不安定になっていた問題を、セマフォベースの同期メカニズムで解決します。
このPRは、JIT コンパイラの範囲チェック最適化における不正な仮定を修正します。IsVnCheckedBound の不正な使用(すべての値番号が非負と仮定)を削除し、代わりに span.Length の非負性をアサーション経由で追跡するようにしています。これにより、範囲チェックの削除における誤った最適化を防ぎます。
HTTP/2接続の適切なシャットダウン(GOAWAY フレーム伝播)を確保するために、リソース破棄の順序を修正したテスト。HttpClientとハンドラーをGenericLoopbackConnectionより先に破棄することで、Windows環境でのタイミング依存バグを解決します。
Issue #72586(2022年10月に解決)に関連する古いActiveIssue属性をテストメソッドから削除しました。これにより、HTTP/1レスポンスストリームの応答キャンセル適合性テストが再度実行されるようになります。以前はTask.CompletedTaskを返していた3つのテストメソッドオーバーライドが不要になったため、ベースクラスのCancelPendingテストが実行可能になります。
JIT コンパイラの dataSection フレキシブル配列を削除し、より安全で保守性の高い実装に置き換えました。フレキシブル配列内にポインタと emitLocation インスタンスを格納する際のアラインメント問題を解決しています。
async signal handlerからThread Local Storage (TLS)にアクセスする際のクラッシュを修正するバックポート。最新のglibc版でのメモリ割り当て中の割り込み時にクラッシュする問題を解決するため、lock-freeでasync-safeなスレッドマップを実装し、signal handlerからの安全なスレッド検索を可能にしました。
// 従来: TLSアクセスでクラッシュの可能性
Thread* pThread = GetThread(); // signal handlerから呼び出すと危険
// 修正後: async-safe検索
Thread* pThread = GetThreadAsyncSafe(); // signal handlerでも安全
WebAssembly(WASM)バックエンド向けRyuJitに内部レジスタ機構を実装しました。これにより、DIV/MOD命令のゼロ除算チェックなど、一時的な値の保持が必要な操作をより効率的に処理できるようになります。内部レジスタは呼び出し元に見えないレジスタとして機能し、コード生成時に中間値を保存するために使用されます。
macOS上のFileSystemWatcher起動時のパフォーマンス問題(Issue #77793)を修正しました。不要なInterop.Sys.Sync()呼び出しを削除することで、ウォッチャーインスタンスあたり約45msの遅延を解消しています。FSEventStream APIは既にkFSEventStreamEventIdSinceNowで設定されており、新規イベントのみを受信するため、バッファフラッシュは不要でした。
System.DirectoryServices ライブラリにおいて、SafeLsaPolicyHandle オブジェクトの適切なリソース解放を実装しました。SafeLsaPolicyHandle は LSA ポリシーハンドルをラップする SafeHandle 型であり、ネイティブリソースを確実に解放するために明示的な破棄が必要です。静的分析ツール SVACE により検出されました。
ValueListBuilder<T>.Growメソッドの過度なキャパシティ割り当てバグを修正しました。Growメソッドに渡す引数が誤っていたため、必要以上のメモリが確保されていました。この修正により、ValueStringBuilderと同じ割り当てロジックに統一されます。
// 修正前: AppendSpan(100)時にキャパシティが256になる
var vlb = new ValueListBuilder<char>();
vlb.AppendSpan(17); // キャパシティ: 32
vlb.AppendSpan(100); // キャパシティ: 256(過度な割り当て)
// 修正後: 正しく128になる
vlb.AppendSpan(17); // キャパシティ: 32
vlb.AppendSpan(100); // キャパシティ: 128(期待値)
ImmutableArrayExtensions.SequenceEqualメソッドのパフォーマンスを大幅に改善するPRです。ICollection<T>を実装するコレクション向けに高速パスを追加し、Enumerable.SequenceEqualに委譲することで、配列・リストで約90%の高速化を実現しています。純粋なIEnumerable<T>型に対しては既存実装を保持し、互換性を維持しています。
レガシーで未ドキュメント化された UNSUPPORTED_ForceEnc 環境変数をCoreClrから削除し、サポート対象の DOTNET_MODIFIABLE_ASSEMBLIES 設定に統一します。Edit and Continue (EnC) 機能の有効化判定とApply Update機能の確認ロジックから ForceEnc の参照を削除しており、設定オプションの簡素化と一貫性向上が目的です。
System.Private.Uri の空のホスト解析に関する回帰バグを修正しました。#121671 で導入された条件チェック end < length が、実際の範囲チェックではなく単に end が更新されたかどうかの確認になっていた問題を修正しています。
このPull Requestは、.NET runtimeの複数の重要な相互運用呼び出しサイトを、従来のMethodDescCallSite/CallDescrWorkerからUnmanagedCallersOnly属性を使用した新しいマネージドラッパーに置き換えています。EventSource初期化、スタートアップフック、ローダー割り当て、カルチャ情報管理、JITメタデータ取得など、優先度の高い7つの重要な相互運用地点を対象としています。
ISO 8601の24:00:00(日の終わり)をサポートするため、DateTime、DateTimeOffset、TimeOnly、Utf8Parser、System.Text.Jsonのパース機能を拡張しました。24:00:00は翌日の00:00:00と同じ時点として正規化されます。この機能は分秒がいずれも0の場合のみ有効です。
// 2007-04-05T24:00 は 2007-04-06T00:00:00 と解析される
var dt = DateTimeOffset.Parse("2007-04-05T24:00");
// dt == new DateTimeOffset(2007, 4, 6, 0, 0, 0, TimeSpan.Zero)
ThreadPool のセマフォ実装に関する複数の修正と改善が行われました。主な変更は以下の通りです:
// Backoff.Exponential(0) の修正例
// 修正前:attempt==0 時にシフト量が 0 になり、大きなランダム値が使用される
// 修正後:正しく 1 ビット右シフトされる
RequiresUnsafe属性に対応したトリミング解析機能を追加するデバッグ専用の実装です。フレームワークに注釈を付けるための補助機能であり、本番環境での提供を想定していません。Roslyn解析器とコードフィックスプロバイダーを通じて、unsafeコンテキスト外での安全でないコード使用を検出し、自動修正を提供します。
// 新規追加: RequiresUnsafeAttribute
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class RequiresUnsafeAttribute : Attribute
{
}
MemoryCacheの統計情報の不整合を修正するPull Requestです。キャッシュの統計カウンターが不正確な状態になる問題に対応しており、メモリキャッシュの正確なメトリクス追跡を改善します。
ci-analysis skillの評価で、tool-agnostic refactor(#124398)により build progression タスクで68%のツール呼び出し回数増加(25→42)が発生。3つのドメイン固有の例を復元することで、ツール呼び出しを25呼び出しに削減し、実行時間も11m04sから8m46sに短縮。復元された例には、refs/pull/{PR}/merge ブランチパターン、マージコミット親抽出のGH API例、チェックアウトログID 5/line 500+のヒント、および停止シグナルが含まれます。
cDAC(Compact DAC)ローダーの GetModuleData メソッドから不要なトランジェント フラグを削除するリファクタリングです。DAC(Debug Access Component)のモジュールデータ取得処理を簡潔にし、フラグの管理を明確にしています。
WebAssembly RyuJIT コンパイラのコード生成機能を拡張するPRです。GT_INDEX_ADDR、GT_LEA、GT_MEMORYBARRIER、GT_RETFILT などの命令ノードのコード生成実装を追加し、crossgen replay 機能を改善しています。また、WASM の非連続な例外領域レイアウトに対応するため、例外処理の検証チェックを緩和しています。
LoggerMessage ソースジェネレータが生成するメソッドに XML ドキュメンテーションを追加し、IDE の IntelliSense でログメッセージテンプレートとログレベルを表示できるようにします。開発者がホバーするだけで生成されたログメソッドの詳細を確認できるようになります。
// 生成されるメソッドに XML ドキュメンテーションが追加
/// <summary>
/// Hello {Name} (LogLevel: Information)
/// </summary>
public partial void LogHello(string name)
{
if (logger.IsEnabled(LogLevel.Information))
{
__LogHelloCallback(logger, name, null);
}
}
ILC(Intermediate Language Compiler)のType Map assembly target traversalロジックを修正するPRです。Type Mapメタデータ生成時に、特定のType Groupに対してAssemblyTargetで明示的に参照されていないアセンブリ内のType Mapは保持しないようにしました。これにより、不要な型情報がAOTコンパイル出力に含まれるのを防ぎます。
WebAssembly(Wasm)向けRyuJIT JITコンパイラーに対し、Wasm Basic C ABI仕様に従った構造体分類機能を実装しました。ホスト(VM、CrossGen)ロジックとJITロジックを追加し、Wasmプラットフォーム向けコンパイル時に構造体の引数受け渡し方式を適切に分類します。また、SPMI(SuperPMI)ツール内でも同機能を実装し、cross-jittingによるWasm関連テストを継続できるようにしました。
ci-analysis skillをリファクタリングし、AIエージェントのプロンプトから明示的なMCPツール名参照を削除しました。エージェントは既に実行時にツールの説明とパラメータを保有しているため、skillはドメイン知識(落とし穴、優先順位、データ位置、アンチパターン)に集中すべきという設計思想の実装です。ツール呼び出しの連鎖をアクション説明に置き換え、パラメータレベルの詳細をワークフローガイダンスに変更しました。
Socket.ConnectAsync(EndPoint) が再利用するキャッシュされた _singleBufferReceiveEventArgs に、prior の ReceiveAsync 呼び出しから残された buffer/count が残っていたため、ConnectEx にそのバッファが send-on-connect データとして誤って渡されていました。特に DisconnectAsync(reuseSocket: true) 後の再接続時に、前の接続で受信したデータが新しい接続で送信されてしまう重大なバグです。修正では接続前に SetBuffer(default) を呼び出してバッファ状態をクリアします。
// 修正内容:ConnectAsync前にバッファをクリア
_singleBufferReceiveEventArgs.SetBuffer(default);
await ConnectAsync(endPoint);
TestStackOverflowLargeFrameMainThreadテストをx64アーキテクチャ上のUnix/MacOSXプラットフォームで無効化するパッチです。スタックプローブが十分にスタックポインタから離れた位置でプローブを行う際に、ランタイムが基盤となるsigsegvをスタックオーバーフローとして認識できない問題(Issue #13519)に対応しています。テストはWindowsおよび他のアーキテクチャ(x86、ARM)では引き続き有効です。
glibc 2.43のC23関連の変更により、strrchrがconst char*の引数に対してconst char*を返すようになったため、vendored libunwindのelfxx.cでのビルド失敗を修正しました。ローカル変数の型をchar*からconst char*に変更することで対応しています。
// 修正前
char *p = strrchr(file, '/');
// 修正後
const char *p = strrchr(file, '/');
StackOverflow例外の特殊フォーマット処理をスキップする条件を追加しました。出力がより冗長になる(行数が増える)場合は、特殊フォーマットを適用しないようにしています。これにより、例外メッセージの出力をより簡潔に保つことができます。
JIT のライブネス分析で、到達不可能なスロー ヘルパー ブロックに対するレガシーコードを削除しています。スロー ヘルパー ブロックが lower/liveness フェーズの後に作成されるようになったため、ライブネス分析時には到達不可能なスロー ヘルパー ブロックは存在しないという新しい不変式を強制します。
dotnet/runtimeのCI分析スキルの改善PR。MSBuildのクロスプラットフォーム警告、マージコミットからのターゲットブランチHEAD抽出ショートカット、およびMCP(Model Context Protocol)ツール代替案の追加により、CI障害調査ワークフローのドキュメントを強化します。構造的な変更はなく、インラインでの最小限の追加です。
CoreCLRパイプライン設定の最適化を実施。NativeAOT Release ビルドを osx_x64 から osx_arm64 に移行し、ARM64 macOS インフラとの整合性を確保。また、CoreCLR テスト実行の重複したプラットフォームマトリックス定義を統合し、設定の冗長性を削減しました。
SuperPMI収集パイプラインにおいて、linux-arm/linux-arm64ビルド時にx64コンテナ内でSPMIコンポーネントを構築する際、NuGet認証がコンテナ内で正しく実行されるよう修正されました。これにより、x64ホストマシン上でのビルド失敗が解決されます。
SPMI(SuperPMI)の差分ビルド実行環境をosx-arm64からwindows-x64に変更するパイプライン修正です。osx-arm64のAzDOプール過負荷によるビルド開始遅延(数時間待機)を回避し、ビルドおよびHelixジョブ投入の効率化を実現します。
.NET 11 Preview 1において、モジュール名の長さがDWORD境界に整列している場合、Optimization Profileの保存に失敗するバグを修正しました。このバグはPR #116203で導入された回帰です。
このPRはcDAC(Common Data Access Contract)関連の列挙型(enum)に対してバージョン管理を強化するものです。ネイティブコード内で定義されているマジックナンバーに対して、変更時にcDACをバージョニングする必要があることを示すコメントを追加します。また、cDACから未使用または最適でない列挙型を削除し、メンテナンス性を向上させます。
直接的なawaitをthunk(仲介関数)に解決することを回避する最適化です。不要なJIT compilation と thunk経由の呼び出しによるオーバーヘッドを削減し、JITがコードをより効率的に最適化できるようにします。
System.Diagnostics.Process に新しい ProcessExitStatus クラスを追加します。このクラスは、プロセスの終了状態(終了コード、オプションの POSIX シグナル、キャンセル/タイムアウト情報)を表現します。sealed クラスとして実装され、XML ドキュメントと包括的なユニットテストが含まれています。
// 使用例
var exitStatus = new ProcessExitStatus(exitCode: 0, signal: null, canceled: false);
int code = exitStatus.ExitCode;
bool wasCanceled = exitStatus.Canceled;
このPRは、依存性注入(DI)コンテナのスコープ破棄時の動作に関するAPI ドキュメントを更新するものです。従来のドキュメントでは「スコープ化されたサービス」のみが破棄されると記載されていましたが、実際の動作では一時的なサービス(transient services)もスコープによって追跡・破棄されます。このドキュメント更新により、実装の動作とドキュメントの整合性が取れます。
WebAssemblyの間接呼び出し(call_indirect)に対するリロケーション生成サポートを追加するPull Requestです。Wasm RyuJIT コンパイラが、リンク仕様に基づいたリロケーション型を使用して、呼び出し対象アドレスを動的に解決できるようになります。これにより、Wasmバイナリのリンク時最適化とランタイム動的リンクが改善されます。
Azure Pipelines のライブラリ Fuzzing "deploy to OneFuzz" パイプラインのジョブタイムアウト値を増加させました。夜間デプロイメント実行が現在のタイムアウト値 (240分) に頻繁に近づいており、または超過している問題を解決するため、windows ジョブのタイムアウトを 240 分から 600 分に延長します。これにより、CI における信頼性の低いタイムアウトエラーを削減します。
WebAssembly (WASM) ブラウザ環境での.NET ランタイム実行を実現するため、プロセス、シグナル、スレッド、ブロッキング操作に対応しないネイティブレイヤーの実装を追加しています。PAL(Platform Abstraction Layer)層でWASM固有のスタブ実装を提供し、ブラウザ環境の制約に適応させる変更です。
UriコンストラクタとTryCreateファクトリメソッド間の解析矛盾を修正します。相対URIへのフォールバック時にIRI正規化がスキップされるなど、2つのコードパス間で動作が異なっていました。修正により両者の動作が統一されます。
// 修正前: 異なる動作
var uri1 = new Uri("p%41th", UriKind.Relative);
Uri.TryCreate("p%41th", UriKind.Relative, out Uri uri2);
Console.WriteLine(uri1); // pAth (IRI正規化適用)
Console.WriteLine(uri2); // p%41th (IRI正規化なし)
// 修正後: 同じ動作
Console.WriteLine(uri1); // pAth
Console.WriteLine(uri2); // pAth
CoreCLR のシグナルハンドラ処理の順序を変更し、以前登録されたシグナルハンドラを呼び出す前に PROCNotifyProcessShutdown と PROCCreateCrashDumpIfEnabled を実行するようにしました。これにより、Android などのプラットフォームで同期フォルト(SIGSEGV など)発生時に、以前のハンドラが戻らない場合でも、マネージドコンテキストのダンプ生成とシャットダウン通知が確実に実行されます。
// シグナル処理の実行順序が変わります
// 変更前: invoke_previous_action() → PROCNotifyProcessShutdown() → PROCCreateCrashDumpIfEnabled()
// 変更後: PROCNotifyProcessShutdown() → PROCCreateCrashDumpIfEnabled() → invoke_previous_action()
System.IO.Hashing ライブラリに Adler32 ハッシュアルゴリズムの実装を追加しました。Adler32 は RFC 1950 で定義された軽量なチェックサムアルゴリズムで、ZIP ファイル形式など複数の標準で使用されています。
Windows環境でのインクリメンタルビルドの安定性を向上させるPull Requestです。copy_version_files.ps1スクリプトで_version.cファイルの比較ロジックを改善し、空白文字の取り扱いに対するセンシティビティを低減しています。これにより、不要なファイル再生成によるビルド破損を防止します。
Azure Pipelines の "runtime extra platforms" パイプラインの実行スケジュールを変更しました。従来の1日2回実行(09:00 UTC と 21:00 UTC)から1日1回実行(03:00 UTC)に変更することで、実行頻度を削減しつつ、PR実行時にはカバーされないプラットフォームの定期的なテスト覆率を維持します。
ARM64 JIT コンパイラにおいて、リロケーション記録時の即値エンコードアサート問題を修正。リロケーション対象のアドレス計算では、最終的なコード配置前の即値は無意味であり、エンコード不可能なため、プレースホルダー値 0 を使用するように改善しました。
System.Net.Mail のテストを Native AOT(Ahead-of-Time)コンパイルに対応させるための修正です。Runtime async による最適化により、リフレクション経由の汎用メソッド呼び出しが失敗するようになったため、テストコードを trim friendly(トリミング対応)に改善しました。
release/8.0-stagingからrelease/8.0へのマージコミット。Mono Hot Reload機能の空更新ハンドリング改善、Helixテスト環境のiOS/tvOS対応macOSバージョンアップデート(OSX.13.→OSX.15.)、および依存ライブラリ版のバージョン同期が含まれています。
release/9.0-stagingからrelease/9.0への手動マージです。主にCI/Helix インフラストラクチャ設定の更新が含まれており、macOS キューのロールフォーワード(OSX.13からOSX.15へ)、1ES イメージ選択の更新、COM相互運用テストの動作調整が行われています。
このPRはrelease/8.0ブランチからrelease/8.0-stagingへの定期的なマージであり、複数の分野にわたるサービシング更新を含みます。主な変更は以下の通りです:
このPRは#124305で導入された変更をRevertするもので、release/9.0ブランチのテスト動作とビルド/パイプライン設定を復元します。COM相互運用テスト、Helix macOSキューの設定、source-buildエージェントイメージ、xharnessツールバージョンの4つの主要な変更が元に戻されます。
このPRは、自動マージPR #124246で導入されたCOSE(CBOR Object Signing and Encryption)関連の変更を完全に取り消すリバートです。COSE メッセージのデコーディングロジック、重要ヘッダー検証テスト、ビルドパイプライン設定、およびバージョン/依存関係の更新が全て戻されます。
SYSLIB1045コード修正が C# 14 の拡張メンバー(extension members)内で無効な partial extension(...) 構文を生成する問題を修正しました。拡張ブロック(ExtensionBlockDeclarationSyntax)は TypeDeclarationSyntax を継承していますが、partial 修飾子をサポートしないため、生成されたRegexプロパティは親クラスに配置されるよう修正されました。
// 修正前(無効)
partial extension(string value)
{
public bool Test() => MyRegex.IsMatch(value);
[GeneratedRegex(@"\d+")]
private static partial Regex MyRegex { get; }
}
// 修正後(有効)
extension(string value)
{
public bool Test() => MyRegex.IsMatch(value);
}
[GeneratedRegex(@"\d+")]
private static partial Regex MyRegex { get; }
release/8.0-stagingからrelease/8.0への定期的なマージPRです。Monoのホットリロード機能の堅牢性向上、CI/CDのiOS/tvOSテスト環境のアップグレード、および8.0サービシング向けの依存関係・ビルド設定の更新が含まれています。
JIT(Just-In-Time)コンパイラの値番号(VN)キャッシュに関する回帰バグの修正です。VNF_ADD(baseVN, const)パターンで分解されたVNがアサーションキャッシュに登録されていなかったため、範囲チェック(bounds-check)削除ロジックが関連するアサーションを見落とし、コード生成段階での境界チェックが削除されずテストが失敗していました。
release/9.0-stagingからrelease/9.0へのマニュアルマージです。COM相互運用性テストの動作修正、macOSのHelixキュー名の更新(OSX.13からOSX.15へ)、および1ESソースビルドインフラストラクチャの更新が含まれます。
AsyncCovariantReturn テストから RequiresProcessIsolation 属性を削除し、プロセス分離の強制を解除しました。これにより、テストが統合 Loader テストランナーの一部として実行され、スタンドアロンプロセスとしての実行オーバーヘッドが削減されます。
このPRは、.NET runtimeの内部実装における従来の「Future<TResult>」という用語を「Task<TResult>」に統一するリファクタリングです。ファイル名の変更(Future.cs → Task_T.cs、FutureFactory.cs → TaskFactory_T.cs)、デバッガプロキシ型名の更新、およびテストコードのコメント・変数名の統一を含みます。
NIndex と NRange の ToString() メソッドが 64 ビットプラットフォームで uint.MaxValue を超える値を切り詰める問題を修正しました。キャスト時に uint ではなく nuint を使用することで、大きな値の正確な文字列表現を実現します。
// 修正前:^0 と表示される(切り詰め)
var ni = NIndex.FromEnd(unchecked((nint)(1L + uint.MaxValue)));
Console.WriteLine(ni.ToString()); // "^0"
// 修正後:^4294967296 と正確に表示される
Console.WriteLine(ni.ToString()); // "^4294967296"
RuntimeParameterInfo.GetCustomAttributesData() がメタデータを持たないパラメータ(DynamicMethodのデリゲート、ランタイム生成メソッドなど)で呼び出された際に発生する NullReferenceException を修正します。同じ ICustomAttributeProvider リージョン内の他の3つのメソッドと同様に、メタデータ不在時にnullトークンガードを追加し、空のリストを返すように統一します。
// 修正前(例外を発生)
var attrs = delegateParameter.GetCustomAttributesData(); // NullReferenceException
// 修正後(空のリストを返す)
var attrs = delegateParameter.GetCustomAttributesData(); // IList<CustomAttributeData>(空)
Unix環境のX509証明書テストにおけるオブジェクトライフタイム問題を修正するPull Requestです。GetGetDotNetCertメソッドが返す証明書をクローン化することで、CrlDiskCacheRecoversテストで発生していたハンドル無効化の問題に対処します。
配列長(array len)操作に関連するnull check効果をグローバルアサーション伝播(Global AP)から削除する最適化を実装しました。これは#93531と同様の変更ですが、CSE(Common Subexpression Elimination)の問題によりグローバルAPのみに限定されています。JITコンパイラの最適化パスにおいて、不要なnull checkを削除することでコード生成を改善します。
GDV(Guarded Devirtualization)拡張時に、JITがBBF_DONT_REMOVEフラグを過度に伝播していた問題を修正します。try ブロックの最初のブロックなど、"must keep"ブロック内のGDVが展開される場合、新しく作成されたブロックがこのフラグを不正に継承してしまっていました。本修正により、スプリット後の残余ブロックおよび展開パスで新規挿入されたすべてのブロックでBBF_DONT_REMOVEフラグをクリアします。
JIT コンパイラの最適化により、GT_INDEX_ADDR ノードに対する throw ヘルパーの生成を削減し、非最適化メソッドのコード サイズを削減します。また、モルフ後のグラフから GT_ARR_ELEM が現れないようにしています。
URI スキーム解析の冗長な範囲チェックを削除し、パフォーマンスオーバーヘッドを軽減する変更です。#121262 で JIT がスキップ可能な範囲チェックを正しく最適化できるようになったため、ParseSchemeCheckImplicitFile メソッドの早期検証条件を簡略化しました。
// 削除された冗長な範囲チェック
// if ((uint)i < scheme.Length && (uint)(i + 1) < scheme.Length)
// を削除し、最適化後は JIT が自動的に不要なチェックを除去
System.Numerics.Tensors.slnx ソリューションフィルターから、以前削除されたテストプロジェクト System.Numerics.Tensors.Net8.Tests.csproj への参照を削除するメンテナンス修正です。ソリューション定義とリポジトリの実際のプロジェクト構成を同期させています。
ブラウザベースのWebAssembly(WASM)テストの実行時に、V8テスティングが--moduleフラグなしで動作するよう、テストエントリーポイントファイルをtest-main.jsからtest-main.mjsにリネームしました。これにより、ESモジュール形式として明示的に認識されるようになり、V8のモジュール処理が改善されます。
PosixSignal 列挙型に SIGKILL = -11 を追加します。SIGKILL は POSIX セマンティクスに従い catch または ignore できないシグナルです。登録を試みると OS が自動的に例外をスローするため、マネージコード層での検証は不要です。
dotnet/runtimeのCI分析スキル向けの大規模なアップデート。PowerShellスクリプトGet-CIStatus.ps1に構造化JSON出力とMCP(Model Context Protocol)統合を追加し、推奨事項をデータ駆動型に変更。複数の深掘り調査ガイドを新規追加し、トークン効率を維持しながら詳細な調査ワークフローをサポート。
// JSON出力例(CI_ANALYSIS_SUMMARY)
{
"recommendationHint": "KNOWN_ISSUES_DETECTED",
"failedJobDetails": [
{
"jobName": "Build-x64",
"errorCategory": "test-failure",
"errorSnippet": "..."
}
],
"knownIssues": [...]
}
EventLogLogger がアプリケーション設定ファイルから FormatterOptions をバインドできるようになりました。WebApplication.CreateBuilder で Logging:EventLog セクションの設定を自動的に認識・適用します。Console ロガーと同様の構成メカニズムを実装し、設定駆動型のロギング動作が可能になります。
// appsettings.json
{
"Logging": {
"EventLog": {
"SourceName": "MyApplication",
"IncludeScopes": true,
"LogLevel": {
"Default": "Information"
}
}
}
}
このPRは、デスクトップ環境でiOSと同様の動的コード生成が禁止される環境をシミュレートするための --dynamiccodecompiled false ビルドオプションを追加しています。このオプションにより、JITを無効化し、インタプリタを有効化し、キャッシュされたインターフェースディスパッチを有効化するなど、iOS同等の制約をデスクトップで検証できます。
// ビルドコマンド例
// ./build.sh -subset clr -c Release -dynamiccodecompiled false
BigInteger のパース時にウクライナ文化(uk-UA)で使用される NBSP(U+00A0)と通常のスペース(U+0020)の間の互換性を修正しました。ウクライナ文化はNumberGroupSeparatorとして NBSP を使用しますが、ユーザーが通常のスペースを入力した場合のパース失敗を解決するため、MatchChars関数の空白文字の正規化ロジックを双方向に改良しました。
// 修正前のロジック
// 複雑な条件式で NBSP/space の変換を処理
// 修正後のロジック
NormalizeSpaceReplacingChar(cp) != NormalizeSpaceReplacingChar(val)
// 双方向の空白文字の等価性を簡潔に実現
Task<TResult>のデバッグプロキシが、失敗またはキャンセルされたタスクのResultプロパティに対してdefault(TResult)を表示していた問題を修正しました。修正後は、実際の動作に合わせて例外をスローするようになります。また、古い命名「Future」を「TaskOfTResult」に統一しました。
// 修正前
public TResult? Result => m_task.Status == TaskStatus.RanToCompletion ? m_task.Result : default;
// 修正後
public TResult Result => m_task.IsCompleted ? m_task.Result : default!;
C# 8+で導入されたインターフェースのデフォルト実装メンバーに対応するため、ExcludeFromCodeCoverageAttributeとStackTraceHiddenAttributeにAttributeTargets.Interfaceを追加しました。これにより、デフォルト実装を含むインターフェースに対して両属性を適用できるようになります。
[ExcludeFromCodeCoverage]
public interface ILogger
{
void Log(string message);
// デフォルト実装メソッドがコードカバレッジから除外される
void LogWarning(string message) => Log($"[WARN] {message}");
}
UnboundedChannel<T>のChannelReader.Completionでレース条件が発生し、すべてのアイテムが読み込まれてTryComplete()が呼び出されてもチャネルが完了しない問題を修正しました。TryReadがロック解放後に最後のアイテムをデキューする際の競合タイミングで、チャネル完了がトリガーされないケースに対応しています。
WriteOnceBlock<T>.ReceiveAsync が Post との並行実行時に null を返す競合状態を修正しました。原因は _header を _value より先に設定していたため、読み込み側が HasValue == true を観察しながら _value がまだ未初期化の状態を見ていました。修正では _value を先に設定し、Interlocked.MemoryBarrier() を追加してメモリ順序を強制しています。
// 修正前(危険な順序)
_header = Common.SingleMessageHeader; // HasValue becomes true
_value = messageValue; // Value set AFTER
// 修正後(安全な順序)
_value = messageValue; // Value set first
Interlocked.MemoryBarrier(); // Memory barrier for ordering
_header = Common.SingleMessageHeader; // HasValue becomes true
PR #117901の変更によりPInvoke ILStubがDynamicMethodDescからPInvokeMethodDescを直接返すようになったため、混合モードデバッガーのステップイン機能が破損していました。本PRは専用のPInvokeStubManagerを実装して、デバッガーがPInvokeスタブを正しく認識・トレースできるようにします。
// 新しいIsInteropStub()ヘルパーメソッド
bool IsInteropStub = pMD->IsInteropStub(); // IL stubs と PInvoke methods の両方に対応
ConfigurationElement.this[string] インデクサーで存在しないプロパティにアクセスする際に NullReferenceException がスローされていた問題を修正しました。プロパティが見つからない場合に適切に null を返すよう、null チェックを追加しています。
// 修正前:null参照で例外発生
if (prop.ProvidedName != propertyName) return null;
// 修正後:null チェック追加
if (prop is null || prop.ProvidedName != propertyName) return null;
このPRは、コンパイル時にサイズが不明なローカル変数を扱うための ValueSize クラスを導入しています。値の番号付け(Value Numbering)やSSA構築などの最適化フェーズで、正確な数値サイズが不要な場合に、サイズの等価性などのプロパティのみを考慮する仕組みを追加しています。
// ValueSize を使用して、コンパイル時にサイズが未定の変数を扱う
var valueSize = lclVar.ValueSize; // 等価性チェックなど
NativeAOTでの非同期インスタンス化・アンボックスシャンク対応を実現するPRです。新しいAsyncHelpers.TailAwaitイントリンシックを導入し、JITが非同期呼び出しを"tail await"として処理できるようにしました。これにより、シャンクメソッド自体の新しい中断点を作らず、呼び出し先の継続状態をそのまま返すことができます。
// TailAwait イントリンシック使用例
// async メソッドを呼び出す前に TailAwait() を呼び出し、
// JIT はその次の await を tail await として扱う
AsyncHelpers.TailAwait();
return asyncTarget();
browser-wasm テストの復元時に NU1102 エラー(パッケージが見つからない)が発生していた問題を修正しました。UseMonoRuntime が削除されたことで、SDK が存在しないランタイムパックをNuGetから取得しようとしていました。修正では、テスト依存プロジェクトの復元時に EnableRuntimePackDownload=false と EnableTargetingPackDownload=false を無条件に渡し、ローカルビルドから提供されるパックを使用するようにしました。
TensorPrimitives.Round<T>(ReadOnlySpan<T>, int, MidpointRounding, Span<T>) メソッドで digits == 0 の早期終了後に return ステートメントが欠落していたため、丸め処理が2回実行される制御フロー上のバグを修正しました。また、AwayFromZero switch ケースの break を return に変更し、他のケースとの一貫性を確保しました。
if (digits == 0)
{
Round(x, mode, destination);
return; // 修正:returnを追加
}
Copilot coding agentの指示を更新し、重複したテストメソッドよりもパラメータ化されたテストの使用を推奨するようにしました。xUnitの[Theory]属性と[InlineData]または[MemberData]を組み合わせて、複数の類似した[Fact]メソッドを1つの汎用テストメソッドに統合することを推奨しています。
Markdownのlintルール設定を改善し、System.Private.Uri/docs内のThreat modelファイルで使用されている標準的なMarkdown構文(2つのトレーリングスペースでのハードラインブレイク)を正式に認識するようにしました。ファイル全体を抑制するのではなく、ルール設定で適切に対応することで、lintの精度を向上させています。
ProcessRunnerの標準出力・標準エラー出力ハンドラが共有のStringBuilderに対して非同期に追記する際の同期化漏れにより、内部状態が破損しStringBuilder.ExpandByABlockのアサーション失敗minBlockCharCount > 0が発生していた問題を修正します。両イベントハンドラのAppendLine呼び出しを_outputCaptureオブジェクトでロックすることで競合を排除します。
正規表現エンジンの最適化バグを修正しました。MakeLoopAtomicがループをAtomic groupで囲む際、ループ本体内のバックトラッキングを誤って抑制してしまい、不正なマッチ結果を生成していました。修正では、ループ本体にバックトラッキング構文がないことを事前確認してからAtomic化を実行するようにしました。
// 修正前:バックトラッキングを含む本体でも Atomic化されてしまう
// 修正後:MayContainBacktracking() で検査し、不正な最適化を防止
if (!CanBeMadeAtomic(loop) || MayContainBacktracking(loop.Child))
{
// Atomic化しない
}
PR #123781によるthrow helper blocks生成位置の変更に伴い、liveness情報の更新漏れが発生していました。本PR では、throw helper block生成時に明示的にliveness状態(bbLiveIn/bbLiveOut)を正しく設定するようにしました。これにより、遅延生成されたblockでもGC/livenessの正確性が保証されます。
MetadataLoadContextの複数のType[]返却メソッドが、内部実装型のRoType[]やRoModifiedType[]を返していた問題を修正しました。これによりAsSpan<Type>()などのモダンSpan APIを使用する際に発生していたArrayTypeMismatchExceptionが解決されます。
// 修正前:ArrayTypeMismatchException が発生
var type = mlc.LoadFromAssemblyPath(...).GetType("C`2");
var args = type.GetGenericArguments();
args.AsSpan(); // RoType[] cannot be used as Type[]
// 修正後:正常に動作
args.AsSpan(); // OK
GS(Guard Stack)機能のJIT実装をリファクタリングしました。EnC(Edit and Continue)とWasm環境ではGSが未サポートのため、GSの有効化メカニズムを柔軟にして、オプトアウト理由を記録できるようにしました。また、importer内でlocalloc後のGS要求時にスタック再配置を要求していなかった問題も修正しています。
JIT コンパイラの範囲チェック最適化を改善し、i + cns < len パターンの冗長な境界チェックを削除します。条件式で事前に上限チェックが行われている場合、その後のアクセスに対する重複チェックを除去することでコード生成を効率化します。
// 例: i + 2 < span.Length の条件下では
// span[i + 1] と span[i + 2] のアクセスは追加チェック不要
if ((uint)(i + 2) < (uint)span.Length)
{
_ = span[i + 1]; // チェック削除対象
_ = span[i + 2]; // チェック削除対象
}
この変更は、Ready-to-Run (R2R) コンパイラにおいて CorInfoImpl.getAsyncInfo メソッドで必要とされる参照をモジュールに追加するための機能拡張です。Continuation フィールドアクセス用の GetHandleForField メソッドを追加し、非同期情報取得に必要なすべての参照を管理するための AddNecessaryAsyncReferences メソッドを実装しています。
このPRは、VMR(Virtual Mono Repository)コードフロー状態分析ツール(Copilot CLI skill)を改善するもので、**「現在の状態優先、コメントは履歴」**という設計パターンを採用しています。Maestroコメントを読む前に、PR状態、diff サイズ、force push、タイムラインなどの一次信号から独立した判定を形成し、その後コメントを履歴として参照することで、陳腐化したコメントに基づく誤った判断を防ぎます。
// 従来の方法:Maestroコメント → 結論
// 新しい方法:PR状態・force push・diff → 独立判定 → コメント(履歴参照)
CoreCLRをApple モバイルデバイス(iOS)で実行するための公式ドキュメントを更新するPRです。主にiOS向けのビルドおよび実行手順に関するドキュメントを改善し、より正確で実用的な情報を提供することを目的としています。
.NET 10→11への移行中に無効化されていた Wasm.Build.Tests.Blazor.AppsettingsTests.FileInVfs テストを再度有効化するPRです。リポジトリが.NET 11.0.0への移行を完了したため、バージョン不一致による環境の問題が解決され、テストの再有効化が可能になりました。
DiagnosticServerが起動初期段階でPerfMap有効化コマンドを受け取った際のクラッシュを修正するバックポート。PerfMap初期化を早期に移動し、依存関係の準備完了までPerfMap機能の実行を遅延させることで、record-traceなどのツールが即座にPerfMapを有効化する場合でも安全に動作するようにします。
Uriクラスの2つの廃止予定コンストラクタにおいて、誤解を招く廃止メッセージを修正するPRです。メッセージが「dontEscapeパラメータは常にfalse」と述べていましたが、実際にはこのパラメータは使用され、内部のUserEscapedフラグを設定します。誤った説明を削除し、より正確なメッセージに変更されました。
// 修正前
[Obsolete("This constructor has been deprecated; the dontEscape parameter is always false. Use Uri(string) instead.")]
// 修正後
[Obsolete("This constructor has been deprecated. Use Uri(string) instead.")]
PR #124077で導入されたSystem.Text.Json ソースジェネレータの変更を部分的に巻き戻すPRです。変更によりKnownTypeSymbolsがCompilationごとにキャッシュされず、JsonSerializerContext処理時に毎回新規インスタンスが作成されてしまい、パフォーマンスが低下していました。このPRでは、インクリメンタルパイプラインパターンを復元し、KnownTypeSymbolsをCompilation単位でキャッシュすることでパフォーマンス回帰を解決します。
JIT(Just-In-Time)コンパイラの最適化により、冗長なchecked文脈をキャスト操作から削除し、より多くの境界チェック最適化を実施するようになりました。事前の境界チェック(例:if (a > 100) の後の checked((byte)a))によって安全性が保証される場合、冗長なchecked修飾子を自動的に削除して、不要なチェック処理をスキップします。
このPRは.NET JITコンパイラのアサーション伝播(Assertion Propagation)の最適化に関する2つの改善を実装しています。
結果として、コード生成品質を改善しながらTP回帰を最小限に抑えています。
.NET 10 Linux環境において、システムクロックが後方に調整されたとき、Task.Delayなどのタイミング操作が無限にハングする回帰バグを修正します。CMakeが単調時計(monotonic clock)のサポートを検出しても、その設定値がPAL config.hヘッダーに伝播されていなかったため、ランタイムが誤って壁時計(CLOCK_REALTIME)にフォールバックしていました。設定ファイルに1行追加することで対応します。
EventSourceLoggerProvider.CreateLogger() がインスタンスをキャッシュせず、呼び出しのたびに新しい EventSourceLogger を生成する非キャッシング動作を明確に文書化するPRです。この動作は意図的(動的なEventSource/ETW設定変更のため連結リストを維持するため)ですが、Serilogのようにログイベントごとに CreateLogger() を呼び出すライブラリを混乱させていました。このPRは動作を変更せず、ドキュメントのみを追加更新します。
ZipArchiveEntry.ExtractToFileでoverwrite: true指定時に抽出失敗(パスワード保護やデータ破損など)すると、宛先ファイルが0バイトに破損する問題を修正しました。修正内容は、既存ファイル上書き時に一時ファイルへ抽出してから、抽出成功後のみ宛先へ移動させる戦略です。
// 修正前:ファイルを開いた後に抽出を試みるため、失敗時に既存ファイルが破損
using (var destination = new FileStream(destinationFileName, FileMode.Create))
{
using (var source = zipArchiveEntry.Open())
{
source.CopyTo(destination); // ここで例外発生 → ファイルは既に空に
}
}
// 修正後:一時ファイルに抽出して、成功時のみ移動
string tempPath = Path.GetTempFileName();
using (var destination = new FileStream(tempPath, FileMode.Create))
{
using (var source = zipArchiveEntry.Open())
{
source.CopyTo(destination); // 例外発生 → 元のファイルは無傷
}
}
File.Move(tempPath, destinationFileName, overwrite: true);
このPRは、COM相互運用性コードの改善の一環として、comutilnative.cpp内の非効率なMethodDescCallSiteの使用を削除しています。関連Issue #123864に貢献するもので、戻り値サポート機能の追加が含まれています。変更により、COM呼び出し機構の実装がより簡潔になり、保守性が向上します。
LowerCallMemmove関数のバグ修正です。CORINFO_HELP_MEMCPY呼び出しで、memmove セマンティクスを使用すべき場合に正しく処理されていませんでした。修正により、Unsafe.CopyBlockUnalignedなどのコピー操作で、すべてのデータをレジスタに読み込んでから一度に書き込む、より効率的なコード生成が実現されます。
static void Test(ref byte a, ref byte b, uint len)
{
if (len == 200)
{
Unsafe.CopyBlockUnaligned(ref a, ref b, len);
}
}
dotnet/runtimeにマネージドILアセンブラ(ilasm)のCLIプロジェクトが追加されました。既存のILアセンブラ機能を.NET CLIツールとして利用可能にするための実装で、コマンドラインインターフェースの整備とプロジェクト構成の強化が行われています。
LinuxにおけるCRL(Certificate Revocation List)検証の性能向上を目的とした、メモリ内キャッシュレイヤーを追加します。固定サイズ30要素のLRU(Least Recently Used)キャッシュを実装し、GCのファイナライズタイミングで段階的にエントリを削除します。呼び出し元はAddReferenceで参照カウントを管理し、キャッシュ削除時はDisposeを呼び出すことでSafeHandleのファイナライズを回避します。
// キャッシュからCRLを取得(呼び出し元で参照カウント管理)
var crl = cache.GetOrAdd(crlPath);
try
{
// CRL使用
}
finally
{
crl.Release(); // 参照カウント減少
}
BitArray.LeftShiftでシフト後に未使用の上位ビットがクリアされず、PopCount()が不正な値を返していた問題を修正しました。デシリアライゼーションコンストラクタでも同様の問題を修正し、ClearHighExtraBits()の呼び出しを追加しました。
// 修正前:LeftShift後にダングリングビットが残る
BitArray ba = new(33);
ba[^1] = true;
ba.LeftShift(1);
// ba.PopCount()が1を返す(不正)
// 修正後:ClearHighExtraBits()で未使用ビットをクリア
// ba.PopCount()が0を返す(正常)
このPRは、.NET 8.0リリースに向けたCOSE(Cryptographic Object Signing and Encryption)実装の改善をマージしています。主な改善点は、不定長CBORマップのデコード対応と、クリティカルヘッダー検証の強化です。特に、不定長配列の処理改善と空のクリティカル配列の拒否処理が追加されています。
COSE(CBOR Object Signing and Encryption)メッセージのデコーディングおよび署名動作を更新し、不定長CBOR コンテナをサポート、およびcrit(Critical Headers)ヘッダーの検証エラーをCryptographicExceptionで明確に表面化しました。定長・不定長両方のエンコーディング方式に対応したテストも追加されています。
// 不定長マップのデコードと crit ヘッダー検証の改善を実施
// Sign1・MultiSign の両メッセージ形式に対応
dotnet/runtimeのコードレビュープロセスを改善するPRです。AIレビュアーが、PR/Issueのコメントに左右されないよう、コード自体から独立した意見を先に形成してから判断するプロンプトに変更しました。また、レビュー結果に「Needs Human Review」オプションを明示的に追加し、より懐疑的で厳密なレビューを促進します。
Arm64 SVE(Scalable Vector Extension)のマスクテスト失敗を修正するPull Requestです。float/double型のマスク値をビットパターンとして扱うことで、reinterpret/bitcast操作時の正確なマスク処理を実現しています。
WebAssembly (Wasm) ターゲット向けの JIT コンパイラにおいて、オペランド評価順序のヒューリスティクスを調整しました。通常の評価順序を優先し、GT_REVERSE_OPS フラグの使用を抑制します。リロップ(演算子の変更で実現)と可換操作(オペランドの交換で実現)の場合のみ、反転が可能です。
Wasm では評価順序の反転がコード生成に悪影響を及ぼす可能性があるため、明示的に反転を抑制することでコード品質を向上させます。
JITコンパイラがawaitを含まない非同期メソッドのインライン化を可能にするPRです。awaitが存在しない非同期メソッドはアロケーション不要で比較的シンプルなため、これらのメソッドのインライン化により呼び出しオーバーヘッドを削減できます。
// インライン化の対象例:awaitなしの非同期メソッド
public async Task<int> GetValueAsync()
{
return await Task.FromResult(42); // FromResultはawaitなしで最適化可能
}
Tensor.Reverse<T>がlength-1次元(stride 0)を持つテンソルに対して不正な結果を返す問題を修正します。例えば、形状[1, 3]のテンソル[1, 2, 3]を反転すると、期待値は[3, 2, 1]ですが、修正前は[0, 2, 1]となっていました。
int[] data = [1, 2, 3];
var tensor = Tensor.Create<int>(data, [1, 3]);
var reversed = Tensor.Reverse<int>(tensor);
// 期待値: [3, 2, 1]
// 修正前: [0, 2, 1] (最初の要素が未初期化)
AsyncSuspend組み込み関数の使用時に、GT_RETURN_SUSPENDノードがBBJ_RETURNブロック以外に存在する可能性がある問題に対応しました。ELTプロファイラーフックによるリターンマージにより発生するこの状況に対し、lowering処理を拡張してGT_RETURN_SUSPENDを含むブロックをBBJ_RETURNブロックに変換します。
WebAssembly向けのRyuJIT コンパイラにbitcast操作のコード生成サポートを追加しました。bitcast命令は型を変更せずにバイナリ表現を別の型として解釈する操作で、浮動小数点数と整数の間の変換などで使用されます。
メモリ順序付けに関する問題を修正したバックポート。TypeDefテーブルとMethodDef/FieldDefトークンマップテーブル間の読み込み順序が保証されておらず、特にArm64などの弱メモリ順序付けCPUで、実行時に予期しない読み込み順序が発生し、クラッシュを引き起こしていました。VolatileLoadを使用することで適切なメモリバリアを確保します。
// 修正前: メモリバリアなし(読み込み順序の保証がない)
VolatileLoadWithoutBarrier();
// 修正後: メモリバリアを明示的に挿入
VolatileLoad();
MachO形式のバイナリにおいて、adrp/addおよびbranch命令の再配置(relocation)処理を修正しました。これらの命令は埋め込み加数(embedded addend)を持つことができないため、代わりに追加の再配置エントリを使用する必要があります。オブジェクトライターはすでにこうしたエントリの作成方法を知っていましたが、一部のケースで命令に埋め込み加数が残されていた問題を解決します。
VolatilePtr テンプレートクラスのメモリバリア欠落バグを修正。基底クラス Volatile<P> の operator= が release semantics を提供していたが、コンパイラ生成の代入演算子がこれを隠蔽し、メモリバリアなしの通常のストアを実行していました。Roslyn言語サーバーで非決定的なロックフリーレースによるクラッシュが発生していたため、using 宣言と明示的なコピー代入演算子を追加して修正します。
// 修正前: コンパイラ生成の代入演算子がrelease semanticsを失う
VolatilePtr<T, P> ptr;
ptr = other; // メモリバリアなしの通常ストア
// 修正後: 明示的な代入演算子がrelease semanticsを提供
class VolatilePtr : public Volatile<P>
{
using Volatile<P>::operator=; // 基底クラスのoperator=をスコープに導入
VolatilePtr& operator=(const VolatilePtr<T,P>& other); // 明示的なコピー代入
};
CoreCLR起動初期にPerfMapEnable IPC コマンドが到達した際のクラッシュを修正します。起動中の早い段階でGetAppDomain()やExecutionManager::GetEEJitManager()がNULLである場合、PerfMap::Enable(sendExisting=true)がクラッシュしていました。初期化完了を示すフラグを追加し、sendExisting処理の依存関係が準備できるまで当該処理をスキップする対応です。
macOSのSecure Transportで、リモート側がclose_notifyを送信した後にSslStreamへの書き込みがDebug.Fail(デバッグビルド)または誤解を招く「Bad address」エラー(リリースビルド)を発生させる問題を修正します。原因はEncryptMessageがSSLWriteからのPAL_TlsIo.ClosedGracefullyステータスを処理していなかったためです。
カスタム UriParser を使用する場合、UriKind.Relative が要求されても絶対 Uri が返される可能性があるエッジケースを修正しました。この問題はカスタム パーサーが base.InitializeAndValidate() の検証エラーをクリアした際に発生していました。修正は else if (uriKind == UriKind.Relative) を if に変更するだけの単純な制御フロー調整です。
デバッガがモジュールをアンロードする際に、ハッシュテーブルから正しく削除されていなかった問題を修正します。この不具合により、モジュールの再読み込み時にキャッシュが誤って使用され、デバッガの状態管理が不正になっていました。
ArrayList.IListWrapper.BinarySearchの整数オーバーフロー脆弱性を修正しました。midpoint計算をmid = (lo + hi) / 2からmid = lo + ((hi - lo) >> 1)に変更し、大規模配列検索時のオーバーフロー問題を解決します。併せてテストカバレッジを大幅に拡張しました。
// Before (overflows with large arrays)
int mid = (lo + hi) / 2;
// After (overflow-safe)
int mid = lo + ((hi - lo) >> 1);
System.Runtime/testsに分散していたUri関連テストを、System.Private.Uri/tests/FunctionalTestsに統合するテスト構成の整理です。ExtendedFunctionalTestsプロジェクトを削除し、重複するテストを排除しながら、15,221個のテストすべてが確認されています。
EnterpriseTests用のコンテナイメージをUbuntu 18.04から24.04へアップデートします。Ubuntu 24.04ではlibapache2-mod-auth-kerbとlibapache2-mod-auth-ntlm-winbindが廃止されたため、Kerberosモジュールをlibapache2-mod-auth-gssapiに置き換え、NTLM Winbindモジュールはソースからビルドして対応します。また、FTP TLS対応をProftpdの設定で追加します。
Vector2/Vector3のEqualsAnyメソッドの不具合を修正するPull Requestです。Issue #123586で報告された問題を解決し、これらのメソッドが正しく動作するようになります。テストケースも追加されており、Vector2で84行、Vector3で91行の新しいテストが含まれています。
プロキシ認証が必要な場合、407レスポンスを待たずに初回リクエストでProxy-Authorizationヘッダを先制的に送信するように修正しました。特に認証なしの接続を拒否するプロキシやHTTPS CONNECTトンネル、環境変数で指定された認証情報付きプロキシに対応します。
// SendWithProxyAuthAsync が ICredentials から認証情報を取得して
// 先制的に Basic 認証を送信するようになりました
var handler = new SocketsHttpHandler
{
Proxy = new WebProxy("http://proxy:port"),
Credentials = new NetworkCredential("user", "password")
};
コードレビュースキルのガイダンスを更新し、例外を無視する try/catch ブロックに対して懐疑的になるよう明示的に推奨しています。予期しないエラーを隠蔽するのではなく、失敗を表面化させることでレビュー品質を向上させます。
Helix work item Details APIの2つのバグ(サブディレクトリ内のファイル名が平坦化される、Unicode文字が拒否される)に対処するため、CI分析スキルをListFilesエンドポイント経由で取得するように変更。これにより、完全なサブディレクトリパスを保持し、Unicode文字を含むファイル名に対応したブロブストレージURIが取得できます。
// ListFilesエンドポイント使用でUnicode対応パスとサブディレクトリ情報を保持
// 例: xharness-output/logs/test/build.binlog → 完全なパスで取得可能
このPRは、AzDO(Azure DevOps)パイプラインの調査に関するドキュメントに、Azure CLIの使用ガイダンスを追加するものです。手動でのREST API構築への依存を減らし、az CLIコマンドの活用を推奨しています。主な追加内容は、認証確認、パイプラインクエリ、アーティファクト一覧化、およびREST API フォールバック条件の説明です。
dotnet/runtimeのコードレビュースキルドキュメントを更新し、レビュー出力の標準化、レビュー前のコンテキスト収集の推奨、複数モデル選択のガイダンスを改善しました。これにより、差分のみのレビューによるエラーを削減し、より効果的なコードレビュープロセスを実現します。
Azure DevOps パイプライン設定で AZL3(Azure Linux 3)ビルドイメージの識別子を正しい名前に更新しました。公開ビルドプール用と内部ビルドプール用で適切なイメージ名を指定しています。
Azure Pipelines設定ファイルにおいて、Azure Linux 3(AZL3)ビルドイメージの正しい識別子を使用するよう修正しました。公開ビルドプール用と内部ビルドプール用の両方のImageOverride設定が更新され、CI/CDパイプラインが正しいビルド環境を参照するようになります。
Azure DevOps のビルドパイプラインで使用されている Azure Linux 3(AZL3)ビルドイメージの識別子を、一時的な識別子から正式な識別子に更新するパッチです。パブリックパイプラインと内部パイプラインの両方で、ジョブが意図された AZL3 エージェントに正しくスケジュールされるようになります。
CI分析スキルの機能拡張と整理が行われました。ディレクトリ・スクリプト名がazdo-helix-failuresからci-analysisへリネームされ、より広範なCI分析に対応できるようになりました。SKILL.mdが大幅に改善され、使用パターン、制限事項、決定テーブル、アンチパターンが明確に文書化されました。PowerShell 5.1互換性の改善も実施されています。
vmr-codeflow-status スキルのSKILL.md ドキュメントを改善し、スキル・ビルダーの方法論に基づいてドキュメント構造を最適化しました。スクリプト自体の変更はなく、ドキュメンテーション改善のみです。
JIT コンパイラの checked context における冗長なオーバーフロー チェック フラグを最適化する変更です。GetRangeFromAssertions を活用して、範囲解析により実行時にオーバーフローが発生しないと判定できる場合、不要なオーバーフロー チェック命令(jo とそれに続く CORINFO_HELP_OVERFLOW 呼び出し)を削除します。
int Case1(int[] arr)
{
// JIT が配列サイズを [0..0x7FFFFFC7] と認識しているため
// +10 はオーバーフローしない
return checked(arr.Length + 10);
}
TensorPrimitives.HypotのXML ドキュメント内にある誤りを修正したPRです。メソッドのリマーク部分で、T.Hypot(x[i], x[i])と誤記されていた箇所を、正しいT.Hypot(x[i], y[i])に訂正しました。メソッドシグネチャの(x, y)という2つのパラメータに対応した正確なドキュメント記述になります。
WASM環境でのランタイム初期化失敗を修正するPRです。WASM環境ではミニダンプがサポートされていないため、DOTNET_DbgEnableMiniDump=1の設定時にPROCAbortInitializeがg_szCoreCLRPathの未設定によって失敗していました。この変更により、WASM上での初期化処理をスキップします。
Android プラットフォームでのスタックトレース出力形式の違いに対応するため、Ctor_Async_TestData テストを更新しました。Android では、スタックトレースにファイル名と行番号が含まれないため、テスト検証ロジックをプラットフォーム別に分岐させています。
LoggerMessageGeneratorとJsonSourceGeneratorの増分生成を改善するPRです。両ジェネレータがパイプラインにCompilationを渡していたため、任意のコンパイル変更で全体が再実行されていました。本PRでは、属性付き構文ノードの変更時のみ再処理するよう、パイプラインをリファクタリングしています。Roslyn 3.11、4.0、4.4、4.8に対応しています。
ImmutableArrayの範囲検証でInteger Overflowが発生していた問題を修正。start + lengthの加算時にオーバーフローが発生すると、負の値になり検証をすり抜けて、配列割り当て時にOutOfMemoryExceptionが発生していました。例えば、start=1, length=int.MaxValueの場合にオーバーフローが発生します。
iOS ARM64 プラットフォームビルドの一時的な無効化を取り消すリバートPRです。PR #123985で無効化されたiOS ARM64ビルドを再度有効化し、Mono、CoreCLR、Native AOTランタイムフレーバー全体でのiOS ARM64ビルドを復活させます。これにより、メインランタイムパイプラインと追加プラットフォームパイプラインの両方でiOS ARM64ビルドが実行されるようになります。
JITのliveness計算ロジックを改善し、アドレス公開ローカル変数のliveness情報をasync中断ポイント(suspension points)で正確に計算するよう修正しました。ローカル変数のアドレスはasync中断ポイントを跨いで取得されないため、より正確なliveness情報が得られます。
extra-platformsパイプラインでのモバイルビルドおよびテスト失敗を修正するPRです。ZipMergedPayloadDirectoryターゲットが削除されたターゲットを参照していた問題を解決し、Native AOT モバイルテスト用のマーカーを追加、Androidの共有ライブラリテストを除外、Apple モバイルの不安定なソケットテストを無効化しました。
WebAssembly(WASM)環境でのEventPipeDiagnosticsテストのタイミングに関する問題を修正。主な修正は、Playwrightが非同期操作を待つことでEventPipeをブロックしていた問題を解決し、テストの安定性を向上させています。また、テストコードの可読性向上とサンプリング期間の延長(2秒→5秒)が含まれています。
PR #112403で導入されたGC(ガベージコレクション)のピン昇格/降格処理の最適化が一部シナリオでハング(無応答)を引き起こすため、その変更を完全に戻すリバートPRです。ピン昇格決定ロジックをシンプルなインライン実装に戻し、抽出されたヘルパー関数を削除することで安定性を優先します。高ピン処理シナリオではパフォーマンス低下の可能性があります。
WebAssembly JIT コンパイラが WASM ネイティブ型のタイプシンボルハンドルを取得するための新しい JIT-EE インターフェース API getWasmTypeSymbol を追加します。この PR は完全なクロスレイヤプランビングを提供するインフラストラクチャ変更で、実装は UNREACHABLE() や NotImplementedException などのプレースホルダスタブで遅延されています。
// CEEInfo インターフェースに追加
CORINFO_WASM_TYPE_SYMBOL_HANDLE getWasmTypeSymbol(CorInfoType* types)
Emscripten SDK (emsdk) の取得機能を coreCLR の WebAssembly ビルド環境に統合するための変更です。新しく AcquireEmscriptenSdk.proj と AcquireEmscriptenSdk.targets を追加し、ビルドプロセス内での emsdk 自動取得を実現します。これにより、WebAssembly コンパイル時の依存関係管理が改善されます。
CLRインタープリターにおける仮想/インターフェースメソッドディスパッチのキャッシング機構を実装しました。InterpDispatchCacheという簡易ハッシュテーブルを導入し、DispatchToken + target MTからターゲットメソッドへのマッピングをキャッシュします。VSDのDispatchCacheと同様の設計で、衝突時は新しいエントリで置き換えられ、置き換えられたエントリはGC時に解放されます。この実装により、マイクロベンチマークで4倍の高速化を実現しています。
libsネイティブレイヤーのCMakeビルド設定とPAL(Platform Abstraction Layer)定義を修正するPull Requestです。pal_config.h.inから不要な定義を削除し、configure.cmakeに新しい定義を追加、pal_time.cのコンパイルエラーを修正しています。
TarFile.CreateFromDirectory メソッドに TarEntryFormat パラメータを指定できる4つの新しいオーバーロードを追加しました。これまではPAX形式のみでしたが、V7、Ustar、Pax、Gnuの4つの形式に対応します。既存メソッドは新しいオーバーロードにデリゲートし、デフォルト形式としてPAXを使用します。
// 新しいオーバーロード例
public static void CreateFromDirectory(
string sourceDirectoryName,
Stream destination,
TarEntryFormat format)
public static Task CreateFromDirectoryAsync(
string sourceDirectoryName,
Stream destination,
TarEntryFormat format,
CancellationToken cancellationToken = default)
このPull Requestは、GitHubのCopilot統合に関する設定を更新するもので、過去のPRでのインタラクションに基づいたコードレビュースキルを追加しています。Copilot指示ファイルの更新と、新しいコードレビュースキル定義ファイルの追加が含まれています。
VMR(Visual Studio Runtime)公式ビルドの鮮度確認機能を追加し、Codeflow状態スキルの診断精度を向上させました。aka.ms経由で最後に成功したビルドのタイムスタンプを取得し、バックフロー停止の真の原因を特定できるようになります。従来の誤解を招く「Maestroが停止している可能性」という警告から、より正確な「アップストリームのビルドが古い」という診断に改善されました。
WASM RyuJit コンパイラのローカル型エンコーディングの不具合を修正しました。WasmValueType enum の順序と typecode_mapping ルックアップテーブルの順序が一致していなかったため、正しい順序に再整列しました。
Azure DevOpsのタイムアウトなどによってキャンセルされたジョブから、Helixのテスト結果を回復する方法をドキュメント化しました。キャンセルされたジョブでもパイプラインアーティファクトに含まれるSendToHelix.binlogからHelixジョブIDを抽出し、Helix APIで直接クエリして結果を回復できることを解説しています。
dotnet/runtimeのVMRコードフロー状態スクリプトを改善し、Version.Details.xmlをVMRスナップショットの主要ソースとして使用するようになりました。手動バックフロー(darc vmr backflow)時にPRボディメタデータが古くなる問題を解決し、フォワードフロー(product repo → dotnet/dotnet)のスキャン機能も追加されました。
// Version.Details.xmlから<Source Sha=...>を解析する優先度
// 1. ng/Version.Details.xml内のSHA(正規表現フォールバック付き)
// 2. コミットメッセージ(セカンダリ確認)
// 3. PRボディ(最後の手段)
JIT の範囲分析において、乗算演算が負の値を含む範囲に対して不正な結果を返していた問題を修正しました。例えば [-100..100] * [0..10] が [0..1000] ではなく正しく [-1000..1000] を返すようになります。標準的な区間演算のアプローチを採用し、4つのエンドポイント積すべての最小値・最大値を計算することで解決しています。
// 修正前の問題例
// (ushort)1 * (sbyte)(-1) で不正な結果が生成されていた
byte[] vr9 = s_12[0];
long vr10 = (ushort)s_4 * (sbyte)(-s_4); // キャスト関連の最適化で誤った範囲に基づく生成コード
HAVE_CLOCK_MONOTONIC マクロをすべてのUnix系プラットフォームから削除するリファクタリングです。このマクロはすべてのサポート対象プラットフォームで常に1に定義されているため、マクロ定義とその関連フォールバックコードを完全に削除し、clock_gettime(CLOCK_MONOTONIC, ...) の使用を標準化します。
dotnet/runtime のビルドシステムで、macOS と Linux のデフォルトビルドツールを Ninja に変更するPRです。ベンチマーク結果によると、macOS では平均 654 秒から 718 秒への改善により、約 8.8% の高速化が期待されます。ユーザーは --ninja false オプションで従来のビルドシステムに戻すことができます。
Crossgen2がトリミングされたハードウェア拡張機能型を含むプロジェクトをコンパイルする際のTypeLoadException失敗を修正しました。InstructionSetGeneratorを改修し、型のロック時にGetType(..., false)を使用してnullを返すようにし、nullチェックを追加することで、トリミングされた型を適切にスキップできるようになります。
// 変更前: 型が見つからない場合に例外を発生
var type = Type.GetType("System.Runtime.Intrinsics.Arm.Crc32", true);
// 変更後: 型が見つからない場合にnullを返す
var type = Type.GetType("System.Runtime.Intrinsics.Arm.Crc32", false);
if (type != null)
{
// 型を処理
}
Helix CI分析スキルの2つの改善を実施しています。1つ目は、サブディレクトリ内のアーティファクト(例:xharness-output/wasm-console.log)に対するHelix APIの不正なURI返却に対応する修正です。2つ目は、スキルの適用範囲をCI失敗分析から一般的なCI状態分析へ拡大し、ビルド完全成功時や未実行時の情報も正確に表示するようになりました。
WebAssemblyのJIT (Ryujit)コンパイル時に、スタックポインタ (SP)ローカル変数が後から参照される場合(例:throw helper内)に、未使用と判定されてしまう問題を修正します。スタックポインタローカル変数を暗黙的に参照されるものとしてマークすることで、適切に保持されるようになります。
WebAssembly(Wasm)RyuJit コンパイラにおいて、Write Barrier ヘルパー呼び出しのコード生成実装と、ヘルパー関数への直接呼び出しをサポートするための改善です。ダンプおよび逆アセンブリ出力に呼び出し対象の記号名を付与し、デバッグ時の可視性を向上させています。
dotnet/runtime リポジトリに VMR(Vendor Managed Repository)コードフローの健全性を自動分析する新しい Copilot Agent Skill を追加します。このスキルは、バックフロー(VMR → 製品リポ)とフォワードフロー(製品リポ → VMR)の両方に対応し、PR メタデータの解析、スナップショットの検証、鮮度チェック、競合検出、修正トレースなどを実行して、推奨アクション(force trigger、close/reopen など)と実行可能な darc コマンドを提供します。
ildasm(IL Disassembler)ツール内の文字列処理の問題を修正しました。PR #78894で導入されたバグを解決するもので、mdinfo.cpp内の1行を修正しています。
ILLink trim analysis ソースコード内の XML ドキュメンテーション コメントの不正な形式を修正し、XML ドキュメント出力を有効にしたビルドが失敗しないようにしました。主な修正は、Nullable<T> テキストを Nullable{T} にエスケープし、<item> エントリを <list> ブロックで適切にラップすることです。
.NET 10 LinuxでTask.Delayがシステム時刻が逆方向にジャンプした時にフリーズする回帰バグを修正するPRです。CMakeはモノトニッククロック(CLOCK_MONOTONIC)サポートを検出していましたが、その結果がconfig.hに反映されず、ランタイムが壁時計時刻(CLOCK_REALTIME)にフォールバックしていたのが原因です。
// config.h.in に以下を追加
#cmakedefine01 HAVE_CLOCK_MONOTONIC
Apple mobile(iOS/tvOS)プラットフォームでランタイムの非同期機能を無効化するPRです。Issue #124044で報告された問題に対応し、Apple mobile環境での非同期機能の実行を制限します。
JIT コンパイラの境界チェック最適化において、O1K_BOUND_OPER_BND と O1K_BOUND_LOOP_BND を削除し、統一された境界アサーション形式を導入しました。すべての境界関連アサーションが O1K_VN -- OAK_<relop> -- O2K_CHECKED_BOUND_ADD_CNS という単一形式に統一され、x < len と x < (len - 10) のような異なるパターンを均一に扱えるようになりました。
async Task<T> がTask をオーバーライドする際に発生するTypeLoadExceptionを修正します。ランタイムが生成する非同期バリアント メソッド(アンラップされた戻り値型)が共変戻り値型の検証に不正に含まれていたことが原因です。
public abstract class Base {
public abstract Task HandleAsync();
}
public class Derived : Base {
// C#として有効だが、修正前はランタイムで拒否されていた
public override async Task<string> HandleAsync() {
await Task.Yield();
return string.Empty;
}
}
WebAssembly(Wasm)のコール処理に関連した複数のコンパイラバグ修正を行うPull Requestです。境界チェック(GT_BOUNDS_CHECK)と生存期間管理(GT_KEEPALIVE)のコード生成修正、ヘルパー呼び出しの実装、デリゲート呼び出しのローリング処理の修正、配列アドレス最適化のarity検証修正、および値の番号付け(VN)でのヘルパー呼び出しarity問題の修正が含まれています。
未使用のデッドコード GetFriendlyErrorCodeString 関数とその関連する HAVE_STRERRORNAME_NP CMake設定を削除するPRです。コードベース内に呼び出しサイトが存在しないため、安全に削除できます。合計62行のコードを削除し、codebaseのメンテナンス性を向上させます。
.NET 9で導入されたリグレッションを修正するバックポート。SampleProfilerのThreadSampleイベントにおいて、SampleTypeフィールドがマネージドコード実行中でも常にEP_SAMPLE_PROFILER_SAMPLE_TYPE_EXTERNALを報告していた問題を解決します。新しいスレッド状態フラグTS_SuspensionTrappedを導入し、スレッドが協調的(cooperative)モード中に自発的に一時停止したかどうかを追跡することで、正確なプロファイリングデータを提供するようになります。
dogfooding.md ドキュメントを .NET 9 から .NET 11 に統一する更新です。main ブランチが現在 .NET 11 をターゲットしているため、ドキュメント全体を .NET 11 の pre-GA バージョンに一貫性を持たせています。
PAL(Platform Abstraction Layer)から約1,200行の不要なスレッド制御コードを削除し、単一統一されたpthread mutex基盤の実装に統一しました。複数の古い同期メカニズム(POSIX semaphore、SysV semaphore、pthread condition variable、spinlock)と関連インフラをクリーンアップし、コードベースを大幅に簡素化しています。
Apple モバイルプラットフォーム上で CoreCLR R2R およびインタープリターモードにおいて、ToString_Async テストが失敗する問題に対応するPRです。該当するテストを無効化し、トラッキングissue #124044 で問題の根本原因の解決を追跡する予定です。
Copilot作成のPull Requestでissue-labelerワークフローが実行されない問題を解決するため、ポーリング機構を導入しました。5分ごとのcronスケジュールで未ラベル化されたPRを検出し、issue-labelerを実行します。これにより、Copilot PRやGitHubサービス中断時にラベル付けが漏れたPRも対象となります。
ThreadSample イベントの SampleType フィールドが常に EP_SAMPLE_PROFILER_SAMPLE_TYPE_EXTERNAL を報告していた問題を修正。.NET 9 で SuspendAllThreads を NativeAOT から CoreCLR に移植した際のリグレッション。修正により、マネージドコード実行中のスレッドは RareDisablePreemptiveGC で自身の GC モード(マネージド/外部)を保存するようになり、サンプラーがより正確なサンプルタイプを報告可能に。
WebAssembly(WASM)ターゲット向けのレジスタ割り当て(RA)アルゴリズムを簡素化・改善するPRです。追跡対象の各ローカル変数に仮想レジスタを割り当て、その仮想レジスタを物理的なWASM局所変数にマッピングするシンプルで正確性の高い設計を導入しました。将来的には、境界チェック用の内部レジスタなどの追加機能の基盤となります。
FreeBSD 15.0で導入されたOpenSSL 3.5.4に対応するため、OpenSSLライブラリの動的読み込み処理にサフィックス番号付けを追加しました。これにより、複数のOpenSSLバージョンが共存する環境での正確なライブラリ解決が可能になります。
ILLink テストフレームワークに [IgnoreILFailure] 属性を追加し、特定の IL 検証エラーを選択的に無視できるようにしました。これにより、System.Private.CoreLib の IL 修正時にオフセット変更によって引き起こされる検証エラーを個別にフィルタリングできるため、アセンブリ全体の IL 検証を無効化する必要がなくなります。
また、デバッグ効率化のため ILVerifierResult に [DebuggerDisplay] 属性も追加しました。
R2RDump(Ready2Run ダンプツール)で、メソッドシグネチャにプレフィックスを追加し、メソッドエントリーポイントテーブルのダンプ出力において、タスク返却メソッド、async メソッド、async resumption stub などの異なるメソッドバリアントを識別可能にしました。
WebAssemblyにおけるCoresCLRの開発効率を向上させるために、C++ヘルパーファイルを自動生成するためのシェルスクリプトを追加しました。Unix/macOS用のBashスクリプト(generate-coreclr-helpers.sh)とWindows用のバッチスクリプト(generate-coreclr-helpers.cmd)により、ManagedToNativeGeneratorタスクの実行を自動化します。
Ready-to-Run (R2R) コンパイラに対して、AllocContinuation、AllocContinuationMethod、AllocContinuationClass の3つのヘルパー関数を追加しました。これらは非同期状態機械の継続アロケーション処理を最適化するためのランタイムサポート機能です。
COM相互運用におけるIDispatchカスタムマーシャラーのネイティブシナリオに対するテストカバレッジの追加です。PR #123832で発見されたテストの抜け穴を埋めるため、.NETサーバーとネイティブクライアント間のIDispatch通信テストを実装しました。
Azure DevOps と Helix テスト失敗を分析するための AI エージェントスキルを追加します。Copilot に CI 失敗の調査方法を教え、PR番号またはビルドIDからAPIクエリを実行し、失敗詳細を抽出して改善提案を提供します。dotnet/runtime、sdk、aspnetcore、roslyn など複数リポジトリに対応し、既知問題との照合や PR の変更との相関分析も実施します。
TensorPrimitives.BitIncrement と TensorPrimitives.BitDecrement の Half 型に対してベクトル化を追加しました。これまで float への拡張と縮小を行っていたオーバーヘッドを排除し、Half の ushort ビット表現を直接操作することで性能を向上させます。
ZipArchive の Update モードで、エントリストリームを開く際に実際のデータ書き込みがなくても、アーカイブが変更済みと誤認識され、Dispose 時に不要な再書き込みが発生していた問題を修正しました。これにより、MemoryStream などの拡張不可能なストリームで NotSupportedException がスローされていた問題が解決されます。
// 修正前:ストリームを開いただけで変更済みとマーク
using (var archive = new ZipArchive(stream, ZipArchiveMode.Update))
{
var entry = archive.CreateEntry("test.txt");
var entryStream = entry.Open(); // この時点で変更済みとマーク
// 実際に書き込まない場合、Dispose時に不要な再書き込み
}
// 修正後:実際の書き込み時にのみ変更済みとマーク
using (var archive = new ZipArchive(stream, ZipArchiveMode.Update))
{
var entry = archive.CreateEntry("test.txt");
var entryStream = entry.Open();
// 書き込みがなければ、Dispose時に再書き込みされない
}
Runtime Async v2メソッドのデバッガサポートを実装しました。Async メソッドは同じメタデータトークンを持つ2つの MethodDesc バリアント(Task返却アダプタの"thunk"と実装)を生成しますが、デバッガはthunkと実装を区別できず、ステップイン失敗やブレークポイント バインディング問題が発生していました。本PR は新しい AsyncThunkStubManager を追加し、ステップイン時のthunk認識、ブレークポイント バインディングの制御、スタックウォークでの非表示化を実現します。
ReadyToRun (R2R) イメージにおけるContinuation型のエンコード機能を追加しました。新しいフィックスアップタイプ(READYTORUN_FIXUP_Continuation_Layout = 0x37)を導入し、GC参照マップをビットベクトルからバイト配列に展開してエンコードします。ランタイム側ではGetContinuationTypeFromLayoutによる復号化とLoadDynamicInfoEntryによる処理に対応しました。
// Continuation型フィックスアップのエンコード例
// GC refmap → byte array 展開
// R2Rイメージから動的に型情報を復号化
RyuJITのターゲットアーキテクチャヘッダーファイル(target*.h)から不要なインデント(2スペース)を削除するリファクタリング。targetwasm.hを追加する際のスタイル不一致を解消し、#defineのインデント規約を統一。
MinOpts(最小化最適化)コード生成時に、async中断を跨いでのローカル変数の生存性判定を改善しました。従来はすべてのローカル変数をliveと見なしていましたが、本PRで完全な生存性分析(full liveness)を実行することで、余分なlifted state生成を削減し、全体的なパフォーマンスを向上させています。
NumberStyles.AllowTrailingInvalidCharacters モードの包括的なテストカバレッジを追加するPRです。このスタイルは Parse/TryParse API が最初の無効な文字までを解析し、消費した文字数を返すことを可能にします(Utf8Parser の動作に類似)。すべての整数型、浮動小数点型、BigInteger を対象とした計1,152行のテストが追加されました。
// 例: "123abc" を解析する場合
// 値: 123, 消費文字数: 3
if (int.TryParse("123abc",
NumberStyles.AllowTrailingInvalidCharacters,
CultureInfo.InvariantCulture,
out var result))
{
// result = 123
}
このPRは、JITコンパイラの値番号付け(VN)ベースのアサーション表現を簡潔にするものです。従来の relopVN OAK_[NOT]_EQUAL 0 という表現から、op1VN OAK_<relop> op2VN という直接的な表現に統一することで、アサーション処理を効率化し、将来の最適化を可能にしています。
// Before: assertion consumers had to call GetVNFunc to extract operands
relopVN OAK_NOT_EQUAL 0
// After: direct relational assertion
op1VN OAK_LE op2VN
corelib.hとmetasig.hヘッダーファイルから未使用のメソッドシグネチャを削除するクリーンアップです。合計142行のコードを削除し、ランタイムのコード整理と保守性向上を目的としています。
JITコンパイラのライブネス解析フェーズをリファクタリングする変更です。各ライブネスフェーズを独立した関数に分離し、LiveVarAnalysisクラスをLivenessクラスに統合しました。機能的な動作変更はありませんが、MSSQLコンパイラでのインライン決定に関連したテンポラルパフォーマンス回帰が存在します。
.NET ランタイムのホストポリシーコンポーネントから、deps_entry_t 構造体の未使用フィールド library_hash と library_hash_path を削除するクリーンアップです。これらのフィールドは deps.json ファイルから解析されていましたが、実際には読み込まれていないデッドコードでした。
Monoランタイムが $DOTNET_STARTUP_HOOKS 環境変数を読み込まない問題を修正します。現在、System.StartupHookProvider.ProcessStartupHooks() 呼び出し時に空文字列のみが渡されており、他のランタイム(CoreCLRなど)と異なる動作をしていました。この修正により、Monoでも環境変数から起動フックを正しく読み込めるようになり、ランタイム間の一貫性が向上します。
// 修正前の問題
// Mono側では DOTNET_STARTUP_HOOKS 環境変数を無視し、
// 手動でホスト設定を追加する必要があった
<RuntimeHostConfigurationOption Include="STARTUP_HOOKS"
Value="MyStartupHook"
Condition=" '$(UseMonoRuntime)' == 'true' " />
// 修正後
// CoreCLRと同じように DOTNET_STARTUP_HOOKS 環境変数が読み込まれる
アプリケーション起動時のアセット解決処理を最適化し、文字列の比較とコピーを削減しました。サービス提供ディレクトリ名との不要な文字列比較を回避し、TPA リスト構築時のdeps_asset_tアセットのコピーを削減することで、空のコンソールアプリケーション起動時に約1000個のメモリ割り当てを削減しました。ベンチマーク結果では平均起動時間が55.77msから55.48msに短縮(-0.5%)されており、標準偏差も0.50msから0.35msに改善されています。
.NET Runtime 9.0.14リリースに向けて、ブランディング・ファイルバージョン情報を更新するPull Requestです。ProductVersionとPatchVersionを9.0.13から9.0.14へ引き上げています。
.NET Runtime 8.0系の製品ブランディングバージョンを 8.0.24 から 8.0.25 へ更新するパッチリリースです。共有バージョン設定ファイルの ProductVersion と PatchVersion を段階的に更新しています。
ARM SVE2命令セットに対する2つの新しいシフト命令 ShiftRightLogicalNarrowingSaturate(Even|Odd) を追加します。これらの命令は、ベクトル要素を論理的に右にシフトしながら、結果を狭い型に飽和させます。
// 使用例
Vector<ulong> input = ...;
Vector<uint> result = Sve2.ShiftRightLogicalNarrowingSaturateEven(input, shiftAmount);
EventPipeに新しいマッピング dotnet_ipc_created を追加し、.NETプロセスの診断ポート(listen port)が正常に作成されたことを低オーバーヘッドで外部ツールに通知できるようにしました。従来は複数の一時ファイルディレクトリをスキャンする必要がありましたが、この変更によりプロセスの準備完了を効率的に検出できます。
WebAssembly上のブラウザホスト環境の改善を行うPull Requestです。ファイルシステム仮想化の統一、エラー検出の強化、メモリプローブ機能の追加などが含まれています。主にWasm環境での実行時の安定性と互換性を向上させています。
SignedInfo クラスの <Reference> 要素の最大数を AppContext スイッチで設定可能にしました。従来は 100 に硬直していましたが、.NET Framework の互換性を復元し、多数の参照を含む SOAP メッセージなどのワークロードに対応します。
// 使用例:AppContext で最大参照数を設定
AppContext.SetSwitch("System.Security.Cryptography.MaxReferencesPerSignedInfo", 200);
SVE(Scalable Vector Extension)における長いナロー化操作でのシフト処理のバグを修正しました。Issue #123496 に対応した修正で、JIT コンパイラのベクトル操作処理における問題を解決しています。
DebuggerController::BindPatchメソッド内でGetJitInfo呼び出しがハッシュマップ検索時にロック順序違反を起こし、デバッガハングが発生する問題を修正。パッチにDebuggerJitInfo(DJI)が既に存在する場合、それを直接使用してGetJitInfo呼び出しを回避することで、ロック競合を排除します。
// 修正例(C++の実装)
DebuggerJitInfo *info = patch->HasDJI() ? patch->GetDJI() : g_pDebugger->GetJitInfo(pMD, (const BYTE *)startAddr);
CoreCLR interpreter on arm64にSwift呼び出し規約のサポートを追加しました。Swiftは標準arm64 ABIと異なる呼び出し規約を使用しており、専用レジスタ(x20=self、x21=error、x8=indirect result)とstruct値型の引数・戻り値のloweringに対応しています。
このPRは、CoreCLRとNativeAOT両方の実行時における非同期スタック(runtime-async stacks)でのスタックトレース収集を実装します。Exception.ToString()で非同期待機チェーン(async-await chain)のフレームを例外スタックトレースに含めることで、より完全なスタックトレース情報を提供します。主な実装は、AsyncHelpers内でContinuationのDiagnosticIPを使用してフレームを追加し、ThrowExactヘルパーで既存のスタックトレースを保持しながら例外を再スロー(ExKind.RethrowFlagを利用)することです。
このPRは、dotnet/runtimeリポジトリ全体の.jsonファイルにおけるインデンテーションとフォーマットの不一致を修正するものです。セマンティックな変更は一切なく、スタイル・フォーマットのみを統一しています。約40個のJSONファイルを2スペースインデント(またはプロジェクト定義のインデント)に統一し、余分な空白を削除して構造を整理しました。
Microsoft.Extensions.LoggingのAddFilterメソッドのXML文書化を改善し、フィルター関数のパラメータ(string?型)の意味を明確化しました。プロバイダータイプ名、カテゴリ名、ログレベルなどのパラメータの役割と、戻り値(trueでログを許可、falseでフィルタリング)の意味を詳細に記載しました。
PR #116096のPALクリーンアップ後、SPMI(SuperPMI)のTOC(Table of Contents)ファイル検出ロジックが反転していたバグを修正しました。この不具合により、TOCファイルが使用されず、superpmi-diffsのパフォーマンスが大幅に低下していました。修正により、asmdiff生成処理が約55倍高速化されました。
// 修正内容のイメージ
// Before: if (fileExists) { skip TOC file }
// After: if (!fileExists) { skip TOC file }
iOS ARM64プラットフォームでのアプリインストール失敗の問題により、CI/CDパイプラインからios_arm64ビルドを一時的に無効化しました。tvOS ARM64ビルドは継続して実行されます。問題追跡用のGitHub Issueにリンクされています。
TimeSpan.Milliseconds(0-999の成分値)とTimeSpan.TotalMilliseconds(総ミリ秒数)の誤用を修正するPRです。System.Net.Socketsではタイムアウト計算が非単調時間源を使用していた問題も解決します。例えば2.5秒経過時、.Millisecondsは500を返しますが.TotalMillisecondsは2500.0を返します。
// 修正前(間違い)
timeout -= (DateTime.UtcNow - waitStart).Milliseconds; // 1秒以上経過時に大幅に短縮
// 修正後(正しい)
long waitStart = Stopwatch.GetTimestamp();
timeout -= (int)Stopwatch.GetElapsedTime(waitStart).TotalMilliseconds;
PR #123304で導入されたRuntime="NET"属性を使用したWebAssembly SDK pack タスクの最適化を取り消すバックポート。この機能がSDK形式のプロジェクトでのみサポートされており、Blazorテストが失敗するため、マルチターゲティング(net11.0 + net472)とMSBuildRuntimeType ベースのTFM選択に戻します。
// 復元されるマルチターゲティング
<PropertyGroup>
<TargetFrameworks>$(NetCoreAppToolCurrent);$(NetFrameworkToolCurrent)</TargetFrameworks>
</PropertyGroup>
// Runtime="NET"からTaskHostFactoryに戻す
<UsingTask TaskName="..." TaskFactory="TaskHostFactory" ... />
PR #123304で導入されたRuntime="NET"アプローチをリバートする変更です。WebAssembly SDKのビルドタスクをマルチターゲット(net11.0 + net472)に戻し、TaskFactory="TaskHostFactory"と TFM ベースの選択を復活させます。理由はRuntime="NET"がSDKスタイルプロジェクトのみでサポートされており、非SDKスタイルプロジェクトから呼び出すと失敗するため、および.NET Runtime Task Host インフラがまだ成熟していないためです。
このPRは、appdomain.cpp内で使用されていたMethodDescCallSiteを削除し、より効率的なメソッド呼び出しメカニズムに置き換えるリファクタリングです。CoreCLRのメソッド呼び出し処理を簡潔化し、保守性を向上させることが目的です。Issue #123864に貢献しています。
Microsoft.NET.Sdk.IL プロジェクトファイルの PackageReference に PrivateAssets="all" 属性を追加し、ビルド時の依存パッケージ(Microsoft.DotNet.Build.Tasks.Templating)が NuGet パッケージの推移的依存関係として公開されることを防ぐ変更です。これにより、P1 への影響回避とパッケージ解決の問題を修正します。
このPRは、JITコンパイラのAssertionDsc、AssertionDscOp1、AssertionDscOp2構造体の全フィールドをprivateに変更し、公開getterで検証ロジック付きで公開する変更です。アサーション値が不正なコンテキストで変更されることを防ぎ、メモリレイアウトの最適化(64ビットで40バイト)を実現しています。フィールド名をm_プレフィックスに統一し、JitDumpの出力も改善されています。
Matrix4x4.GetDeterminantにSSE(Streaming SIMD Extensions)実装を追加しました。ベクトル化により約15%のパフォーマンス向上を実現しています。ベンチマーク結果では3.487nsから2.971nsへの改善が確認されており、Ratio 0.85を達成しています。
JITコンパイラのliveness解析(変数の生存期間分析)を独立したクラスに再構成するリファクタリングです。将来の非同期変換時にliveness解析を修正可能にするための基盤整備で、拡張性を高めながらゼロコストの設計を実現しています。
MsQuic(マイクロソフトのQUICプロトコル実装)をバージョン2.4.16に更新するリリースブランチのバックポートです。このパッチバージョン更新により、Windows環境でのQUIC通信のサポートが改善されます。既にメインブランチと.NET 10で数ヶ月間安定稼働しているため、低リスクの変更です。
dotnet/runtime の Windows 環境において、MsQuic ライブラリのバージョンを 2.4.16 に更新するバックポートです。メインブランチと .NET 10 では既に数ヶ月間このバージョンで運用されており、安定性が確認されています。
このPRはJITコンパイラの約40のクラス・構造体におけるCompiler*フィールドの命名を統一し、すべてm_compilerという一貫した名前に標準化しています。これまでm_comp、m_pComp、m_pCompiler、comp、compilerなど多様な命名パターンが混在していた部分を整理し、コード可読性と保守性を向上させています。
RegexCompilerの正規表現バックリファレンスマッチング処理にパフォーマンス最適化を追加しました。大文字小文字を区別する場合にSequenceEqualを使用することで、文字ごとの比較から効率的なスパン比較に変更。これにより、RegexSourceGeneratorと同じ最適化アプローチが実装されました。
// 最適化前:文字ごとの比較
// 最適化後:SequenceEqualによるスパン比較
if (spanA.SequenceEqual(spanB))
{
// マッチ処理
}
Process.KillTreeがプロセス列挙中に大量の例外をスロー・キャッチしていた問題を修正しました。デバッガ接続時に23秒かかっていた処理が0.17秒に改善されます。非スロー型のヘルパーメソッド(TryGetStartTime、TryGetParentProcessId)を追加し、例外を最小限に削減しながらプロセスツリーの終了機能を維持します。
// 修正前:例外が大量に発生
process.StartTime; // アクセス不可なプロセスでException
// 修正後:例外なし
TryGetStartTime(out DateTime startTime); // bool戻り値で安全
.NET 10.0向けのリリースブランチにおいて、内部ビルドの検証パイプラインを修正するインフラストラクチャのみの変更です。VMR(Unified Repository)からのバックフロー検証を有効化するために、NuGetソース認証の設定を一元化し、内部ビルド用のHelixキューを適切に選択するように修正されています。
XDocument.LoadAsyncが同期読み込みを使用していた問題を修正します。このメソッドを非同期コンテキストで呼び出す際に、スレッドプールのスレッドをブロックする問題が解決されます。
WebAssembly上のCoreClRで、大きなバリュー型(large valuetypes)に対するリフレクション呼び出しのサポートを実装しました。thisポインタと戻り値バッファ(retbuf)の引数順序を変更し、新しい呼び出し規約に対応しています。この修正により、Pri0テストで6個、Pri1テストで約2000個のテストが修正されます。
// 大きなバリュー型をリフレクションで呼び出す場合の改善
public struct LargeValueType
{
public long Field1;
public long Field2;
// ... large data
}
// リフレクションを使用した呼び出しが正常に動作するようになりました
object result = method.Invoke(target, parameters);
ReadyToRun (R2R) テスト ビルドにおいて、ResolveReadyToRunCompilers を適切にオーバーライドするための変更です。テスト ビルド構成でReadyToRunコンパイラーの解決プロセスを制御し、特定のテストシナリオでの動作を改善します。Issue #123499 の修正に対応しています。
OpenStandardInputHandle、OpenStandardOutputHandle、OpenStandardErrorHandle の3つの新しい公開API を System.Console に追加するPRです。これらのAPIは、標準入力・出力・エラーストリームの基盤となるOSハンドル(SafeFileHandle)を取得するための機能を提供します。
// 使用例
SafeFileHandle inputHandle = Console.OpenStandardInputHandle();
SafeFileHandle outputHandle = Console.OpenStandardOutputHandle();
SafeFileHandle errorHandle = Console.OpenStandardErrorHandle();
インタープリタコールスタブのログ出力を、コンパイル時の#if LOG_COMPUTE_CALL_STUBディレクティブからランタイム制御可能なLOG2ファシリティに変換しました。これにより、再コンパイルなしにデバッグ時のログを有効化できるようになります。環境変数DOTNET_LogFacility2=0x2 DOTNET_LogLevel=10000で制御可能です。
ARM64 SVE(Scalable Vector Extension)マスクAPI群に対してfloat/double型引数のサポートを追加するPull Requestです。これにより、整数型のみに限定されていたマスク関連のAPIを浮動小数点型にも拡張します。CreateWhile*()の変更は別途対応予定とのことです。
area-CodeGen-coreclr ラベルの自動割り当て機能を削除するための変更です。このラベルは dotnet/runtime で最も使用頻度の高いラベルであり、CodeGen チームへの自動通知が大量のメール混乱を引き起こしていたため、PR #122357 での変更を取り消します。チームは既存の方式で全ての関連 Issue を確認しているため、この自動割り当てが不要と判断されました。
JsonSerializerOptionsに汎用メソッドGetTypeInfo<T>()とTryGetTypeInfo<T>()を追加しました。これにより、型情報取得時の明示的なキャストが不要になり、型安全性が向上します。
// Before
var info = (JsonTypeInfo<string>)options.GetTypeInfo(typeof(string));
// After
var info = options.GetTypeInfo<string>();
DNS制限を超過するホスト名(長いラベルを含む場合など)でPunycodeエンコーディングに失敗し、IdnHostが非ASCII値を返すエッジケースに対応しました。このケースでHTTP処理のデバッグアサーション失敗が発生していたため、ASCII検証ロジックを追加して堅牢性を向上させています。
Copilotが使用するプロンプトファイルを、オープンスタンダードの Agent Skills 形式に移行しました。VS Code 専用のプロンプトファイル (.github/prompts/add-new-jit-ee-api.prompt.md) を、Copilot Coding Agent や GitHub Copilot CLI でも利用可能な Skills 形式 (.github/skills/add-new-jit-ee-api/SKILL.md) に変換しています。コンテンツは保持され、フロントマターのみ形式を適応させています。
dotnet/runtime リポジトリのエリアオーナーシップ割り当てを更新するPRです。Extensions関連のエリア(Caching、Configuration、DependencyInjection、FileSystemなど)の所有者を @jeffhandley から @karelz に変更し、System.Reflection関連のエリア(Reflection、Reflection.Emit、Reflection.Metadataなど)を @agocke に、System.Diagnostics.Process を @SamMonoRT に割り当て直しています。
TypePreinitのswitch IL命令ハンドラーにおけるオフバイワンエラーを修正します。ECMA-335仕様に従い、switch値がケース数以上の場合(value >= count)に次の命令にフォールスルーする必要がありますが、修正前はvalue > countのみをチェックしていました。値がケース数と正確に一致する場合、存在しないジャンプテーブルエントリーを読み込もうとしてILリーダーのオフセットが破損し、NativeAOT コンパイル中にIndexOutOfRangeExceptionが発生していました。
issues.targets移行後に無効または見落とされたサプレッション設定を修正するPull Requestです。テストプロジェクトのビルド設定と複数のILテストファイルのサプレッション属性が更新されており、テストの正確な実行と警告管理の一貫性が改善されます。
SSL/TLS ALPN(Application-Layer Protocol Negotiation)プロトコル選択処理において、バイトシーケンス比較の実装をより適切で読みやすいパターンに改善しました。SequenceCompareTo<byte>(...) == 0 の比較パターンを SequenceEqual(...) メソッドに置き換えることで、コード意図の明確化とイディオマティックな実装を実現しています。
// 変更前
if (supportedProtocols[i].SequenceCompareTo(protocol) == 0)
// 変更後
if (supportedProtocols[i].SequenceEqual(protocol))
macOS の TLS 証明書チェーン設定時のメモリ割り当てを最適化するPRです。SafeDeleteSslContext.SetCertificate において、証明書ハンドルリスト構築時のヒープ割り当てを回避するため、stackalloc/ヒープフォールバック戦略を導入します。
GetRequestCertificateAuthoritiesメソッドのパフォーマンスを最適化し、Windows/macOSプラットフォーム上で証明書認証局の識別名処理時における不要な配列割り当てを削減しました。ReadOnlySpan<byte>を直接使用することで、メモリ割り当てのオーバーヘッドを排除しています。
FileSystemName.MatchPatternメソッドにおいて、DOS_STAR ワイルドカード処理中のピリオド検出ロジックを手動ループから組み込みのContainsメソッドに置き換えました。コード可読性と保守性の向上を実現しています。
// 変更前: 手動ループ
for (int i = 0; i < length; i++)
{
if (span[i] == '.') { /* ... */ }
}
// 変更後: Contains を使用
if (span.Contains('.')) { /* ... */ }
CultureInfo.CreateSpecificCultureメソッドの実装を簡潔化しました。IndexOfを活用した文字列処理により、コードの可読性と保守性を向上させています。
RemoteCertificateValidationCallbackで追加された証明書がSslStreamにより不正に破棄されることで発生するNREバグを修正。ユーザーがX509Chain.ChainPolicy.ExtraStoreに追加した共有証明書が複数のハンドシェイク間で再利用される際、ExtraStoreの破棄ロジックを改善して証明書の所有権を正しく判断するようにしました。
// 修正前:コールバック経由で追加された証明書も常に破棄される
chain.ChainPolicy.ExtraStore.Add(sharedCert);
chain.Reset();
chain.Build(cert); // 次の呼び出しで NRE 発生
// 修正後:RemoteCertificateValidationCallback が存在しない場合のみ破棄
JIT コンパイラのグローバル最適化パス(GlobalAP)から、低効率な複数の最適化ロジックを削除しました。optAssertionVnInvolvesNan、optImpliedByConstAssertion、optImpliedByTypeOfAssertions、およびVnAssertionMappingを廃止することで、最大-0.4%のタイム・フェーズ(TP)改善を実現しながら、削除されたコードを他の有価値な最適化(例:アサーション有効化)に充てることができます。
このPRは、.NETランタイム全体でSR.Formatの引数カウントと対応するリソース文字列のプレースホルダー数の不一致を修正しています。エラーメッセージやリソース文字列の引数ミスマッチを一括で修正し、コード品質を向上させました。
System.IO.CompressionのZipArchive処理における不要な配列割り当てを排除し、ArrayPool<byte>からのバッファ再利用とSpan操作の簡素化を実施。Zipセントラルディレクトリの読み取り時に池化されたバッファを使用し、手動ループをSpan.Fill/Span.Clearに置き換えることで、GC圧力を軽減します。
NativeAOT(Native Ahead-of-Time)のIL(Intermediate Language)オフセットからネイティブコードの行番号へのマッピング処理における2つのバグを修正しました。前回のPR #123333で発生した問題を解決し、IL オフセットがシーケンスポイントの最高値を超えるケースや、中間値のケースで適切にドキュメント情報を保持し、ネイティブ←→行番号マッピングを生成できるようにしました。
DateOnly.TryParse/TryParseExact と TimeOnly.TryParse/TryParseExact メソッドが無効な DateTimeStyles パラメータに対して false を返す代わりに ArgumentException をスローするよう修正しました。これにより、DateTime や DateTimeOffset などの他の .NET API との一貫性が確保されます。
// 修正前:false を返す
DateOnly.TryParseExact("2064-07-01", "yyyy-MM-dd", null, DateTimeStyles.AssumeUniversal, out var result);
// 修正後:ArgumentException をスロー
DateOnly.TryParseExact("2064-07-01", "yyyy-MM-dd", null, DateTimeStyles.AssumeUniversal, out var result);
// → ParamName = "style" の ArgumentException
このPRは、WebAssembly(Wasm)のオブジェクトライターにインポートセクションの生成機能を追加します。ランタイムから提供されるenv.memory、__stack_pointer、__r2r_startをインポートし、定数式拡張を使用してR2Rペイロード配置のアドレス計算を行います。モジュールメモリのエクスポート削除により、ランタイムとのメモリ共有に対応します。
NativeAOT(Native Ahead-of-Time)テスト設定のタイムアウト値を240分から300分に拡張します。最近これらのテスト構成で断続的にタイムアウトが発生しているため、テスト完了に必要なバッファを増やします。
COM相互運用機能におけるMethodTable::GetMethodDescForComInterfaceMethodメソッドの未使用パラメータfNullOkを削除しました。このパラメータは常にfalseで渡されており、関数が実際にNULLを返すことはないため、死んだコードを削除し、コード品質を向上させています。
NtQueryDirectoryFileでフィルタリング機能を実装するための準備作業です。適切にエスケープされたフィルタであれば使用できるようにしており、.と..などの特殊ディレクトリのみブロックされます。Windows ファイルシステム列挙の効率化と柔軟性向上が目的です。
Crossgen2の--out-near-inputと--single-file-compilationオプション(inputbubbleなし)使用時のメモリリークを修正。armelアーキテクチャでのピークRSS消費量が825MBから312MBに削減されました。
ILC(Intermediate Language Compiler)のジェネリック解析処理に関するドキュメントを追加するPRです。ILC開発の学習に役立つよう、ジェネリック型の解析メカニズムについての知見をまとめています。
ELF/MachO形式では読み取り専用セクション(.rodata)から.textセクションへのリロケーションがサポートされていません。このPRは、async resumption infoを生成する際に、必要に応じてこのデータを読み取り/書き込み可能なセクションに配置するよう、ilc/crossgen2を改善します。これにより、AOT(Ahead-of-Time)コンパイル時のリロケーション問題を解決します。
// MethodReadWriteDataNode.cs に新しく追加されたノード
// async resumption infoを読み取り/書き込み可能セクションに配置
このPRは、Ready2Run (R2R) コンパイル時に非共有汎用仮想メソッド (GVM) の仮想化解除(devirtualization)をサポートするためのもので、マネージ型システムに実装されています。共有GVMの仮想化解除はまだ汎用コンテキストの不足により実装されていません。NativeAOTでは、JITが太いポインタのヘルパーコール処理を改善する必要があるため、今回は非共有ケースが優先されています。
WebAssembly用RyuJIT コンパイラにおいて、関数呼び出し(calls)とヘルパー呼び出し(helper calls)の基盤実装を開始するPRです。呼び出し規約、パラメータの受け渡し、戻り値処理などのスカフォルディングコードを追加し、Wasm環境での関数呼び出しメカニズムの実装基盤を構築します。
RISC-V JIT コンパイラの emitLoadImmediate 関数における64ビットオフセット処理の修正です。32ビット表現でのオフセット計算が32ビットを超える場合に未定義動作を引き起こし、冗長な命令生成につながる問題を解決しました。現在の実装は正確性を損なっていませんが、将来の拡張時にも堅牢であることを確保します。
.editorconfig ファイルで無効な csharp_space_around_declaration_statements オプション値を修正します。有効な値は ignore と false のみですが、無効な値 do_not_ignore が使用されていました。デフォルト値は false のため、この無効な値は暗黙的に false として機能していました。
Wasm RyuJIT におけるコントロールフロー制御の不正な落下(fall-through)を修正するPR です。throw helper ブロックに対して新しい BBF_THROW_HELPER フラグを導入し、複雑なヒューリスティック検出ロジック(約60行)をシンプルなフラグチェックに置き換えました。これにより、ブロック途中からの分岐時に throw helper への不正な落下を防止します。
BlazorWebWasm テスト アセットのターゲットフレームワークを net11.0 から net10.0 に修正するバックポートブランチ向けの変更です。release/10.0 ブランチに対応させるため、テストプロジェクトの設定を正しいフレームワークバージョンに戻しています。顧客コードには影響なく、テスト インフラストラクチャのみの修正です。
ListDictionaryInternal内のNodeKeyValueCollectionクラスのCountプロパティをO(n)からO(1)に最適化しました。従来の実装では全ノードをトラバースして件数をカウントしていましたが、親リストが既に管理しているcountフィールドを直接参照するよう改善されています。
// 改善前: O(n)トラバース
public int Count
{
get
{
int count = 0;
for (DictionaryNode node = list.head; node != null; node = node.next)
count++;
return count;
}
}
// 改善後: O(1)直接参照
public int Count => list.Count;
FileInfo.MoveTo メソッドにおいて、不要な DirectoryInfo オブジェクトの割り当てを削除する最適化です。new DirectoryInfo(Path.GetDirectoryName(FullName)!).Exists を Directory.Exists(Path.GetDirectoryName(FullName)) に置き換え、同等の機能を保ちながらメモリ割り当てを削減します。
DateTimeFormatInfoScannerの内部フィールドm_dateWordsをレイジー初期化に変更するPRです。日付単語を持たないカルチャが多くある中で、不要なメモリ割り当てを避けることができます。既に初期化チェックは実装されていたため、変更は限定的です。
// 変更前:常に初期化
private List<string> m_dateWords = new();
// 変更後:遅延初期化
private List<string>? m_dateWords;
// 使用箇所で初期化
m_dateWords ??= [];
ElidedBoundsChecksテストの失敗を修正するPRです。CountDigitsメソッドがulong.Log2()を使用しており、このメソッドがハードウェア命令(x64のLzcnt、ARM64のArmBase)に依存しているため、jitstress_isas_nohwintrinsic実行時に境界チェック除外が機能せず、テストアサーションが失敗していました。対象のメソッド呼び出しをハードウェア命令の利用可能性で条件付けることで解決しています。
このPRは、CA1825ルール抑制コメントの誤った説明を修正するものです。3つのライブラリファイルで「Array.Empty<T>() doesn't exist in all configurations」という古い理由から、正確な理由である「avoid the extra generic instantiation for Array.Empty<T>()」に更新しました。これは、汎用インスタンス化のオーバーヘッドを回避する実装上の最適化が理由であることを明確にしています。
オブジェクト操作関連の未使用コードを削除するクリーンアップPRです。CoreCLRのVM層における使用されていない関数、マクロ定義、ヘッダー宣言を削除し、コードベースの保守性を向上させています。合計9ファイルで326行のコードが削除されました。
JIT コンパイラのアサーション処理をリファクタリングするゼロ差分のクリーンアップ変更です。AssertionDsc オブジェクトの生成に専用のファクトリメソッド(AssertionDsc::Create*)を導入し、AssertionDsc* ポインタを const AssertionDsc& 参照に置き換えることで、メモリセーフ性を向上させ、TP(スループット)パフォーマンスも向上させます。
// ファクトリメソッドの導入例
// 従来: 直接構築 -> optCreateAssertion() で処理
// 新規: AssertionDsc::CreateBinaryOp(...) で生成
// const参照化: AssertionDsc* param -> const AssertionDsc& param
このPRは、MethodDescCallSite機構を使用した呼び出しを、UnmanagedCallersOnly属性が指定されたメソッドへの直接ポインタ呼び出しに置き換えるリファクタリングです。逆P/Invoke呼び出しを簡潔に実装し、ランタイムのアンマネージド間境界処理を最適化します。
// UnmanagedCallersOnly を使用した呼び出しの例
[UnmanagedCallersOnly]
public static void MyNativeCallback() { }
// 従来の MethodDescCallSite 経由ではなく、
// 関数ポインタで直接呼び出し可能に
Windows環境において、スレッド初期化の非常に早い段階で未処理例外が発生した場合にCOMUnhandledExceptionFilter内でTLS(スレッドローカルストレージ)ポインタがまだ初期化されていないことに起因するクラッシュを防ぐため、Null チェックを追加しました。他のグローバル例外ハンドラーに同様のチェックが既に存在します。
ARM64プラットフォームでHFA(Homogeneous Floating-Point Aggregate)引数がスタック上で渡される場合、インタープリタのスタックスロットサイズに整列していないときにテストが失敗していた問題を修正しました。コールスタブジェネレーターが隣接する2つのスタック範囲をマージする際に、前の引数がインタープリタスタックスロットの途中で終了することを考慮していなかったのが原因です。
// スタック範囲をマージする前にインタープリタスロットサイズでの整列チェックを追加
// 例: HFA引数がスタックスロット境界を跨ぐ場合の不正なマージを防止
System.IO.PackagingのInterleavedZipPackagePartStream.Lengthプロパティに不正なDebug.Assert(CanSeek)が存在し、デバッグビルドでCanSeekがfalseの場合に失敗していた問題を修正。基盤となるZipArchiveEntry.Lengthはシークを必要としないため、このアサーションは不要でした。
// 修正内容: Debug.Assert(CanSeek) を削除
// 修正前は、CanSeekがfalseの場合にDebug.Assertが失敗していた
// 修正後は、シーク不可のストリームでもLengthプロパティが正しく動作
using (Stream stream = partEntry.GetStream(FileMode.Open))
{
long length = stream.Length; // CanSeekがfalseでも動作
}
このPRは、非同期スタックウォーキング機能を強化し、デバッグ情報を持たないAsync v2 → Async v1 thunk メソッド等の診断非表示メソッドをスキップするようにしました。これにより、スタック反復時の例外発生を回避し、デバッガに不要なフレームが露出しないようになります。
dotnet/runtimeリポジトリにJIT回帰テスト抽出用のCopilotスキルを追加するPRです。このスキルは、GitHubのIssueから単独のJIT回帰テストケースを抽出して、src/tests/JIT/Regression/JitBlue/Runtime_<issue_number>/ディレクトリに保存するプロセスを自動化します。ステップバイステップのガイダンスと実際のテスト例(Runtime_99391、Runtime_97625、Runtime_95315など)に基づいたコード規約を提供します。
LoggerMessageGeneratorが生成するC#ソースコード内のメッセージ文字列をエスケープする処理を修正しました。バックスラッシュと0x20未満の全制御文字をエスケープして、生成される文字列リテラルが正当なC#コードになるようになりました。\rと\nは名前付きエスケープシーケンスとして、その他の制御文字は\xNN形式の16進エスケープシーケンスとして出力されます。
XUnitWrapperGeneratorでSkipOnCoreClrAttributeを使用する際に、すべてのRuntimeTestModesがスキップされる場合のテスト処理を修正しました。対象となるすべてのランタイムテストモードが除外されている場合、テスト実行をスキップするロジックが追加されています。
macOS 13のキューが廃止されたため、iOS及びtvOSのデバイステスト用Helixキュー設定をmacOS 13からmacOS 15に更新するインフラストラクチャ変更です。これはCI/CDパイプラインの定義ファイルの更新であり、機能コードの変更はありません。
macOS Helix キューの参照を OSX.13 から OSX.15 に更新するメンテナンスPRです。OSX.13 キューは廃止され、既に存在しなくなったため、CI/CD パイプラインとビルドスクリプト内の古いキュー参照をすべて OSX.15 に置き換えています。
このPull Requestは、Span<T>.Contains(T) メソッドをポリフィル実装として追加するもので、古い.NETバージョンでの互換性を提供します。変更ファイルは75個にわたり、主にポリフィル実装の追加とプロジェクトファイルの構成管理が行われています。
// 新しいポリフィル実装の例
public static bool Contains<T>(this Span<T> span, T value)
where T : IEquatable<T>
{
for (int i = 0; i < span.Length; i++)
{
if (span[i].Equals(value))
return true;
}
return false;
}
Webアセンブリ(WebAssembly)ブラウザ環境でのファイナライザー実行を改善するPRです。ブラウザのイベントループ上で安全にファイナライザーを実行できるようにスケジューリング機構を再構築しました。ファイナライザースレッドの動作をブラウザのシングルスレッド環境に適応させています。
HTTP自動レスポンス展開機能に Zstandard(zstd)圧縮サポートを追加します。DecompressionMethods 列挙型に Zstandard = 0x8 を追加し、HttpClientHandler および SocketsHttpHandler が zstd エンコードされたレスポンスを自動的に展開できるようになります。既存の Brotli サポートと同じパターンに従っています。
var handler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Zstandard
};
using var client = new HttpClient(handler);
var response = await client.GetAsync("https://example.com");
DI(依存性注入)スコープ破棄時の例外処理を改善するPRです。従来は最初の例外で即座に破棄が中断されていましたが、本変更によりスコープ内のすべての一次消費可能オブジェクトを破棄した後に、複数の例外がある場合は集約例外として伝播させるようになります。これは.NET設計ガイドラインに準拠し、リソースリークを防ぎます。
// 変更前:最初の例外で破棄が停止
try { disposable1.Dispose(); } catch { throw; } // 後続の破棄が実行されない
// disposable2, disposable3...は破棄されない
// 変更後:すべて破棄してから例外を集約
try { disposable1.Dispose(); } catch(e) { exceptions.Add(e); }
try { disposable2.Dispose(); } catch(e) { exceptions.Add(e); }
// 最終的にexceptionsが複数あればAggregateExceptionを伝播
Ascii.Equalsのベクトル化において、WideningLoaderを使用する場合の最小長チェックが誤っていた問題を修正しました。従来はVector128<TLeft>.Count(16)を使用していましたが、実際の最小値はVector128<TRight>.Count(8)であるため、長さ8~15のバイト列比較がベクトル化されず、スカラー処理へ不必要にフォールバックしていました。
// 修正前: byte(Count=16)を基準に、8-15の範囲で効率化できていない
if (length < Vector128<TLeft>.Count) { /* scalar path */ }
// 修正後: ushort(Count=8)を基準に、8-15の範囲も効率的にベクトル化
if (length < Vector128<TRight>.Count) { /* vectorized path */ }
ARM64アーキテクチャにおいて、条件付きインクリメント命令(cinc/csinc)への変換が最適化されました。特に、ローカル変数と定数を比較するSELECTCCパターン(例:if (lzcnt==0) lzcnt=1;)が正しく条件付きインクリメント命令に変換されるようになりました。
public static int RuneLength(in byte value)
{
var lzcnt = (uint)BitOperations.LeadingZeroCount(~((uint)value << 24));
if (lzcnt is 0) lzcnt++; // この条件付きインクリメントがcinc命令に最適化される
return (int)lzcnt;
}
このPRはxarch上での浮動小数点→整数キャスト処理をJITの低位化フェーズに完全に移行する変更です。従来はコード生成フェーズでgenFloatToIntCastにより処理されていた一部のキャストを、すべてHWIntrinsicノードに置き換えることで、コードサイズとスループットの改善を実現しています。
// 浮動小数点→整数キャスト処理が低位化フェーズで HWIntrinsics に置き換わります
// 例: (int)(float)value -> 対応するAVX10v2/AVX512命令に置き換え
このPRは、System.Private.CoreLibコードベース内の150以上のArray.Empty<T>()呼び出しを、モダンなC# collection expression構文[]に置き換えるコード改善です。ランタイムの動作は完全に同一で、両方式とも共有されたキャッシュ済みの空配列シングルトンを返すため、実質的な機能変更はありません。
OrdinalCasing.Icu.cs内の未使用メソッドToUpperInvariantModeを削除するクリーンアップPRです。charオーバーロードとReadOnlySpan<char>拡張メソッドの2つのオーバーロードが削除されます。コードベース全体で呼び出し元が存在しないことを確認済みで、同様の機能はToUpperOrdinalメソッドで提供されています。
SpanHelpers.T.csのNonPackedIndexOfAnyInRangeUnsignedNumberメソッドにおいて、Vector512高速パスでのポインタインクリメントが誤ってVector256のカウント値を使用していた問題を修正しました。これにより、Vector512使用時の不要な重複処理が排除され、パフォーマンスが改善されます。
// 修正前:Vector512ループでVector256のカウント分だけ進む(重複処理が発生)
offset += Vector256<T>.Count;
// 修正後:Vector512ループでVector512のカウント分だけ進む(正しい処理)
offset += Vector512<T>.Count;
このPRは、フォーマット引数を持たない string.Format("message") の呼び出し239件を削除し、文字列リテラルに直します。テストコードとGCLogParserツール内の不要なメソッド呼び出しを除去する、コード品質改善PRです。
// 変更前
Assert.Fail(string.Format("Expected exception was not thrown"));
// 変更後
Assert.Fail("Expected exception was not thrown");
SPMI(SuperPMI)の差分検証キューを OSX.14.Arm64.Open から OSX.15.Arm64.Open に更新するPRです。新しいキューはより高い処理容量を提供します。
RuntimeHelpers.PrepareMethodにおいて、非同期メソッドのthunkを透過的に処理するようになりました。Reflectionで公開される非同期メソッドは通常Task返却型のthunkですが、実際のユーザーILを持つメソッドをJITコンパイルするよう改善されています。
TAR ライブラリの GetLongMetadataStream メソッドを最適化し、GNU フォーマットの TAR エントリ向けの長いメタデータストリーム生成時の不要な配列割り当てを削減しました。中間的なバッファ割り当てを排除し、単一のバイト配列に直接 UTF-8 バイトを書き込むように改善されています。
このPRは、フォーマット引数のないSR.Format(SR.SomeMessage)の呼び出しを削除し、直接SR.SomeMessageに置き換える機械的なリファクタリングです。67個の無操作(no-op)なSR.Format呼び出しを6つのライブラリにまたがって削除し、コードの明確性を向上させます。また、ComplexTypeRestrictionNotSupportedで検出された未使用の{0}プレースホルダーのバグを修正しました。
// 変更前
throw new InvalidOperationException(SR.Format(SR.SomeErrorMessage));
// 変更後
throw new InvalidOperationException(SR.SomeErrorMessage);
MemoryExtensions.csのSliceLongerSpanToMatchShorterLengthメソッドにおいて、境界チェック(bounds checks)のロジックを最適化しました。これにより、不要なチェック処理を削除し、コード効率を改善しています。