#123839 SPMI: Update superpmi-collect queues from osx13 to osx15
OSX 13 ARM64キューの容量不足に対応するため、SPMI(SuperPMI)収集スクリプトのキュー構成をOSX 13からOSX 15に更新しました。これにより、継続的なパフォーマンス測定とJIT最適化データの収集が維持されます。
dotnet/runtimeにマージされたPull RequestをAIで日本語要約
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
この月にマージされた 485 件を新しい日から順に並べています。タイトルをクリックするとその日のページの該当箇所へ移動します。Bot が作成した 53 件はタイトルのみにして、各日の最後にまとめています。
OSX 13 ARM64キューの容量不足に対応するため、SPMI(SuperPMI)収集スクリプトのキュー構成をOSX 13からOSX 15に更新しました。これにより、継続的なパフォーマンス測定とJIT最適化データの収集が維持されます。
LINQ の Append と Prepend メソッドの GetCount 最適化において、int.MaxValue 要素を持つシーケンスをカウントする際にサイレント整数オーバーフローが発生し、負の値を返していた問題を修正しました。修正により、Concat と同様に OverflowException をスローするようになります。
var source = Enumerable.Repeat(0, int.MaxValue);
var appended = source.Append(1);
appended.Count(); // 修正前: -2147483648 → 修正後: OverflowException
ARM32 JIT の dump/disasm でAsync Resume Info への参照を処理する際のアサーション失敗を修正するパッチです。IF_T2_N2 命令フォーマットがブロックアドレステーブルと Async Resume Info の両方に使用されていますが、ダンプロジックがブロックアドレステーブルのみを想定していたことが原因です。出力形式のみに影響し、コード生成には影響ありません。
GetThreadStaticsBaseがReadyToRun(R2R)コンパイルをバイパスしていたため、iOS環境(composite-r2r + interpreter fallback)でスレッド静的フィールドアクセスが35倍遅くなる問題を修正しました。新しいJITヘルパーCORINFO_HELP_GETDIRECTONTHREADLOCALDATA_NONGCTHREADSTATIC_BASEを追加し、スレッドローカルストレージ内のpThreadフィールドへの直接アクセスを提供することで、R2R編集を有効化しました。
// 改善効果の例:スレッド静的フィールドアクセス
[ThreadStatic]
private static int value;
public static int GetValue() => value; // R2R化により高速化
JIT コンパイラの throw helper 処理フローを再設計しました。従来は fgAddCodeRef を通じて throw helper 需要を事前に予測していましたが、Wasm など null check が明示的であるターゲットではこの手法が適さないため、throw helper の需要判定と生成を stack level setting フェーズ中に一元化しました。これにより、デバッグ不可能なコードでは共通 throw helper のセットを最小化します。
ホストからプロパティを取得する際に、実際に書き込まれたプロパティ長より大きい文字列長が返される問題を修正しました。バッファを実際の書き込み長でクローズすることで、正確な文字列長を確保します。
テスト除外設定を集中型の issues.targets (3,447行) から、インライン [ActiveIssue] 属性へマイグレーション。1,201個のテスト除外をテストソースコード内に移動し、可読性と保守性を向上。issues.targets は99.7%削減(3,447→9行)。
// マイグレーション例
[ActiveIssue("https://github.com/dotnet/runtime/issues/76041", TestPlatforms.Any)]
[Fact]
public static int TestEntryPoint() { }
RangeOps::ShiftRight の範囲計算バグを修正しました。右シフト演算で範囲の上下限を入れ替える必要があったミスを解決しています。例えば [0..65535] >> [0..31] の計算結果が [0 >> 31 .. 65535 >> 0] となるべきところが [0 >> 0 .. 65535 >> 31] で計算されていたことを修正しました。
OneLocBuild(ローカライゼーション処理)の実行スケジュールを変更するPRです。前回のPR #123539で両方のビルドを定期実行のみに変更していましたが、OneLoc チームからの要望により、OneLocBuild を毎回のメインコミット時に実行するように戻しました。一方、SourceIndex は引き続き日次スケジュール実行のままです。
GitHub リソース管理ポリシー内で、area-vm-coreclr ラベルの担当者を mangod9 から agocke に変更するメンテナンス更新です。このPRは GitHubの自動ラベリングおよび通知システムの設定変更のみで、.NET ランタイムのコード変更は含まれていません。
iOS などの非 JIT プラットフォームで R2R 仮想ディスパッチが毎回 ExternalMethodFixupWorker にフォールバックし、署名解析に 18% の時間を消費していた問題を修正。キャッシュされたインターフェースディスパッチをデフォルトで有効化することで、200x の性能低下を解決します。
// Crossgen2RootCommand.cs での変更
public Option<bool?> EnableCachedInterfaceDispatchSupport { get; } =
new("--enable-cached-interface-dispatch-support", "--CID") { ... };
// Program.cs での条件付きデフォルト適用
nodeFactoryFlags.EnableCachedInterfaceDispatchSupport =
Get(_command.EnableCachedInterfaceDispatchSupport) ??
!typeSystemContext.TargetAllowsRuntimeCodeGeneration;
ILアセンブラ(ilasm)の機能拡張PRで、.param/.propertyのデフォルト値(initOpt)、VTableフィックスアップ、型フォワーダー、汎用パラメータの出力などをサポートしました。IL言語の仕様により準拠した実装となり、より複雑なアセンブリメタデータの生成が可能になります。
NativeAOTでの例外スタックトレース表示の不具合を修正するPRです。従来はthrow;で例外を再スローした際に、元のthrow new Exceptionの位置を上書きしてしまう問題がありました。本修正により、CoreCLRと同様に元のスロー位置を保持するようになります。
// 修正前: スタックトレースに "throw" と表示される
// 修正後: スタックトレースに "throw new Exception" と表示される
try
{
throw new Exception("test");
}
catch
{
throw; // ← ここが上書きされていた
}
FileStream コンストラクタから isAsync パラメータの検証ロジックを削除し、ハンドルの実際の非同期状態を常に使用するように変更しました。これまでユーザー指定の isAsync が SafeFileHandle.IsAsync と一致しない場合は ArgumentException がスローされていましたが、今後はハンドルの状態を優先します。isAsync パラメータはAPI互換性のため残されますが機能的には無視されます。
// 以前: ArgumentException をスロー
var asyncHandle = new SafeFileHandle(..., isAsync: true);
var fs = new FileStream(asyncHandle, FileAccess.ReadWrite, 4096, isAsync: false);
// 現在: 成功 - fs.IsAsync == true(パラメータではなくハンドルから)
AddHostedService 拡張メソッドのXML ドキュメンテーションを更新し、これらのメソッドが DI コンテナに IHostedService としてのみ登録され、具体的な型そのものは登録されないことを明確化しました。開発者が具体型も登録されると期待していた混乱(Issue #53831)を解決するものです。
System.ConsoleのTermInfo printf形式解析をシンプル化するPull Requestです。手動のスキャンループをIndexOfAnyに置き換えることで、フォーマット終端文字(d/o/x/X/s)を検索する処理をより簡潔に実装しました。
// 変更前の処理をIndexOfAnyで置き換え
// 例: format.AsSpan(pos).IndexOfAny("doxXs")を使用
IdnMapping に Span ベースの API (TryGetAscii/TryGetUnicode) を追加し、国際化ドメイン名の変換時にメモリアロケーションを回避できるようにしました。新しいメソッドは無効入力時に例外をスロー、宛先バッファ不足時のみ false を返します。
public sealed class IdnMapping
{
public bool TryGetAscii(ReadOnlySpan<char> unicode, Span<char> destination, out int charsWritten);
public bool TryGetUnicode(ReadOnlySpan<char> ascii, Span<char> destination, out int charsWritten);
}
JITコンパイラの範囲解析におけるビット演算AND(RangeOps::And)のバグを修正しました。負の下限を持つ広い範囲のオペランドがある場合、不正な範囲推定が行われ、Release buildで間違った最適化判定が発生していました。
// 修正前:Release buildで誤った最適化が発生
if (35009 > (1264240267 & (sbyte)(-s_4))) // 本来falseなのにtrueと判定された
{
System.Console.WriteLine(1UL);
}
NextCallReturnAddress intrinsic は tail-call helper 関数内でのみ使用されます。一部の interpreter モードでこの tail-call helper の interpretation が試みられると問題が発生するため、compilation を スキップするようにしました。これにより、不要な compilation 処理を削減し、interpreter モードでの安定性を向上させます。
プロセスの標準出力・標準エラー・標準入力を効率的に破棄するための新しい File.OpenNullHandle() API を追加します。従来は出力データを読み込んで無視する非効率な方法が必要でしたが、本APIにより null デバイスへのハンドルを直接取得できます。
// 新しい効率的なパターン
using SafeFileHandle nullHandle = File.OpenNullHandle();
process.StartInfo.StandardOutput = nullHandle;
process.StartInfo.StandardError = nullHandle;
Monoのスタックウォーク時に、非同期シグナルセーフモードで読み込まれたMonoJitInfoに対してmono_jit_info_get_methodを呼び出すとアサーション失敗が発生する問題を修正しました。AOT メソッドのMonoJitInfoがシグナルハンドラから呼び出された際にロードされると、asyncフラグが立てられ、このフラグが立った状態でメソッドアクセスを試みるとデッドロックのリスクがあります。本修正では、メソッドアクセス前にasyncフラグをチェックして安全に処理できるようにしました。
// 修正前の危険な呼び出し
mono_jit_info_get_method(ji); // ji->async == true の場合、アサーション失敗
// 修正後の安全な呼び出し
if (ji && !ji->async) {
mono_jit_info_get_method(ji);
}
legacy XUnitWrapper テスト基盤の削除を行うPRです。新しいテストシステムへの完全移行に伴い、古いXUnitWrapper ロジックをテストビルドシステムとHelix パブリッシングから削除します。BuildAllTestsAsStandalone=true シナリオの互換性維持のため、基本的なローカルテストランナーを新たに追加しています。
JIT コンパイラから CHK_FLOW_UPDATE ストレスモードを削除し、fgDebugCheckUpdate() 関数がすべてのデバッグビルドで無条件に実行されるようにしました。これにより、開発時のフロー グラフ検証カバレッジが向上します。
JIT のオブジェクトスタック割り当て時に、ローカル構造体の格納操作が GT_COMMA ノードの値側で実行される場合、祖先型伝播により GT_COMMA が誤って再型付けされ、その変更が格納操作にまでカスケード伝播して不正なIRが生成されるバグを修正しました。修正方法は、ローカル構造体の格納ノード訪問時に祖先型伝播をスキップすることです。
GitHub Copilot Chat用のプロンプト設定ファイルにおいて、非推奨なツール名を名前空間付きの現在のツール名に更新しました。また、JIT-EE APIプロンプトにedit/editFilesツールを追加しています。この変更により、VS Code Copilot Chatでのツール認識が正常に機能するようになります。
src/tests/tracing/userevents/ ディレクトリ配下のテストを無効化するPRです。Directory.Build.props に CLRTestTargetUnsupported を true に設定することで、userevents トレーシング関連のテストの実行をスキップします。これらのテストは間欠的にトレースファイル内の .NET イベントキャプチャに失敗するため、issue #123442 によって無効化されました。
Windows ARM64プラットフォーム上でC++コンパイラのバグに対応するため、InterpCompiler::EmitStaticFieldAddress関数の最適化を無効化するワークアラウンドを実装しました。このバグはVisual Studio Developer Communityで報告されており、関数の最適化時にnoreturn属性の処理に関する問題が発生します。
Windows ARM64 InterpreterStubにおいて、ThreadContextが未設定の場合にx19レジスタ(IR bytecode address)が初期化される前に条件分岐が発生していたバグを修正しました。GetInterpThreadContextWithPossiblyMissingThreadOrCallStubへのジャンプ前にx19を確実に設定するよう、アセンブリ命令の順序を変更しています。
System.__ComObjectのCOM相互運用型キャストにおいて、動的インターフェースマップの処理に関する前回の修正(#112375)が不十分だったため、より包括的な検証とテストを追加しました。特にMethodTable::HasDynamicInterfaceMap()ロジックの改善と、動的インターフェースマップの用途に関する説明コメントが追加されています。
このドラフトPRは、Helix ランナー上での SPMI ベンチマーク収集における .NET SDK インストールを、セットアップフェーズから実行フェーズに移行させています。目的は NuGet キャッシュの場所を設定し、Helix マシンの限定的な OS ディスク容量を消費しないようにすることです。
Native AOT (Ahead-Of-Time) コンパイル実行時にテストが失敗するケースに対応するため、既存テストにスキップ条件を追加し、テストインフラストラクチャを拡張するPRです。NativeAOT環境での実行差異に対応するため、JITアウターループテストおよびUTF8文字列マーシャリングテストを条件付きでスキップするようにしました。
ReadyToRun/prejit生成時の非決定的Intrinsicsをブロックする際に、より適切なJIT失敗コード CORJIT_R2R_UNSUPPORTED を導入するPRです。従来の CORJIT_IMPLLIMITATION の代わりに専用のエラーコードを使用することで、x86 crossgen環境でのSPMI(SuperPMI)の失敗を解決します。これにより、JIT、VM、ツール(SuperPMI、managed JitInterface)全体で一貫性のある処理が実現されます。
WebAssemblyビルドのCMake設定フェーズを大幅に高速化するPRです。294個の機能検出結果をキャッシュすることで、CMake設定時間を約2-3分から10-20秒に短縮(86%削減)しました。Emscripten 3.1.56に特化したキャッシュファイルで、クロスコンパイル時の重複した機能検出を排除しています。
SVE (Scalable Vector Extension) intrinsics のサポートにおいて、FFR (First-Fault Register) レジスタの per-method 保存状態管理が interpreter で実装されていないため、interpreter が有効な場合に SVE intrinsics を無効化する変更です。これにより、interpreter 使用時のランタイムエラーを防止します。
非暗号化ハッシュアルゴリズムの実装に対して、空のデータ(空のspan)の追記がハッシュ結果に影響を与えないことを検証するテストを追加します。NonCryptoHashTestDriver基底クラスにAppendingEmptyHasNoEffect()テストメソッドを追加することで、CRC32、CRC64、XxHash32、XxHash64など全ての実装に自動的に適用されます。
[Fact]
public void AppendingEmptyHasNoEffect()
{
NonCryptographicHashAlgorithm reference = CreateInstance();
reference.Append(new byte[] { 1, 2, 3 });
byte[] expected = reference.GetCurrentHash();
NonCryptographicHashAlgorithm hash = CreateInstance();
hash.Append(ReadOnlySpan<byte>.Empty);
hash.Append(new byte[] { 1, 2, 3 });
hash.Append(ReadOnlySpan<byte>.Empty);
byte[] actual = hash.GetCurrentHash();
Assert.Equal(expected, actual);
}
PRs #108942 と #108414 で導入された TRACE_MULTICAST_DELEGATE_HELPER と TRACE_EXTERNAL_METHOD_FIXUP トレース型が NULL アドレスを設定していたため、デバッガーの IsTailCall 関数で NULL ポインター参照例外が発生していました。本PRでは IsTailCall 関数で trace.GetAddress() が NULL かどうかをチェックしてから GetNativeCodeMethodDesc() を呼び出すよう修正しました。
// 修正後の実装概要
MethodDesc* pTargetMD = NULL;
if (trace.GetTraceType() == TRACE_UNJITTED_METHOD)
{
pTargetMD = trace.GetMethodDesc();
}
else if (trace.GetAddress() != (PCODE)NULL)
{
pTargetMD = g_pEEInterface->GetNativeCodeMethodDesc(trace.GetAddress());
}
このPRは、JITコンパイラのRange Analysis(範囲解析)と検証命題の伝播を強化し、関係演算子の比較結果をより正確に認識できるようにします。比較式が常に真([1..1])または常に偽([0..0])であることを判定でき、より多くの分岐の最適化が可能になります。
キー改善:
このPRはメンテナンス要求に基づいて、dotnet/runtimeリポジトリからmarek-safarを全てのコードオーナー設定から削除するものです。併せてILLinkのコード所有権構造を統合し、sbomerへの一元化を実施しました。機能的なコード変更はなく、純粋な設定ファイルの更新です。
WebAssemblyランタイムで、JavaScriptから C#へのTask<T>マーシャリング時に型アサーション失敗がランタイムクラッシュを引き起こしていた問題を修正しました。クラッシュの代わりに、アサーション失敗を Task の Exception として C# 側に伝播させるよう改善しています。
// 修正前:型アサーション失敗でランタイムクラッシュ
// 修正後:例外をTaskの結果として返却
try
{
var result = await JavaScriptRuntime.InvokeAsync<int>("getInvalidValue");
}
catch (Exception ex)
{
// アサーション失敗が例外として捕捉可能に
Console.WriteLine($"Assertion failed: {ex.Message}");
}
WebAssembly/ブラウザ向けビルドでスタックトレースのファイル情報(ファイル名、行番号、列番号)収集を無効化する機能スイッチを追加しました。System.Diagnostics.StackTrace.IsLineNumberSupportedフィーチャースイッチを導入し、WASM Release ビルドではデフォルトで無効化されます。これにより、hello worldアプリケーションから214KBの未圧縮IL削減が実現されます。
WebAssemblyのRyuJITで明示的なnullチェックと例外ヘルパー呼び出しのインフラストラクチャを整備するPRです。Wasmではnullチェックが明示的であり、OSのページフォルト機構に依存できないため、例外をヘルパー呼び出し経由で発生させる必要があります。
// GT_NULLCHECKノードの例
// Wasmではアドレス参照前に明示的なnullチェックが必須
genCodeForNullCheck(treeNode); // 新規実装
OneFuzz デプロイメントパイプラインに .NET 9.0 SDK のインストールステップを追加しました。vs2026preview イメージへの更新後、デプロイメントが失敗していた問題を解決します。winget を使用して .NET 9.0 をインストールする処理を追加しています。
PR #123307で導入された回帰バグを修正するために、JIT ヘルパーのアンワインド計画に関する変更をリバートします。複数のアーキテクチャ(ARM64、LoongArch64、RISC-V64)で CPU コンテキスト操作の不具合によるランタイムクラッシュが頻発していた問題を解決します。リバートにより、OSR パッチポイント遷移をTransitionBlockベースの構築から、キャプチャ/アンワンドされたコンテキストを使用する方式に戻します。
Blazor WebAssemblyのテストアセットソリューション定義から、誤って追加されたwasmプラットフォーム設定を削除するPull Request です。この変更により、ソリューションは標準的なCPUプラットフォームのみに統一されます。
SuperPMI の allocMem 関数で、ポインタのアライメント調整後に十分なメモリ空間を確保するための修正です。従来の単純なサイズ切り上げでは、アライメント調整時にメモリ不足が発生する可能性がありました。ホットコードバッファと読み取り専用データバッファの割り当て時に、アライメント前に追加パディングを確保することで、この問題を解決しています。
// 修正前:サイズを切り上げるだけ
size = ALIGN_UP(size, alignment);
// ポインタのアライメント調整時にメモリ不足の可能性
// 修正後:アライメント調整に必要な余裕を追加
size = ALIGN_UP(size, alignment) + (alignment - 1);
// アライメント後も十分なスペースを確保
PR #123307で導入された「新しいアンワインド計画」のJITヘルパー関連の変更をリバートするPRです。複数のアーキテクチャ(ARM64、LoongArch64、RISC-V64)のClrRestoreNonvolatileContextWorker実装を削除し、AMD64のみに制限。JITパッチポイントのコンテキストキャプチャをRtlCaptureContext経由の仮想アンワインドに変更し、プロローグ/エピローグメカニズムの簡素化を実施します。
PR #122116で行われたTextInfo.cs内のunsafe使用量削減を改めて元に戻すリバートです。NativeAOT(Native Ahead-of-Time)バイナリサイズが回帰(~1.5MB → 1.551MB)し、サイズテストが失敗しているため、この問題(#123667)を調査するために実施されました。
COM相互運用のCOMバリアント配列マーシャリング処理で、GC実行中のメモリ移動によるクラッシュを修正しました。PR #121362でBSTR配列マーシャリングがマネージドコードを呼び出すように変更されたことで、予期しないGC遷移が発生し、内部ポインタが無効化される問題が生じていました。GCPROTECT_BEGININTERIORを使用して配列内部ポインタを保護することで、GCによる配列の移動時にポインタを自動更新できるようになりました。
// 使用例:GCPROTECT_BEGININTERIOR でマネージド配列への内部ポインタを保護
GCPROTECT_BEGININTERIOR(pData); // GC保護開始
// GCトリガーの可能性がある処理
ManagedCall(); // マネージドコード呼び出し可
GCPROTECT_ENDINTERIOR(); // GC保護終了
Windows API CreateFile の P/Invoke 宣言における型定義の誤りを修正しました。セキュリティ属性(Atts)とテンプレートファイルハンドル(Template)パラメータは、ネイティブ側ではポインタ型ですが、マネージドコード側で int として宣言されていました。これを nint(ポインタサイズの整数型)に修正することで、64ビットシステムでの正しい相互運用を実現します。
// 修正前:ポインタを32ビット整数で宣言
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, int lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, int hTemplateFile);
// 修正後:ポインタをnintで宣言
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, nint lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, nint hTemplateFile);
JIT の Guarded Devirtualization (GDV) で AsyncContinuation 引数を含むメソッドが Tiered PGO + Delegate/VTable プロファイリング有効時にアサーション失敗する問題を修正しました。isCompatibleMethodGDV の互換性チェックに WellKnownArg::AsyncContinuation を追加し、コンパイラが挿入する引数として IL シグネチャに含まれない引数として扱うようにしています。
// 修正前: AsyncContinuation がスイッチケースに未対応
// 修正後: RetBuffer, ThisPointer と同様に扱う
case WellKnownArg::AsyncContinuation:
// Not part of signature but we still expect to see it here
continue;
Configuration Binder の source generator において、ネストされた positional record 内で IEnumerable<T> をバインドする際に InvalidOperationException が誤って発生していた問題を修正しました。コード生成ロジックが ArraySpec 型のみをチェックしていたため、IEnumerable<T> 型には対応していませんでした。
// 修正対象: ネストされた positional record with IEnumerable<T>
public record NestedWithIEnumerable(IEnumerable<string> Items);
public record ContainingIEnumerable(NestedWithIEnumerable Nested);
Android上でDriveInfoが/procを使用してドライブフォーマット情報を取得するように対応しました。これにより、Android環境でのドライブ情報取得の完全性が向上します。
// DriveInfo のドライブフォーマット取得時に /proc を参照
// Android 環境でも正常に動作するように改善
ファジング用コードカバレッジ収集スクリプトを改善し、グローバルな dotnet SDK の代わりにローカル SDK を使用するように変更しました。これにより、特殊なセットアップ環境(Helix キュー等)でもファジング機能が正常に動作します。また、ビルド時に既にローカルツールがインストールされているため、グローバルツールの使用を削除しました。
// 変更例: グローバルツールの参照をローカルツールに変更
// Before: dotnet tool run <tool-name>
// After: ./bin/dotnet tool run <tool-name>
macOS が System.Security.Cryptography.Native.OpenSSL のビルドを廃止し、Apple 固有の実装(System.Security.Cryptography.Native.Apple)に移行したため、opensslshim.c から Apple 関連の条件付きコンパイルコードを削除するクリーンアップです。これにより、コードベースから不要な Apple 固有の処理(DYLIBNAME_PREFIX/DYLIBNAME_SUFFIX など)が除去されます。
.NET ランタイムのホストポリシーにおいて、サービング ディレクトリ(deps.json追加ファイルの配置先)が存在する場合の不要なファイル存在チェックを削減するパフォーマンス最適化です。これまでサービング ディレクトリの存在だけで全ファイルのグローバルチェックが有効化されていましたが、サービング ディレクトリのプローブ時のみに限定することで、起動時のI/O操作を大幅に削減します。
新しい例外処理(EH)実装において、funclet(finally/catch ブロックなど)を含むメソッドのプロファイラー通知が重複して報告されていた問題を修正しました。修正前は親メソッドとその各funcletに対して重複した enter/leave 通知が送信されていましたが、修正後は旧EH動作と同様に各メソッドごとに1回のみ報告されるようになります。
NativeAOT ビルドで Assembly.Location が空文字列を返すため、tracing/userevents テストが ArgumentNullException でクラッシュしていた問題を修正。AppContext.BaseDirectory を使用したディレクトリベースの NativeAOT 検出に切り替え、API を簡素化。修正後、テストは record-trace の NativeAOT 制限により期待通り失敗するため、NativeAotIncompatible としてマーク。
WebAssembly AOT ビルド時の llvm-size コマンドのコマンドラインの長さ制限(Windows Server 2016 以前では 8191 文字)を回避するため、オブジェクトファイル引数をレスポンスファイルに移行した変更です。オブジェクトファイルリストを別ファイルに書き出し、@ファイルパス 構文で llvm-size に渡すことで、長いコマンドラインの問題を解決します。
Guid.NewGuid()のLinuxでのパフォーマンスを約10倍高速化する最適化を実施しました。getrandom()syscallの活用(14%高速化)と、スレッドローカルストレージでのGUID一括キャッシング(Random.Sharedと同様の手法)により、614.2nsから61.16nsへ改善しています。
// 従来: 1回のGuid生成ごとに1回のsyscall
var guid = Guid.NewGuid(); // 614.2 ns
// 最適化後: 64個のGUIDを一括キャッシュして使用
// 内部的にキャッシュから取得するため大幅高速化
var guid = Guid.NewGuid(); // 61.16 ns (~10x faster)
JITのテールコール時に使用されていたBBF_GC_SAFE_POINTフラグの検証アサーションを削除する変更です。このフラグは最新状態に保たれていないため、信頼できないアサーションを削除しました。特にテールマージ最適化がGC安全点を持たない新しいブロックを作成する場合に偽の失敗が発生していました。
iOS等の動的コード生成が利用できない環境で、配列ソート性能を最適化するPull Requestです。GenericArraySortHelper<T>がリフレクションで動的にインスタンス化される際にR2Rコンパイル対象外となっていた問題を修正し、IsDynamicCodeCompiledフラグをチェックして非最適化バージョンにフォールバックさせることで、List<int>.Sort()の性能を60倍改善しています。
// 修正例:IsDynamicCodeCompiled チェックを追加
if (RuntimeFeature.IsDynamicCodeCompiled)
{
// リフレクションベースの特化したヘルパーを使用
return RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter(...);
}
else
{
// AOT環境では非最適化版を使用
return new ArraySortHelper<T>();
}
BlazorWebWasm ソリューションファイルを旧形式から新形式(.slnx)に変換しました。この変更は PR #115818 の後続として実施されたもので、Visual Studio のモダンなソリューションファイル形式への移行を目的としています。
ExtendedLayout テストスイートを IL から C# へ移行するPRです。C# コンパイラが ExtendedLayoutAttribute をサポートするようになったため、CStruct と CUnion の型定義を C# で定義できるようになりました。可能な限り C# へ移行し、StructLayout と ExtendedLayout の両方の属性が必要な型や無効な型テストのみ IL に残しました。
[ExtendedLayout(ExtendedLayoutKind.CUnion)]
public struct CUnionMixedSizes
{
public byte byteField;
public long longField;
}
CoreCLR インタプリタにおいて、tailcall コンテキスト内で呼び出される IL ヘルパーメソッドが誤って tailcall として扱われるバグを修正しました。ヘルパー IL メソッド呼び出し時に isTailcall フラグを false にリセットすることで、ヘルパー呼び出しが不正に tailcall 最適化されるのを防ぎます。WASM 上の複数のランタイムテストを修正します。
C# ilasm(IL アセンブラ)にラベル検証とtypedef 解決機能を実装しました。命令トークンを文法に統合してレキサー優先度を確立し、ラベルの未定義参照を検出してエラー報告します。メソッド本体の回復可能なエラーでもアセンブリ生成を継続できるよう改善しました。
// ラベル検証の例
// 未定義ラベルへのジャンプはエラーとして報告
br undefined_label // Error: Label 'undefined_label' is not defined
非推奨となったwmicコマンドを廃止し、MSBuildのネイティブなパラレリズムプロパティに置き換えるビルドスクリプト修正です。新しいWindowsビルドでの互換性問題を解決します。
// 変更前(wmic使用)
for /f %%A in ('wmic cpu get NumberOfCores ^| findstr [0-9]') do set NumberOfCores=%%A
set CL_MPCount=%NumberOfCores%
// 変更後(MSBuildプロパティ使用)
set UseMultiToolTask=true
set EnforceProcessCountAcrossBuilds=true
set EnableClServerMode=true
OpenSUSE コンテナ参照を 15.6 から 16.0 に更新し、Helix パイプライン設定を新しい OpenSUSE リリースに対応させるインフラストラクチャ変更です。また OpenSUSE 16.0 との互換性を確保するために、プラットフォーム検出とテストのスキップ処理、IDNA テストデータの更新を含みます。
RISC-V JITコンパイラにおいて、Common Subexpression Elimination(CSE)による最適化がアドレッシングモードノードを変換してしまい、Zba拡張のsh1/2/3add(.uw)命令の生成を妨げていた問題を修正しました。CSEの対象外フラグを設定することで、効率的なシングル命令での実装が可能になりました。
改善例:
// 修正前: slli.uw + add (2命令)
// slli.uw a2, a1, 3
// add a3, s2, a2
// 修正後: sh3add.uw (1命令)
// sh3add.uw a2, a1, s2
BaseConfigurationRecord.NormalizeConfigSourceメソッド内の文字列検索処理を最適化しました。2つの個別のIndexOf呼び出しを、単一のIndexOfAny呼び出しに置き換えることで、パス区切り文字(\または/)の検出を効率化しています。
// 変更前
int index1 = configSource.IndexOf('\\');
int index2 = configSource.IndexOf('/');
// 変更後
int index = configSource.AsSpan().IndexOfAny('\\', '/');
Windows環境で管理者権限なしで実行される場合、X509 PKCS#12ローダーテストの一部をスキップするように修正しました。機械キーストア操作が必要なテストケースが権限不足で失敗するのを防ぎます。
Wasm RyuJitのレジスタホーミング処理を改善したPRです。フレームポインタレジスタの割り当てを、ローカル変数のスタック格納時に動的に割り当てる方式から、候補識別フェーズで事前割り当てする方式に変更しました。これにより、レジスタが必要な時点で確実に利用可能になります。
ByRef フィールドと byref-like ジェネリクス機能に関するドキュメントに参照リンクを追加し、説明の明確化と具体例の追加を行いました。C# 言語仕様への提案リンク、roslyn issue への参照、および実装済み機能の具体的な使用例を文書に統合し、機能の現在の状態を明確に示しています。
TensorPrimitivesのBitIncrementとBitDecrement操作をfloatおよびdouble型向けにSIMD対応させました。ブランチフリーの実装により、ConditionalSelectを最小限(2回)に抑えた効率的なベクトル化を実現しています。特殊値(NaN、±Infinity、±0.0)の処理をビット演算で統合し、コード行数を56%削減しました。
// BitIncrement: float型の例
Vector128<float> xFloat = x.AsSingle();
Vector128<uint> bits = xFloat.AsUInt32();
Vector128<uint> isNegative = Vector128.Equals(bits & Vector128.Create(0x8000_0000u), Vector128.Create(0x8000_0000u));
Vector128<uint> result = Vector128.ConditionalSelect(isNegative, bits - Vector128<uint>.One, bits + Vector128<uint>.One);
ARM32でのGCヒジャッキング時に、非同期継続レジスタ(r2)を正しく保持するようにする修正です。従来はr0とr1のみを保存していましたが、ARM32の非同期呼び出し規約ではr2が継続値を返すため、GC中にr2が失われるとコードの不正な動作につながります。フラグ定義を追加し、プローブフレームでr0-r2を保存・復元するように修正しました。
このPRは、crossgen2のWebAssemblyオブジェクトライターにテスト用WASMモジュール生成に必要な機能を追加します。具体的には、ランタイムスタック用のデータセクションオフセット(0x10000/64KB)、テーブルセクション、そして.NETメソッドシグネチャからWASM型シグネチャへの変換ロジックを実装しています。
// WASM型シグネチャ生成の例
// .NET型 -> WASM型への対応付け
public void GenerateTypeSignature(MethodDesc method)
{
// メソッドのパラメータと戻り値を WASM value types に変換
}
内部検証パイプラインの障害を修正するPRです。Helixキューの構成調整とプライベートNuGetフィード認証のサポート追加により、クロスプラットフォームビルドの信頼性を向上させます。主な変更としてAndroidキュー選択ロジックをUbuntuベースに統一し、iOS/tvOS/Android/Browser WASMプラットフォームでパブリック/インターナルキューの区別を実装しています。
STJ(System.Text.Json)のソースジェネレーターが、複数の部分的なクラス宣言に分割されたJsonSerializerContextで各宣言に[JsonSerializable]属性がある場合に失敗する問題を修正します。根本原因は、ForAttributeWithMetadataNameが各部分宣言ごとにトリガーされる一方、GetAttributes()がすべての部分宣言の属性を返すため、同じ名前のコード生成が重複することでした。
// ファイル1.cs
[JsonSerializable(typeof(MyClass1))]
internal partial class SerializerContext : JsonSerializerContext { }
// ファイル2.cs
[JsonSerializable(typeof(MyClass2))]
internal partial class SerializerContext { }
allocMem APIを再設計し、固定的なホット/コールド/読み取り専用データブロックから、任意数のデータチャンクを割り当てられる柔軟な構造へ変更しました。これにより ILC がテキストセクションへのリロケーション対応セクションに非同期再開情報チャンクを配置可能になり、複数関数間での読み取り専用データ共有もサポートします。
// 変更前: 固定フィールド
struct AllocMemArgs {
void* hotCodeBlock;
void* coldCodeBlock;
void* roDataBlock;
};
// 変更後: 柔軟なチャンク配列
struct AllocMemChunk {
void* ptr;
size_t size;
CorJitAllocMemFlag flags; // HOT_CODE, COLD_CODE, READONLY_DATA, HAS_POINTERS_TO_CODE
};
スレッドプールの優先度交替メカニズムのバグを修正しました。_dispatchNormalPriorityWorkFirstフラグの切り替えが条件付きブロック内でのみ実行されていたため、優先度の適切な交替が行われず、通常優先度の作業アイテムが飢餓状態に陥る可能性がありました。フラグの切り替えを条件付きブロックの外に移動し、DequeueWithPriorityAlternationの呼び出しごとに確実に実行されるようにしました。
正規表現コンパイラに、ソースジェネレータから交互分岐最適化をポートしました。各分岐が異なる文字で始まる交互分岐に対して、C#スイッチ文をILレベルで発行する最適化です。Roslyn の휴리스틱(要素数 >= 7 かつ密度 >= 0.5)を使用して、パフォーマンスが向上する場合にのみ適用されます。
// 最適化前: 複数のif-elseで分岐
// 最適化後: IL switch で高速な分岐
if (input[pos] == 'a') { /* branch A */ }
else if (input[pos] == 'b') { /* branch B */ }
else if (input[pos] == 'c') { /* branch C */ }
// ... IL switch で効率的に実装
このPRはcopilot-instructions.mdのコンパイルとテスト要件を厳格化し、ビルドプロセスをより決定論的にするものです。コンパイル/テスト要件を"SHOULD"から"MUST"に昇格させ、コメント変更のみの例外を削除しました。またSystem.Private.CoreLibの再構築設定を-rc releaseから-rc checkedに修正しています。
JITの定数折畳最適化(gtFoldExprHWIntrinsic)でマスク型と定数ゼロのAND演算が誤って折畳まれ、ゼロではなくマスク値を返していたバグを修正しました。.NET 10.0での回帰です。
// 期待値: <0, 0, 0, ...> バグ時の実際: <-1, -1, -1, ...>
Vector512.Equals(v, v) & Vector512.LessThan(v.AsUInt32(), Vector512<uint>.Zero).AsInt32();
DateTime.ParseExactに関するテストカバレッジを拡充するPRです。特にDateTimeStylesパラメータのカバレッジが不足していた部分を補填しています。新たに9つのテストケースを追加し、無効なスタイル組み合わせの検証も強化されています。
ConcurrentDictionary.GetOrAdd と AddOrUpdate メソッドのテストにおいて、コールバックデリゲートの引数が正しく渡されることを検証するアサーションを追加しました。従来のテストではラムダ式が引数を使用しないか検証なしで使用していたため、引数渡しのバグを検出できませんでした。本変更により、各コールバック内で明示的なアサーションを追加し、期待値が正しく渡されることを確認します。
// GetOrAdd の例
dict.GetOrAdd(j, x =>
{
Assert.Equal(j, x);
return -x;
});
JIT の範囲チェック省略(Bounds Check Elision)を検証する FileCheck ベースのリグレッション テストを追加しました。マスキング、シフト、文字列長比較、ulong.Log2() などのパターンで、JIT が安全にインデックスアクセスをプルーフでき、CORINFO_HELP_RNGCHKFAIL 呼び出しが完全に削除されることを確認します。
[MethodImpl(MethodImplOptions.NoInlining)]
static byte AndByLength(int i)
{
// X64-NOT: CORINFO_HELP_RNGCHKFAIL
ReadOnlySpan<byte> span = new byte[] { 1, 2, 3, 4 };
return span[i & (span.Length - 1)]; // マスキングで0-3に制限
}
ComEventMethodsクラスで、オーバーアロケーションを伴うListベースの実装から改善されたArray.FindAllへ切り替え、コード量削減とメモリ効率の向上を実現します。
// 変更前: List でオーバーアロケーション
// 変更後: Array.FindAll で効率的に配列フィルタリング
var methods = Array.FindAll(methodsArray, predicate);
WebAssemblyのJIT コードジェネレーションにおいて、ローカル変数がスタックに配置されない場合、パラメータのホーミング処理をスキップするように最適化しました。スタックポインタレジスタが設定されていない(REG_NA)フレームレス状態では、不要なパラメータのホーミング処理を回避します。
// genHomeRegisterParams内での防御的チェック
if (GetStackPointerReg() == REG_NA)
{
// スタックポインタが設定されていない場合はホーミングをスキップ
return;
}
このPRはJITコンパイラの範囲分析を強化し、PHI定義の到達可能性を分析できるようにします。GetRangeFromAssertionsがPHIノードを再帰的に分析して、より厳密な範囲を計算できるようになり、分岐の削除最適化(branch folding)が向上します。
例えば以下のコードで、x > yは常に偽となるため削除されます:
void Test(bool cond, int[] arr)
{
int x = cond ? -1 : -2; // [-2..-1]
int y = arr?.Length ?? 0; // [0..Array.MaxLength]
if (x > y) // 常に偽 → 削除される
Console.WriteLine("below zero");
}
EgorBotを使用したアドホックなパフォーマンスベンチマーク実行を可能にするCopilotスキルを追加しました。このスキルにより、開発者はPRコメント経由でBenchmarkDotNetベンチマークを自動生成・実行でき、パフォーマンス検証が容易になります。
@EgorBot -x64 -arm -profiler --envvars DOTNET_JitDisasm:SumArray
[Benchmark]
public int SumArray() => _data.Sum();
Base64.DecodeFromUtf8()で最終量子(パディング=を含む)がホワイトスペースで分割されており、かつisFinalBlock=falseの場合、ホワイトスペースが誤って消費される問題を修正しました。ストリーミングデコーダーがより多くのデータを受け取った後にisFinalBlock=trueで再試行する際の回復を可能にします。
// 修正前: bytesConsumed=2で復帰不可
Base64.DecodeFromUtf8("AQ\r\nQ="u8, output, out int consumed, out _, isFinalBlock: false);
// consumed=2だが"Q="スライスは無効
// 修正後: bytesConsumed=0で再試行可能
Base64.DecodeFromUtf8("AQ\r\nQ="u8, output, out int consumed, out _, isFinalBlock: false);
Base64.DecodeFromUtf8("AQ\r\nQ="u8, output, out _, out _, isFinalBlock: true); // 成功
Windows上のDirectory.GetFilesのパフォーマンスを最適化するPRです。従来は検索パターンに関わらず全ファイルを列挙していたため、大規模ディレクトリでO(N)の処理になっていました。本変更では「安全な」パターンをOS(NtQueryDirectoryFile)のプリフィルタとして渡すことで、O(log N)相当の高速化を実現します。マネージド側のMatchesPatternフィルタは継続して実行し、100%の正確性を保証します。
例:140,000ファイルのディレクトリでA14881*.jpgを検索時、従来は全ファイル列挙、最適化後は数個~数十個に削減。
crossgen2においてTask返却型の非同期メソッドのthunkをMethodSignatureとして出力するようになりました。AsyncVariantフラグを設定することで、ランタイムが非同期メソッドの継続パラメータを正しく処理できるようになります。同時に、GCRefMapの生成ロジックと例外ハンドリング情報が継続パラメータに対応するよう更新されました。
TextInfo.csのToLowerAsciiInvariant(string)メソッドから unsafe コードを除去し、モダンな C# パターンに置き換えました。このメソッドはカルチャー名("aa-BB" など短い文字列)のキャッシング用に使用され、ホットコードパスではないため、安全性を優先した設計に変更されています。
Linux上のFileSystemWatcherを複数インスタンス間で単一のinotifyインスタンスを共有する設計に変更しました。Linuxではユーザーあたり128個のinotify制限があるため、この共有化により他のアプリケーションとの競合を削減します。対応Issue: #62869
RyuJIT WAsmコード生成において、br_table命令を用いたswitch文の処理時に発生していた1オフのカウントエラーを修正しました。switch文のターゲット数をカウントする際、デフォルトケースを除外する必要がありますが、以前はこれが正しく処理されていませんでした。
macOS 12 がサポート終了となったため、最小デプロイメントターゲットを macOS 12.0 から 14.0 に、Mac Catalyst を 15.2 から 17.0 に更新しました。併せて、これらの新しい最小要件以下の OS バージョンに対する不要な __builtin_available(Objective-C)および @available(Swift)のランタイムチェックを削除し、コードベースを簡潔化しました。
MethodDef/FieldDefトークンテーブルの読み取り時にメモリ順序の問題を修正しました。TypeDefテーブルの読み取り成功後にMethodDef/FieldDefテーブルから値を読み込む際、明示的なメモリバリアがないため、CPUが依存順序を無視して先にMethodDef/FieldDefテーブルを読み込む可能性がありました。VolatileLoadを使用してメモリ順序を保証することで、この問題を解決しています。
.NET RuntimeのWindows CI/CDパイプラインをVisual Studio 2022からVisual Studio 2026プレビュー版へ移行するビルドインフラストラクチャの更新です。公式ビルド、パブリックビルド、ファジング、ストレステストの各パイプラインで使用するWindows ビルドプール イメージを一括切り替えました。
Roslyn/CodeAnalysisを4.14.0から5.0.0-2.26070.104へアップデートし、新しいアナライザーの厳密化に対応します。IDE0071(不要なToString())とIDE0031(null伝播)をsilent診断に設定することで、TreatWarningsAsErrors=trueでの建築失敗を回避しつつ、IDE支援機能は保持します。
netstandard ターゲットではReadOnlySpan<char>を直接文字列補間できないため、ToString()呼び出しが必須となる点が抑制の理由です。
このPRは、廃止されたETW(Event Tracing for Windows)ログ取得ヘルパースクリプトを削除し、System.Net名前空間のデバッグドキュメントを公式のMicrosoft Learn テレメトリドキュメントへリダイレクトするものです。ローカルで管理されていた10個のMicrosoft-System-Net-* イベントソースのリストは削除され、メンテナンスされている公式ドキュメントを参照するよう更新されました。
PR #122012で導入されたリグレッションを修正するもので、AOTコンパイラが非具体的なジェネリック型に対して辞書ノードを作成しようとしていた問題を解決しています。VirtualDispatchCellGenericLookupResultでは、非具体的なインスタンス化の場合、ジェネリック辞書の生成を試みないようにします。
.NET 11以上のライブラリテストプロジェクトに対して、ランタイム非同期プレビュー機能を有効化します。サポートされていないシナリオは適切に除外されます。テストインフラストラクチャの設定ファイルで条件付きPropertyGroupを追加し、互換性のあるテストプロジェクトで機能を有効にします。
JIT コンパイラの codebase において、GTF_UNSIGNED フラグの直接操作を既存の GenTree ヘルパーメソッドで置き換えるリファクタリング。55 個の明示的なフラグ操作を 22 ファイルにわたって IsUnsigned()、SetUnsigned()、ClearUnsigned() メソッドに統一し、コードの保守性と可読性を向上。
// 変更前
gtFlags |= GTF_UNSIGNED;
if (gtFlags & GTF_UNSIGNED) { /* ... */ }
gtFlags &= ~GTF_UNSIGNED;
// 変更後
SetUnsigned();
if (IsUnsigned()) { /* ... */ }
ClearUnsigned();
WebAssembly JIT のキャスト操作のコード生成を拡張するPRです。小整数型(byte、short)キャストの符号拡張対応、float→int のキャストが飽和非トラップ変換命令を使用して実装されました。Wasm オペコードを1バイトから2バイトに拡張し、GenIntCastDesc を條件付きコンパイル外に移動して Wasm 対応を強化しています。
// float -> int の飽和変換の例(内部実装)
// float を int に変換する際、トラップせず範囲外の値を飽和値に変換
Array.FindAllメソッドのパフォーマンスを改善しました。マッチ結果をスタック上に一時的に格納し、Listの割り当てをオプション化することで、メモリ割り当てと実行速度の両方を削減します。.NET 10で利用可能なInlineArray16<T>を活用した実装です。
Windows Compatibility Pack で過去に必要だった System.ServiceModel.Primitives 依存関係を削除するPRです。バージョン管理ファイルからこの依存関係への参照をすべて削除し、不要になった依存関係を整理します。
Native AOT コンパイルでクラッシュしている User Events テストスイートを Native AOT 非互換として正式にマークしました。テスト実行時に System.ArgumentNullException が発生していた問題に対応するため、Directory.Build.props ファイルを追加して NativeAotIncompatible=true を設定しています。
runtime-official.yml CI パイプラインの最適化により、OneLocBuild と SourceIndex を毎コミット実行から定期スケジュール実行(日次)に変更。assetless ビルドの導入によりパイプライン実行時間が短縮されたため、毎回これらの操作を実行する必要がなくなり、CI リソースの節約を実現。
SuperPMI(.NETランタイムのJIT性能測定ツール)の改善で、getContinuationType呼び出しが記録にない場合の処理を強化しました。非同期処理関連の変更時に、継続型レイアウトが見つからないシナリオに対して、合成された仮のクラスハンドルを返すことで、不要な「コンテキスト欠落」エラーを回避できます。
// 疑似継続型ハンドルを使用した処理例
// repGetContinuationType が見つからない場合、仮のハンドルを返す
CORINFO_CLASS_HANDLE pseudoHandle = /* synthetic handle */;
VS 2026のコンパイラ警告C4319を解消するため、libunwindのUNW_ALIGNマクロに明示的なsize_t型キャストを追加しました。unsigned longからsize_tへのゼロ拡張に関する警告を修正し、Windows環境での整合性を改善するアップストリーム修正のバックポートです。
Native AOT環境でのStringBuilder marshalling テストの失敗に対応するため、3つのテストメソッド(ByValue、ByRef、ReversePInvoke)にActiveIssue属性を追加して、Native AOT環境での実行をスキップするようにしました。これらのテストは PR #123112 により outerloop priority tracking の修正後に実行されるようになったことが原因です。
Native AOT + Linux環境でNegotiateAuthenticationTests全体がクラッシュする問題に対応するため、ActiveIssue属性をテストメソッドレベルからクラスレベルに変更しました。当初は特定のテスト(Package_Unsupported_NTLM)のみが問題だと思われていましたが、実際にはテストクラス全体が影響を受けることが判明したため、スキップの対象範囲を拡大しています。
CoreCLRのutilcodeから使用されていない関数とクラスを削除するコード整理PRです。ClrVirtualAllocAligned関数、ConfigStringクラス、ConfigMethodSetクラスを削除し、メンテナンス対象を削減しています。ConfigDWORDクラスは引き続き使用されているため保持されます。
WebAssembly RyuJIT コンパイラで、block および loop 命令の emission 時に必須の型フィールド(block type byte)が欠落していた問題を修正しました。新しい emitIns_B ヘルパーメソッドを追加し、これらの構造化制御フロー命令が正しく型情報を含めて emission されるようにしました。
PR #120712で導入された「特殊マーカー型」インターフェースマップ最適化による2つの回帰を修正するバックポートです。主な修正は、インターフェース展開ロジックの完全な実装と、ジェネリック型パラメータ数の上限チェック(MaxGenericParametersForSpecialMarkerType)の忘却箇所の対応です。特にVB.NETコンパイラのメタデータ生成パターンで問題が顕在化しています。
Windows Arm64上のアンマネージドC++メンバー関数(thiscall)呼び出しに対応するため、戻り値バッファの引き渡しメカニズムを修正しました。Windows Arm64では、戻り値バッファが通常のX8レジスタではなく、第2引数レジスタ(X1、thisが存在する場合)で渡される特異な呼び出し規約に対応しています。
CLR インタープリタの CEE_JMP 命令処理を修正し、call.tail オペコードが実際にはテール呼び出しを実行しない場合にも対応するようにしました。リターン処理ロジックを EmitRet ヘルパー関数に統合し、CEE_RET と CEE_JMP の両方から呼び出すことで、テール呼び出し失敗時にも無効なコード実行を防ぐようになります。これにより Windows Arm64 での P/Invoke ジャンプ/テールコール関連テストが修正されます。
Microsoft.NET.ILLink と Microsoft.NET.ILLink.Tasks NuGetパッケージに対して、SDK内部専用パッケージであることを明記するPACKAGE.mdファイルを追加しました。これらのパッケージは直接参照すべきではなく、SDKを通じてのみ使用されるべきであることをユーザーに明確に伝えます。
TypeMapping.GetOrCreateExternalTypeMapping で発生していた非決定的な ArgumentException を修正しました。異なる型名が同一の GetHashCode() 値を持つ場合(例:"Windows.Media.Devices.Core.FrameFlashControl" と "Windows.Security.Credentials.PasswordCredential")にハッシュ衝突が発生していたのが原因です。LazyExternalTypeDictionary を Dictionary<int, DelayedType> から Dictionary<string, DelayedType> に変更し、ハッシュ値ではなく文字列キーそのものを使用することで解決しました。
// 修正前: ハッシュ衝突の可能性あり
Dictionary<int, DelayedType> _lazyData; // int = key.GetHashCode()
// 修正後: 衝突なし
Dictionary<string, DelayedType> _lazyData; // 文字列キーを直接使用
ロガーメッセージジェネレータの生成されたクラスの出力順序を安定化させました。namespace→name の順でソートして出力することで、ビルド結果の非決定性を排除し、再現可能なビルドを実現します。これにより、同じソースコードから常に同じ生成コードが出力されるようになります。
Base64エンコーディングで改行挿入(Base64FormattingOptions.InsertLineBreaks)を行う際、既存のBase64.EncodeToCharsヘルパーを利用するようにリファクタリングしました。不安全なポインタベースの実装から安全なspan操作への変更により、30バイト以上の入力では性能が向上(最大47%削減)します。10~20バイトのごく小さい入力では軽微な性能低下(9~56%増加)がありますが、全体としては改善されています。
このPRではMonoからHTTPおよびWebSocket JavaScriptクライアント実装をCoreCLRに移植しました。ブラウザベースのWASM応用でネットワーク機能が利用できるようになります。WebSocketのクローズステータスプロパティ名をJavaScript命名規約に準拠させ、null promiseハンドリングのバグを修正し、タイマー管理機構を拡張しました。
// C#側:WASM環境でHTTPやWebSocket通信が利用可能に
using System.Net.Http;
using System.Net.WebSockets;
WebAssembly ビルドプロセスの回帰問題を修正するPRです。NuGetパッケージから複数のカルチャを持つサテライトアセンブリが、重複ファイルとして誤くフラグされる問題を解決しました。サテライトアセンブリはカルチャ固有のサブディレクトリに配置されるため、メインフレームワークフォルダのアセンブリに対してのみ適用される一意ファイル名チェックをバイパスするよう修正しています。
RuntimeAsync機能における非同期メソッド変種のシグネチャからmodreqの生成を廃止し、代わりにAsyncVariantKind列挙型をMethodSignatureに追加して、非同期変種の種別(Task/ValueTask)を明示的に追跡する変更です。これにより、Task<int> M()とValueTask<int> M()の非同期変種を同じスコープ内で区別でき、シグネチャの曖昧性を解決しています。
enum AsyncVariantKind
{
None = 0, // 非同期変種ではない
Task = 1, // Task[<T>]返却メソッド用の非同期変種
ValueTask = 2 // ValueTask[<T>]返却メソッド用の非同期変種
}
DIコンテナのオープンジェネリック解決時に、制約が互換性のない最新登録をスキップし、以前の互換可能な登録にフォールバックしていた問題を修正。これにより、単一インスタンス解決時に「最後に登録されたもの勝ち」の原則が正しく適用されるようになりました。修正前は混乱を招く挙動を引き起こしていました。
JITの範囲チェック分析における二項演算(Add/Multiply)の処理を強化し、整数オーバーフロー時の動作を改善しました。TryGetRangeFromAssertions関数にオフセット削除ロジックを統合することで、アサーション基盤の範囲演算をSSAベースの処理と同等に改善しました。これにより、Issue #122288のオーバーフロー時の不正な範囲演算結果を修正します。
このPRはデバッグトランスポートレイヤーをリファクタリングし、TwoWayPipeの直接利用をIDebugChannel COM インターフェースで抽象化します。これにより関心の分離が向上し、将来的に異なるトランスポート実装への拡張が可能になります。
// 新しいインターフェース構造の例
interface IDebugChannel
{
// 接続管理とread/write操作のメソッド
}
// 既存実装をラップ
class DbgTransportPipeChannel : IDebugChannel
{
private TwoWayPipe pipe;
}
tar アーカイブにおいて 8GB を超える大容量ファイルエントリのハンドリングをテストするための自動テストスイートを追加しました。SimulatedDataStream と ConnectedStreams を活用して、CI 環境での大容量データテストをディスク領域やメモリ消費なしに実現します。ライター/リーダーの並列パターンで、実際のデータ実体化を回避しながら PAX および GNU フォーマットをテストしています。
JsonSerializerOptions.GetConverter(Type)で取得した数値プリミティブコンバーター(Int32Converter等)が、公開メソッドRead()とWrite()でJsonNumberHandling設定を無視していた問題を修正しました。修正後は、例えばAllowReadingFromString設定で文字列形式の数値を正しく処理できるようになります。
var options = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString };
var converter = (JsonConverter<int>)options.GetConverter(typeof(int));
ReadOnlySpan<byte> json = "{\"x\": \"123\"}"u8;
var reader = new Utf8JsonReader(json);
reader.Read(); // StartObject
reader.Read(); // PropertyName
reader.Read(); // Number(実は文字列)
var result = converter.Read(ref reader, typeof(int), options); // ✅ 123に変換成功
ARM32 SOFTFP向けのインタープリータ実装を有効化するPRです。引数と戻り値のアセンブリ実装を追加し、ARM32 SOFTFP呼び出し規約に対応した小さなバグ修正を含みます。簡単なテストケースで検証済みです。
System.Net ライブラリの内部ログイベントから冗長な Keywords プロパティを削除しました。Keywords は LogLevel と重複した情報のみを含んでいたため、削除することで dotnet trace でのログ収集時にマスキングフラグ(:0xf)の指定が不要になり、ツールの使用性が向上します。
変更前:
dotnet trace collect -p <pid> --providers Private.InternalDiagnostics.System.Net.Security:0xf,...
変更後:フラグ指定なしで同等の収集が可能に
Azure Pipelines のパイプラインジョブ設定を更新し、evaluate-paths-job.yml で使用するビルドエージェントを Ubuntu 22.04 から Azure Linux 3 に変更しました。これはパイプラインインフラストラクチャの統一化を目指す継続的な取り組みの一部です。
RFC 6455仕様への準拠を強化するため、WebSocketサーバーが受け取ったマスクされていないフレームを拒否する検証ロジックを追加しました。RFC 6455によれば、クライアントはサーバーに送信するすべてのフレームをマスクする必要があり、サーバーはマスクされていないフレームを拒否すべきです。
Native AOT環境でジェネリック再帰テストが意図せず実行されるようになった問題を修正するPRです。PR #123112以降、このテストがNative AOT対象としてコンパイルされるようになり、TypeLoadExceptionを発生させていました。Native AOT環境ではジェネリック再帰のカバレッジが別途存在するため、このテストをNative AOT環境で無効化する条件付きスキップを追加しています。
JITテストの動的メソッド処理において、Reflection Emitが利用不可なプラットフォーム(NativeAOTなど)でのテスト失敗を防ぐため、テスト属性を[Fact]から[ConditionalFact(RefEmitSupported)]に変更しました。これにより、Reflection Emit対応プラットフォームでのみテストが実行されるようになります。
// 変更前
[Fact]
public void TestMethod() { ... }
// 変更後
[ConditionalFact(typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsReflectionEmitSupported))]
public void TestMethod() { ... }
variant型(変位型)に対するgetExactClassesの最適化が不正に動作していた問題を修正します。JITがAction<string>型のパラメータに対してAction<object>型への型チェックを誤ってfalseに最適化していた問題を解決しました。variant型の場合は-1を返すことで、型の正確性が不明な場合の適切な処理を実現します。
PR #123057で実装されたARM32ハイジャック時の非同期継続レジスタ(r2)保存機能を戻す変更です。アウターループの実行でARM32が一貫してクラッシュしており、その原因がこのPRにあると疑われたため、当該変更を再度検証するための作業です。
Native AOT outerloopビルドで失敗するNTLMテストを無効化するPRです。ActiveIssue属性を追加して、Native AOTプラットフォーム上でのテスト実行をスキップしています。
インタープリタコンパイラにEdit and Continue (EnC)シナリオで使用されるヘルパー呼び出し経由のフィールドアドレス取得サポートを追加しました。静的フィールドと実例フィールドの両方に対応し、System.Runtime.Loader.Tests ライブラリのテストがインタープリタ実行時に全てパスするようになります。
// 静的フィールドアドレス取得の例(EnC対応)
CORINFO_FIELD_STATIC_ADDR_HELPER を通じたフィールドアドレス取得が可能に
JIT の後期デバーチャライゼーション時にメソッドハンドルを取得する方法を改善したPRです。従来は GenTree からメソッドハンドルを抽出していましたが、今後は import 時に LateDevirtualizationInfo に保存されたメソッドハンドルを使用することで、デバーチャライゼーション判定を簡潔にしつつ、より確実に処理できるようにしました。これにより #122023 で導入されたデバーチャライゼーション機能の回帰を修正します。
// LateDevirtualizationInfo にメソッドハンドルを保存
struct LateDevirtualizationInfo
{
CORINFO_METHOD_HANDLE methodHnd; // 新規追加
// ...
};
特別なマーカー型の最適化による2つのリグレッション問題を修正しました。Issue #123254ではVB.NETプログラムで最適化されたインターフェースマップロジックが実装されていなかった問題を、Issue #123318ではMaxGenericParametersForSpecialMarkerTypeを超える場合の型チェック漏れを修正しています。
内部反射API(FindMethod、FindMethodByName、Delegate_BindToMethodName)がメソッド検索時に非同期バリアント(async variants)をスキップするように修正しました。通常の反射APIと同じ理由で、これらのAPI呼び出し側は非同期バリアントを期待していません。将来的に非同期バリアントの考慮が必要な場合は、既存のフラグ(FM_Flags、DelegateBindingFlagsなど)で対応可能です。
P/Invoke呼び出しから戻る64ビット未満の整数値の処理に関するバグを修正します。従来は64ビット全体のリターンレジスタ値をインタプリタスタックに書き込んでいましたが、適切なビット数のみを抽出し、符号付き/符号なし型に応じてゼロ拡張または符号拡張する必要があります。
新たに6種類の戻り値型(ReturnTypeI1/U1/I2/U2/I4/U4)に対応した専用のCallJittedMethodXXXスタブを追加することで対応しています。
WASM ブラウザプロジェクトの Debug ビルドでデバッグが失敗する回帰を修正します。PR #120330 で WasmAssembliesFinal(AOT/再リンク出力)が ReferenceCopyLocalPaths から削除されましたが、復元されていなかったため、デバッガメタデータの読み込みと下流の MSBuild ターゲットが失敗していました。修正では _ResolveWasmOutputs ターゲットで WasmAssembliesFinal を ReferenceCopyLocalPaths に戻します。
// Microsoft.NET.Sdk.WebAssembly.Browser.targets
<ReferenceCopyLocalPaths Include="@(WasmAssembliesFinal)" />
NativeAOT ビルドの不要なタスク実行を最小化し、Windows 上での iOS プロジェクトビルドを可能にするとともに、macOS ビルドのパフォーマンスを改善します。具体的には、xcrun 実行やXcode バージョン検出、ネイティブリンカー検証を条件付きでスキップします。
// 例: SysRoot が既に設定されている場合、xcrun の実行をスキップ
// condition="'$(SysRoot)' == ''" を追加して不要な実行を防止
IndexOfAnyInRange および関連 API が無効な範囲(highInclusive < lowInclusive)に対して、ハードウェア組み込み関数の有効・無効によって異なる結果を返す不整合を修正しました。ベクトル化パスでは highInclusive - lowInclusive が符号なし型でラップしてしまい、不正なマッチを引き起こしていました。
ReadOnlySpan<byte> data = [50];
int result = data.IndexOfAnyInRange((byte)200, (byte)100);
// 修正前:組み込み関数有効時は0(不正)、無効時は-1(正正)
// 修正後:両方で-1を返す(一貫性あり)
このPRは、Mono と CoreCLR の両方のインタプリタ実行環境を統一的に検出するため、PlatformDetection に IsInterpreter プロパティを導入し、テストコード全体で使用するよう更新しています。issue #123224 に関連する変更です。
WebAssemblyの単一スレッド(ST)ビルドにおけるトリミング最適化を改善するPRです。ProcessorCountのILLink XML置換をインライン条件付きコンパイルに変更し、FEATURE_SINGLE_THREADEDガードをブロッキング操作の前に追加することで、コード削減を実現しています。また、単一スレッド対応をブラウザのみからブラウザとWASIプラットフォーム両方に拡張しています。
// 変更例:ProcessorCountの条件付きコンパイル化
public static int ProcessorCount
{
get
{
#if FEATURE_SINGLE_THREADED
return 1;
#else
return GetProcessorCount();
#endif
}
}
ilasm/ildasm のラウンドトリップ処理において、自己参照制約を持つジェネリックインターフェース(例:IEqualityOperators<TSelf> where TSelf : IEqualityOperators<TSelf>)の制約が重複する問題を修正しました。トークンベースの重複検出が失敗する場合、シグネチャベースの比較を追加することで解決しています。
OSR(On-Stack Replacement)とwrite barriers(書き込みバリア)ジットヘルパーを新しい決定的アンワインドプラン(Rtl*およびPAL_VirtualUnwind関連の呼び出しを廃止)に移行するコミットです。また、未使用と思われるUnwindAndContinueResumeAfterCatchを削除しています。この変更により、複数のアーキテクチャ(AMD64、ARM64、LoongArch64、RISC-V64)にわたる例外ハンドリングとアンワインド処理がより統一された方式で実装されます。
WebAssembly RyuJIT コンパイラに対して、マネージド呼び出し規約のメソッドに隠し引数(スタックポインタとポータブルエントリポイント)を追加するための基盤実装です。また、ローカル変数 0 が常に "this" ポインタであると仮定していたコードを修正し、struct 引数の ABI 分類を実装しています。
HttpClientがsocks5h://プロキシスキームをサポートするようになりました。従来はNotSupportedExceptionが発生していました。socks5hはcURLの慣例で、SOCKS5でDNS解決をプロキシに委譲することを示します。実装上は既存のsocks5と同じように、ホスト名をデフォルトでプロキシに転送します。
using var handler = new SocketsHttpHandler();
handler.Proxy = new WebProxy("socks5h://username:password@proxy.example.com:1080");
using HttpClient client = new HttpClient(handler);
var response = await client.GetStringAsync("http://ifconfig.me/ip");
WebAssembly/CoreCLR統合において、RhExceptionHandling_FailedAllocationのポータブル実装を追加しました。従来のPORTABILITY_ASSERTを既存のRhExceptionHandling_FailedAllocation_Helper関数への呼び出しに置き換え、メモリ割り当て失敗時の例外処理を適切に実装しています。
// 実装パターン(C++)
// PORTABILITY_ASSERT から以下に変更:
RhExceptionHandling_FailedAllocation_Helper(nullptr);
本PRはICorDebugProcess12::GetAsyncStackという新しいデバッグインターフェースを実装しており、デバッガがC# async/awaitの継続チェーンをウォークできるようになります。async stackの走査機能により、非同期コードのデバッグが向上します。
// GetAsyncStackメソッドの使用例(概要)
// デバッガはこのインターフェースを通じてasync継続チェーンを取得
ICorDebugProcess12 process = ...;
ICorDebugAsyncStackWalk asyncStackWalk = process.GetAsyncStack(thread);
DynamicOptimizationプロファイラテストのインタープリタ検出ロジックを改善しました。一部のインタープリタテストモードではJITコンパイルが実際に行われるため、インライン数の期待値が不正確でした。純粋なインタープリタモード(インライン数=0)とJIT併用モード(非ゼロのインライン数)の両ケースに対応するよう修正しました。
Unix ファイルシステムタイプの定義を .NET ランタイムが実際に使用する値に限定するための最適化です。未使用のファイルシステムタイプ定義を削除し、ネイティブコード(pal_io.c)と マネージドコード間の冗長性を排除することで、コードベースを簡潔にしています。
ARM64でのスレッドハイジャック処理を修正し、x2レジスタ(async continuation値を格納可能)を保護するPRです。ハイジャック時にGC中もx2がasync continuationを保持できるよう、スレッドポインタをx2からx9に移動し、プローブフレームでx2を保存・復元するようになりました。
このPRは、crossgen2がWebAssembly(Wasm)対象のR2R(Ready2Run)メタデータをデータセクションに書き込む機能を実装しています。WasmObjectWriterクラスを大幅にリファクタリングし、基本クラスObjectWriterのメソッドを活用してDependencyNodesを処理できるように改善しました。各データセグメントは独立して表現され、Wasm形式の要件に従って単一のデータセクションにマージされます。
AllocHeap実装を最適化し、OS仮想メモリAPI(PalVirtualAlloc/PalVirtualFree)から標準C++ allocation(new/delete)に置き換えました。このアロケータが使用するメモリ量は典型的なアプリケーションでは少量のため、OSの仮想メモリAPIは不要です。特にWindows実装では64KBの予約に対して4KBしかコミットしていなかった非効率性を解決します。
dotnet/runtimeのビルドシステムで使用するCMakeの最小要件バージョンを3.20から3.26にアップグレードするPRです。.NET 11対応に伴い、RHEL9との互換性を保ちながら、CMake 3.26で利用可能なモダンな機能を活用できるようにします。このアップグレードにより、ビルド構成の簡潔化とコード保守性の向上が実現されます。
Microsoft.Extensions.Hosting* プロジェクトのテストカバレッジを大幅に拡充するPRです。79個の新規単体テストを追加し、以前はほぼテストされていなかったクラスを網羅的にカバーするようにしました。テストは段階的にコンソリデーションされ、最終的には51個の統合テスト(Microsoft.Extensions.Hosting)と30個のテスト(Microsoft.Extensions.Hosting.Abstractions)に調整されました。結果として304個のテストすべてが合格し、87.69%のライン覆率を達成しています。
ZStandard (Zstd) 圧縮形式の Stream、Encoder、Decoder を .NET ランタイムに実装しました。新しい System.IO.Compression.Zstandard ライブラリを追加し、既存の Brotli や Deflate と同様のAPIで Zstd 圧縮・展開機能を提供します。ベンチマーク結果では、Zstd は Brotli や Deflate よりも高速な圧縮・展開を実現しています。
// 使用例
using System.IO.Compression;
// 圧縮
using (var sourceStream = File.OpenRead("input.txt"))
using (var compressedStream = File.Create("input.zst"))
using (var zstdStream = new ZstandardStream(compressedStream, CompressionMode.Compress))
{
sourceStream.CopyTo(zstdStream);
}
// 展開
using (var compressedStream = File.OpenRead("input.zst"))
using (var decompressedStream = File.Create("output.txt"))
using (var zstdStream = new ZstandardStream(compressedStream, CompressionMode.Decompress))
{
zstdStream.CopyTo(decompressedStream);
}
Span<T>.ToArray と ReadOnlySpan<T>.ToArray のメソッド実装をリファクタリングし、unsafe コードの使用を削減しました。このリファクタリングは機能的な変更なく、コードの安全性を向上させることを目的としています。
Guid.DecodeByteメソッドの最適化により、PR #88267から生じたパフォーマンス回帰に対応しました。ParseExactD、ctor_str、Parseメソッドで約14~17%のパフォーマンス改善を実現しています。
JIT コンパイラのレイアウト最適化に関する過去の問題が解決されたため、SpanHelpers.T.cs ファイル内の goto ステートメントを用いた回避策を削除するPull Requestです。これにより、コードの可読性と保守性が向上し、より通常的な制御フローに整理されます。
IBinaryInteger<TSelf>インターフェースに対して、5つの丸め戦略(Truncate、Floor、Ceiling、AwayFromZero、Euclidean)をサポートする新しいDivisionRounding列挙型を導入し、Divide、DivRem、Remainderメソッドの新しいオーバーロードを追加しました。これにより、整数除算時に異なる丸め動作を指定できるようになります。
// 使用例
int dividend = 7;
int divisor = 2;
var result = DivRem(dividend, divisor, DivisionRounding.Floor);
// Floor: 商=3, 余り=1
System.Net.Sockets に並列接続(Parallel Connect)機能を追加しました。API #87932 で承認された機能で、複数の DNS アドレスに対して並列に接続試行を行い、最初に成功した接続を確立します。現在は SocketAsyncEventArgs (SAEA) のみサポートしており、リスクを最小化するため既存の MultiConnectSocketAsyncEventArgs に新しいメンバーを追加する設計となっています。
// 使用例(推定)
var args = new SocketAsyncEventArgs();
args.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
// 複数アドレスへの並列接続が可能に
Azure DevOps パイプラインの evaluate-paths ジョブで使用されるランナーを Ubuntu から macOS に変更しました。ビルドパイプラインの実行環境を macOS ベースに統一することで、プラットフォーム固有の動作検証を強化します。
CoreCLR PALのスレッド実装から、未使用のTHREADGetThreadProcessId関数を削除するコミットです。この関数はロジカルバグ(エラーハンドリング条件が反転している)を含んでいたため、削除することで技術負債を軽減します。
AssetCachingTestsの不安定性を解決するため、サーバーログのstdout解析からAPI ベースのアプローチに変更しました。BlazorWebWasmテストサーバーにリクエストログミドルウェアと/request-logsAPIエンドポイントを追加し、BlazorWebWasmLogClientを通じてHTTP経由でログを取得するように改善しました。また、C# 13のnew Lock()とコレクション式[]の新しい構文も導入しています。
ブラウザ環境でのWebAssembly実行時におけるPInvoke呼び出しの問題を修正するPRです。WasmAppBuilderのPInvokeモジュールリストに、ブラウザ固有の2つのネイティブモジュール(libSystem.Native.BrowserとlibSystem.Runtime.InteropServices.JavaScript.Native)を追加することで、PInvoke機能の適切な動作を確保しています。
WebAssembly Blazor アセットキャッシング テストの信頼性を改善するPRです。従来のサーバーログの標準出力解析に依存していたため不安定だったAssetCachingTestsを、HTTP APIエンドポイントベースのログ取得メカニズムに置き換えました。テストサーバーに/request-logsエンドポイントを追加し、クライアント側から専用のHTTPクライアント(BlazorWebWasmLogClient)でログを取得する方式に統一しています。
SunOS(illumos/Solaris)プラットフォーム上で発生するmemsetのnamespace問題に対するワークアラウンドを実装しました。std::memsetを明示的に使用することで、プラットフォーム固有の問題を回避しつつ、他のプラットフォームでの既存動作を維持しています。
#ifdef TARGET_SUNOS
std::memset(ptr, 0, size); // SunOS上で明示的なnamespace指定
#else
memset(ptr, 0, size); // 他のプラットフォーム
#endif
Browser向けJS相互運用機能において、完了済みTask<long>のマーシャリング時にバグが発生していました。完了済みタスクの値を直接マーシャリングする最適化パスで、型固有のマーシャラーではなく汎用のToJS(object)メソッドが呼ばれており、long型はnumberとbigintの2通りのマーシャリング方法があるためNotSupportedExceptionが発生していました。本修正により、完了済みタスクでも型固有のマーシャラーデリゲートを使用するよう統一されます。
JITのasync変換処理において、例外の再スロー(rethrow)用基本ブロック(BB)の挿入位置が非決定的だったため、デバッグ情報が破損する問題を修正しました。fgNewBBinRegionからfgNewBBafterへ変更することで、rethrow BBを常にAsync呼び出しの直後に挿入するようにしました。
// 修正前: 挿入位置が非決定的
fgNewBBinRegion(...)
// 修正後: async呼び出し後に確実に挿入
fgNewBBafter(...)
シングルスレッド環境のBrowser WASM向けランタイムにおいて、System.Collections.Concurrentアセンブリ全体がトリミング(削除)されていることを検証するテストを追加しました。CoreLibが並行コレクション型に依存しないようにすることで、ダウンロードサイズを削減します。
ブラウザプラットフォームで Task.WaitAll の呼び出しを回避するため、ソケットクローズ操作を同期メソッドから非同期メソッドに変換しました。CloseWebSocket() を CloseWebSocketAsync() にリネームし、CloseAsync()、ShutdownAsync()、ShutdownSendAsync() を非同期メソッドに改善。テストコード全体で呼び出し箇所を修正しています。
// 変更前
Task.WaitAll(_socket.CloseWebSocket()); // ブラウザで PlatformNotSupportedException
// 変更後
await _socket.CloseWebSocketAsync();
WebAssembly SDK のビルドタスクを MSBuild の Runtime="NET" 属性に対応させることで、レガシーなマルチターゲット対応を削除し、NuGet パッケージレイアウトを簡素化しました。Microsoft.NET.Sdk.WebAssembly.Pack.Tasks を単一ターゲット $(NetCoreAppToolCurrent) に変更し、タスク DLL を tools/ ディレクトリに直接配置するようになります。
Linux上でmini dumpファイルを生成する際、DOTNET_DbgMiniDumpNameに%e.dmpを指定した場合、実行可能ファイル名が15文字に切り詰められていた問題を修正しました。
修正内容は、まず/proc/<pid>/exeシンボリックリンクから完全なパスを読み込み、失敗時は従来の/proc/<pid>/statusにフォールバックするという優先順位制御です。これにより、長いファイル名を正確に保持できます。
CoreCLR インタープリタが有効な状態でライブラリテストを実行するための新しいCI パイプラインを追加します。このパイプラインは日次スケジュールで実行され、Linux、Windows、macOS の x64 および ARM64 アーキテクチャ全体でテスト可能にします。インタープリタのパフォーマンスオーバーヘッドに対応するため、タイムアウトは300分に設定されています。
runtime リポジトリ内から VMR(Virtual Monolithic Repository)のソースビルド stage1/stage2 を検証する専用パイプラインを追加します。これにより、予期された失敗を含むソースビルドシナリオを非ブロッキングで検証できるようになります。既存の source-build 関連ジョブは廃止されます。
OpenSUSE Helix テスト プラットフォームのバージョンを 15.6 から 16.0 に更新するインフラストラクチャのみの変更です。CI パイプライン設定ファイルにおいて、テスト実行環境で使用される OpenSUSE コンテナ イメージとキュー定義を更新します。
このPRはSystem.Text.JsonライブラリにIReadOnlySet<T>のシリアライズおよびデシリアライズ機能を追加します。ISet<T>やICollection<T>など他のコレクションインターフェースと同じ方法でIReadOnlySet<T>を認識・変換できるようになります。また、例外ヘルパーメソッド名のタイポ修正も含まれます。
// 使用例
var options = new JsonSerializerOptions();
var jsonString = JsonSerializer.Serialize(myReadOnlySet, options);
var deserialized = JsonSerializer.Deserialize<IReadOnlySet<int>>(jsonString);
EventPipeの複雑な二重ロック同期スキーム(スレッドロック + buffer_managerロック)を廃止し、単一のbuffer_managerロックに統一。ThreadSessionStateのライフサイクル管理を改善し、メモリリークを防止します。
PR #123388のレビューフィードバックに対応し、未使用のファイル ServerRequestLog.cs を削除しました。このファイルは BlazorWebWasmRequestLog と重複する内容で、コードベース全体で使用されていません。
BlazorWebWasmLogClientがリソースリークを起こしていた問題を修正。HttpClientを生成していながら破棄していなかったため、ソケット枯渇の原因になる可能性がありました。IDisposableを実装して適切なリソース管理を実現します。
// Before
var requestLogClient = new BlazorWebWasmLogClient(baseUrl);
// After
using var requestLogClient = new BlazorWebWasmLogClient(baseUrl);
BlazorWebWasm テストアセットの requestLogs リストへの並行アクセスにおけるスレッド安全性の問題を修正しました。複数の HTTP リクエストから同期なしでリストにアクセスしていたレース条件を、ロックオブジェクトの導入で解決します。
JITコンパイラのオブジェクト割り当て最適化において、スタック割り当て配列のレイアウトサイズ計算時に発生するオーバーフロー問題を修正しました。配列の最大長と要素サイズを掛け合わせた際(例:CORINFO_Array_MaxLength * UINT16_MAX = 140735337136185)にuint32_tの範囲を超える場合、スタック割り当てを防止することでクラッシュを回避します。
非同期リフレクションテストの不安定性を修正するPRです。FromStack(1)とFromStackDMI(1)メソッドはスタックフレーム情報に依存しているため、テスト実行時のインライン化によって間違ったフレームがスキップされることが原因でテストが失敗していました。NoInlining属性を追加することで、スタックフレームの位置を固定化し、テストの信頼性を向上させます。
[MethodImpl(MethodImplOptions.NoInlining)]
private static void FromStack(int level)
{
// StackFrame情報を正確に取得
}
Enumerable.Skip()が存在する要素数以上をスキップした後、Concat()やAppend()などの演算子を呼び出すとArgumentOutOfRangeExceptionがスローされる回帰バグを修正しました。問題はIListSkipTakeIterator.Fill()メソッドが境界チェックなしにSpan.Slice()を呼び出していたことが原因です。
// 修正前(例): sourceIndexがsourceSpan.Lengthを超えている場合に例外
var result = new int[] { 1 }
.Skip(2)
.Concat(new int[] { 2, 3 })
.ToArray(); // ArgumentOutOfRangeException
// 修正後: 正常に [ 2, 3 ] を返す
HalfとBFloat16のILogBメソッドが非正規化数(subnormal values)に対して誤った値を返していた問題を修正しました。BitOperations.LeadingZeroCountがushort/byteのオーバーロードを持たないため、暗黙的にuintに拡張され、16ビット幅ではなく32ビット幅として計算されていました。例えばHalf.EpsilonのILogBは-24であるべきでしたが-40が返されていました。
// 修正前: TrailingSignificandがushortで、uint へ暗黙的に拡張される
int exponent = BitOperations.LeadingZeroCount(significand) - 16;
// 修正後: ushort専用のLeadingZeroCount オーバーロードを使用
int exponent = BitOperations.LeadingZeroCount(significand);
Base64デコーディングにおいて、小さい宛先バッファと埋め込みホワイトスペースが存在する場合のエッジケースを修正しました。InvalidDataFallbackメソッドが宛先バッファ不足の状態でホワイトスペース処理時に進行できなくなる問題を解決し、ブロック単位のフォールバック処理を導入しています。
LinuxにおけるTLS 1.3セッション再開時に、クライアント証明書を使用した再開接続でIsMutuallyAuthenticated=falseおよびLocalCertificate=nullが誤って報告されるリグレッション問題を修正しました。TLS再開時にクライアント証明書情報が正しく継承されるようにInterop層を修正し、回帰テストを追加しています。
// 修正後:再開接続でも相互認証情報が正しく保持される
SSL_get0_param() → 現在のセッションから証明書情報を取得
.gitignoreファイルに*.exeパターンを追加し、誤ってリポジトリにコミットされる実行ファイル(特にnuget.exe)を防ぐ変更です。テストリソースとして必要な既存の.exeファイルは例外として追跡を継続します。
CoreCLR インタープリタは marshalled calli 命令をサポートしていないため、この機能を使用するテストをスキップするようにしました。3つのテストメソッドに ActiveIssue 属性を追加して、インタープリタモード実行時にテストを無視するようにしています。
プロファイラーが COR_PRF_MONITOR_GC を有効にしている場合、ObjectsAllocatedByClass コールバックをスキップ可能にする新しいフラグ COR_PRF_HIGH_MONITOR_GC_SKIP_ALLOCATED_BY_CLASS_STATISTIC を追加しました。これにより、不要なメモリ統計情報の収集を避けることができます。
// プロファイラーでフラグを設定することで、ObjectsAllocatedByClassコールバックをスキップ
var eventMask = COR_PRF_MONITOR_GC | COR_PRF_HIGH_MONITOR_GC_SKIP_ALLOCATED_BY_CLASS_STATISTIC;
System.Buffers.Text.Base64 に Base64Url と同等のAPI群を追加し、UTF-16ベースのエンコード/デコード操作のパリティを実現するPRです。特にDecodeFromCharsメソッドがOperationStatusを返すことで、InvalidDataとDestinationTooSmallを区別できるようになり、Convert.TryFromBase64Charsの制限を解決します。
// 新しいAPI例:エラーの原因を特定可能
var status = Base64.DecodeFromChars(base64Input, buffer,
out int charsConsumed, out int bytesWritten);
// status: InvalidData, DestinationTooSmall, Done を区別可能
WebAssemblyターゲット向けのPInvoke呼び出しテーブルを自動生成するコード生成ツールの実装です。従来のハードコードされたネイティブライブラリエントリポイントを廃止し、マネージドアセンブリをスキャンして動的にcallhelpers-pinvoke.cppを生成します。これにより、PInvoke解決ロジックが一元化され、保守性が向上します。
// 生成されるコードの概要
public extern IntPtr callhelpers_pinvoke_override(string libraryName, string functionName);
このPRは、.NET Runtimeのuser_events機能(Linuxカーネルトレースポイント経由のイベントトレーシング)に対する包括的な機能テストを追加します。Microsoft OneCollectのRecordTraceツールを使用してイベントを収集し、エンドツーエンドでの正確性を検証します。共有テストインフラストラクチャUserEventsTestRunnerがトレーシング、プロセス生成、イベント検証を調整し、5つのテストシナリオ(基本的なランタイムイベント、アクティビティ追跡、カスタムメタデータ、マネージイベント、マルチスレッド)が実装されています。
Rune.cs のプリプロセッサディレクティブに存在するタイポを修正しました。SYSTEM_PRIVATE_CORLIB が誤った表記で、正しくは SYSTEM_PRIVATE_CORELIB です。このタイポにより、System.Private.CoreLib ビルド時に ArgumentException が期待されたカスタム例外メッセージを使用できていませんでした。
Terser 5.39+による最適化により、WASM デバッガのブレークポイントが機能しなくなっていた問題を修正します。Terser が console.assert(true, ...) を不要な処理として削除していたため、デバッガプロキシがポーズ中のスコープから変数を読み取ることができなくなっていました。true を !!Date.now() に置き換えることで、Terser による静的最適化を回避しつつ、ランタイムでは true として評価されます。
Microsoft.Extensions.Configuration.Functional.Tests プロジェクトにおいて、NETSDK1022 ビルド警告(重複した 'Content' アイテム)を修正しました。SDK がデフォルトで .json と .xml ファイルを Content アイテムとして自動インクルードするのを防ぐため、プロジェクトファイルに <EnableDefaultContentItems>false</EnableDefaultContentItems> を追加しています。
NativeAOTにおいて、非順序なコード配置時のソース行属性の誤りを修正するPRです。コンパイラ最適化により、IL オフセットが低いコードが高いネイティブオフセットに配置される場合、デバッガの行マッピングが不正になる問題を解決しています。CoreCLR のデバッガアルゴリズムと同様に、IL オフセットの低下を検出した際にシーケンスポイントを挿入することで、ソース行の正確な属性付けを実現します。
// 例:async/await メソッドで suspension コードが誤った行に属していた問題
static async Task DoWork(int i)
{
Task worker1 = BackgroundWorker1();
Task worker2 = BackgroundWorker2();
Task worker3 = BackgroundWorker3();
await Task.WhenAll(worker1, worker2, worker3); // 修正前:ここより後のコードが次の行に誤属性
Console.WriteLine("All background workers completed.");
}
このPRはNode.js環境でのストリーミングインスタンシエーション処理を修正します。ネイティブResponseクラスが利用可能な場合はそれを使用し、WebAssemblyのストリーミング有効化に必要な適切なContent-Typeヘッダーをアセットに付与するようになりました。
// 概念的な変更イメージ
// 修正前: フォールバック実装のみ
// 修正後: 実環境で利用可能なResponseクラスを優先使用
var response = responseLike(body, {
headers: { 'Content-Type': 'application/wasm' }
});
このPRは、WebAssembly/ブラウザ環境におけるCoreQLの初期化プロセスをリファクタリングし、ランタイム設定オプションを環境変数ではなく関数パラメータとして直接渡すように変更しています。これにより、リンカー機能が正常に動作するようになります。
// 変更前: 環境変数を経由してランタイムオプションを設定
// 変更後: initializeCoreCLRが直接プロパティをC++層に渡す
BFloat16のSignificandプロパティとTryWriteSignificandメソッドのバグを修正しました。Significandが不正にushort型(16ビット)で定義されていたため、TryWriteSignificandBigEndianおよびTryWriteSignificandLittleEndianがbytesWritten = 4を誤って報告していました。BFloat16フォーマット(1ビット符号 + 8ビット指数 + 7ビット仮数)では、暗黙の先頭1ビットを含めると仮数部は8ビット(1バイト)となるため、Significandをbyte型に修正しました。
ILImporter.Scanner.cs の条件分岐を簡潔化するリファクタリングです。共有ジェネリックメソッドのコンテキスト取得方法が相互排他的な3つのパス(メソッド辞書、型辞書、thisポインタ)のいずれか一つであるという不変条件を強化するため、明示的な else if (targetMethod.AcquiresInstMethodTableFromThis()) を else { Debug.Assert(...); } に置き換えています。機能的な動作変更はありません。
S390Xアーキテクチャの命令生成コードから冗長なロード命令を削除しました。ins->dreg(浮動小数点レジスタ)とsreg(r13)は絶対に競合しないため、不要なロードが削除されています。
このPRはSunOS(Solaris/illumos)プラットフォームに対するSystem.Diagnostics.Processのサポートを実装しています。procfsから読み取ったバイナリプロセス情報を利用して、プロセスとスレッドの情報取得機能を追加します。System.Diagnostic.Process.Testsでは大量のスキップがありますが、失敗は報告されていません。
IEnumerableSkipTakeIterator.TryGetLastに早期リターン最適化を追加し、Skip操作後に要素が存在しないことが確定した場合に即座に処理を終了します。GetCount(onlyIfCheap: true)が有効なカウントを返す場合、count <= _minIndexInclusiveをチェックして不要な列挙を回避します。
// 例:以下のシナリオが最適化対象
Enumerable.Range(0, 4).Prepend(4).Skip(5).LastOrDefault()
// Skip後に要素がないため、即座にfalseを返す
WebAssembly向けJITコンパイラの関数プロローグ生成ロジックを改善したPRです。WASM固有の実装を追加し、スタックポインタ(SP)とフレームポインタ(FP)、ホームレジスタ引数の確立を実現しました。add(x, y)関数の機能化に向けた重要なステップで、残作業としてSP引数の処理が別PRで進行中です。
LoongArch64プラットフォーム上のProfileArgIterator::GetReturnBufferAddr()メソッドを修正し、struct{single, single}型の戻り値をプロファイラテストで正しく処理できるようにしました。PR#122714と同様のアプローチで、pData->bufferを使用して戻り値を返すように改善されています。
StringSyntaxAttributeに、C#、F#、Visual Basicの3つのプログラミング言語構文識別子を表す定数を追加しました。これにより、文字列がどの言語のコードを含むかをアナライザーに明示的に伝えられるようになります。
public static class StringSyntaxAttribute
{
public const string CSharp = nameof(CSharp);
public const string FSharp = nameof(FSharp);
public const string VisualBasic = nameof(VisualBasic);
}
Apple プラットフォームの最小サポートバージョン(macOS 12、iOS/tvOS 13)引き上げに伴い、不要になった __builtin_available による旧バージョン対応コードを削除するクリーンアップです。メモリバリア、セキュリティ暗号化、JIT コード生成など、複数のネイティブ実装ファイルで条件分岐を簡素化し、新しい API を無条件で使用するようになります。
Dictionary::PopulateEntryの未使用パラメータnonExpansiveを削除し、到達不可能なコードパスを排除するコード整理です。このパラメータは唯一の呼び出し元であるjithelpers.cppから常にFALSEで渡されていたため、条件分岐は実行されない死んだコードでした。37行の不要なコードを削除し、実行時の動作には一切影響を与えません。
NativeAOT runtime packがApple mobile platforms (iOS、tvOS等)向けの必須な静的ライブラリ(libSystem.Globalization.Native.a、libSystem.IO.Compression.Native.a、libSystem.Native.a、libbrotli*.a)を欠落していた問題を修正しました。バージョン11.0.0-alpha.1.26065.101から発生していた回帰です。修正内容はeng/liveBuilds.targetsのExcludeNativeLibrariesRuntimeFiles条件にBuildNativeAOTRuntimePack != 'true'を追加し、NativeAOTパックは静的ライブラリの除外対象から除外するものです。
RyuJit/WASMバックエンドにおけるローカル変数アドレス(LCL_ADDR)処理とストア操作に関連するバグ修正。LCL_ADRコード生成から不要なadd命令を削除し、レジスタ割り当て処理を改善しました。
TypeGeneratorTests テストスイートを削除するメンテナンス変更です。このテストスイートは全体のプロジェクトファイルロード時間の約1/9を占めながら、回帰を検出した実績がなく、Pri1設定でのみ実行されるため、ビルドパフォーマンス改善のために削除されます。
superpmi_aspnet2.pyスクリプトを改変し、各ベンチマークシナリオを複数の異なるJIT設定環境変数を使用して実行できるようにしました。従来の4回の実行から、4シナリオ × 6環境セットの計24回の実行に拡張され、より包括的なSPMI(SuperPMI)データ収集が可能になります。
// 環境変数セットの例
// Dummy=0, TieredCompilation=0, TieredPGO=0 など6種類
// 各シナリオで異なるJIT設定での動作を記録
### Running about-sqlite benchmark (set 1/6: Dummy=0)... ###
### Running about-sqlite benchmark (set 2/6: TieredCompilation=0)... ###
NativeAOT のDockerサンプルを.NET 8から.NET 10へアップデートするPRです。ビルドツールイメージをCBL Mariner 2.0からAzure Linux 3.0に更新し、SDKイメージも.NET 10対応版へ統一しました。また、Ubuntu互換性要件を16.04から18.04へ引き上げ、ドキュメント内の誤ったリンクを修正しています。
JITコンパイラのswitch文最適化における不正なアサーション生成バグを修正。オフセット付きのswitch式で、デフォルトケースに対して誤ったRange Assertionが生成される問題を解決。例えば、case 2,3,4のswitch文で、デフォルトケースに「X >= 5」というアサーションが不正に作成されていたが、実際にはXは0や1の値も取得可能でした。
インタープリタのスレッド中止処理をfinally ブロックで正しく動作するように修正しました。単純な IsAbortRequested() チェックから、より複雑な COMPlusCheckForAbort() 関数に置き換えることで、finally ブロック内でのスレッド中止処理が不正に実行されるのを防ぎます。この修正により、System.Runtime.Tests.ControlledExecutionTests.CancelItselfFromFinally テストが正常に動作するようになりました。
.NET CoreデバッガーのenumCordbDerived列挙型と関連コードの大規模クリーンアップです。同期ずれした数値コメント、18個の未使用列挙値、MDA(マネージドデバッグアシスタント)関連の約689行の不要コード、および使用されないCordbContextクラスを削除しました。同時に、CordbValueEnumとCordbCodeEnumの型マッピングを修正し、コンストラクターが正しく列挙型値をベースクラスに渡すようにしました。
DiagnosticServerのEnablePerfMap IPC コマンドがPerfMap::Initialize()の実行前に呼び出されることで発生するレース条件を修正しました。スタートアップシーケンスでPerfMap初期化をDiagnosticServer初期化より前に移動することで、ランタイムのクラッシュを防ぎます。
// 修正前: DiagnosticServer初期化 → PerfMap初期化 (クラッシュの可能性)
// 修正後: PerfMap初期化 → DiagnosticServer初期化 (安全)
Base64{Url}.DecodeFromUtf8 と DecodeFromChars がホワイトスペースを含む入力でDestinationTooSmallエラーを誤って返す問題を修正しました。実際のデータは十分な宛先バッファに収まる場合でも、入力全体の長さを基にした計算により早期にエラー判定されていました。
byte[] input = Encoding.UTF8.GetBytes(" zA== ");
Base64Url.DecodeFromUtf8(input, new byte[1]); // 修正前: DestinationTooSmall エラー
// 修正後: 正常に1バイト書き込み
WebAssembly RyuJIT コンパイラに8ビットおよび16ビットのロード/ストア命令と間接ロード/ストア命令を実装しました。同時に、最大無チェックnullオブジェクトオフセットを0に設定することで、nullチェックがより適切に配置されるようにしています。
このPRは、P/Invoke フレーム関連の例外処理に throw helper を導入する変更です。PUSH_COOP_PINVOKE_FRAME マクロが例外をスローする際に、専用の throw helper 関数を使用することで、アセンブリコードの肥大化を抑制し、メンテナンス性を向上させています。複数のプラットフォーム(x86、x64、ARM、ARM64、LoongArch64、RISC-V)のアセンブリマクロを統一的に更新する大規模な変更です。
RISC-V JITコンパイラのemitLoadImmediate関数内のコメントの正確性と一貫性を改善するPRです。不正な投機的コメントを削除し、実装との不一致を修正し、コメントスタイルをリポジトリ規約に統一しました。コード生成ロジック自体の変更はなく、ドキュメンテーションの改善のみです。
Entity Framework チーム(@dotnet/efteam)の所有権情報を更新するフォローアップPRです。GitHub ユーザー名の大文字小文字の統一(@sammonort → @SamMonoRT)と、System.Transactions エリアの所有者を個別メンテナーから @dotnet/efteam チームに統一しました。これは前回の PR #122357 のマージ後に受け取ったレビューフィードバックに対応するものです。
Linux x64上の相互運用テストスイートの失敗を修正するため、SystemV ABI struct分類メカニズムを改善しました。ArgIteratorがマーシャルされた構造体のSysV struct分類を正しく計算できていなかった問題をPInvokeArgIteratorの使用により解決。さらに分類データのキャッシング効率を向上させ、EEClassOptionalFieldsのサイズを40バイトから24バイトに削減しています。
ref-emitted(動的生成)コード内のスタックトレース生成失敗を解決するため、30個のメタデータエンティティ構造体コンストラクタからDebug.Assert(!handle.IsNil)を削除しました。XUnitが例外スタックトレースをキャプチャする際、動的生成メソッドからnilハンドルが返されると、デバッグビルドでアサーション失敗によりスタックトレース生成が中断されていました。
修正により、構造体をnilハンドルで作成可能になり、プロパティアクセス時にBadImageFormatExceptionがスローされるようになります(AssemblyReference.VersionはWinMD mscorlib参照向けの特別な処理により、nilハンドルで4.0.0.0を返します)。
JIT コンパイラの lvaMarkLclRefs および lvaMarkLocalVars メソッドから、常に false で渡されていた未使用の isRecompute パラメータを削除しました。この変更は、既存のアサーション("Stop passing isRecompute once we are sure that this assert is never hit")で確認された死コードの削除です。
x86プラットフォームにおいて、GC(ガベージコレクション)実行時に非同期継続(async continuation)を保持するレジスタ(ecx)をマーク対象に追加する修正です。.NET CLRのABI仕様に定義されている非同期呼び出し規約に準拠し、GCプローブ中にecxレジスタが保護されるようになります。
ByteMarkベンチマークのインタープリター実行パフォーマンスを改善するPRです。チェックビルドで2~3倍の高速化を実現しています。主な改善は、(1) 配列アクセス時のOBJECTREFオーバーヘッド削減、(2) IL stubから呼び出されるインタープリターコードの直接キャッシング、の2つです。
このPRは、GS(Guard Stack)クッキーのセキュリティチェック処理をJITコンパイラのパイプラインで後期段階(LIR)に移動させ、非同期変換の後に実行するように改善しています。従来はIR段階で実行されていたため、非同期メソッドの暗黙的なbyref パラメータとの組み合わせで、サスペンションポイントを越えて無効なポインタが生存する問題が発生していました。LIR段階での実行により、この問題を解決します。
PR #120634 で導入された >2GB ファイルのパーティショニング機能にIndexOutOfRangeExceptionバグが存在していました。パーティショニングにより1つのファイルが複数のSendPacketsElementに展開されるとき、_sendPacketsFileHandles配列のインデックス追跡が誤っていたため発生していました。修正では、パーティショニング時に並列配列_sendPacketsElementsFileHandleIndicesを構築し、各要素がどのファイルハンドルを使用するかを追跡するようにしました。
// 修正前: インデックスカウンタがファイルハンドル数を超える
// File 2.1GB → 2要素に展開, File 1MB → 1要素
// カウンタ: 0, 1, 2 に対して _sendPacketsFileHandles は長さ2
// 修正後: 並列配列で正確にマッピング
// _sendPacketsElementsFileHandleIndices: [0, 0, 1]
// 各要素が正しいハンドルインデックスを記録
AsyncEnumerable の Append、Prepend、Concat 操作のパフォーマンス低下を解決するために、同期LINQ実装と同様の coalescence(合体)最適化を導入しました。これにより、連鎖した Append 操作で約900msから280μsへの大幅な性能改善が実現されます。
// 最適化前:深いネストされたイテレータ構造
var enumerable = AsyncEnumerable.Empty<int>();
for (int i = 0; i < 10000; i++)
enumerable = enumerable.Append(i); // 毎回新しいイテレータを生成
// 最適化後:操作が自動的に合体される
return await enumerable.SumAsync(); // 900ms → 280μs
ILC(IL Compiler)において、RyuJitがジェネリックメソッドをインライン化する際に、部分的にインスタンス化された(open generic)メソッドの具体的な依存関係を追跡できていない問題を修正します。ShadowConcreteMethodNodeをShadowGenericMethodNodeに拡張し、完全にインスタンス化されていない一般的なメソッドの依存関係も追跡するようにしました。これにより、AOT コンパイル時にコード生成に必要な依存関係が確実に利用可能になります。
// 修正の対象例:Callee<object, T>がCaller<string>にインライン化される場合、
// Container<object>の依存関係が追跡されるようになります
static string Caller<T>() => Callee<object, T>();
ConfigurationBuilder.AddJsonFileで相対パスを使用した際、ファイル変更時のOnChangeイベントが発火しない問題を修正しました。PhysicalFilesWatcherの相対パス処理を改善し、ファイル監視が正常に動作するようになります。
このPRは、browser/WASM性能パイプラインのアーティファクト準備ステップに明示的な /p:RuntimeFlavor=Mono パラメータを追加するものです。これにより、性能パイプラインが他のbrowser/WASM構成と一致し、PR #122495からの回帰を修正します。
Copilot Coding Agent (CCA) 向けの PR テンプレートを新規追加しました。従来の servicing PR テンプレートが CCA 生成の PR に不適切なセクションを含んでいたため、CCA が専用テンプレートを使用するよう誘導する目的です。新テンプレートは HTML コメント以外のコンテンツは含まず、CCA のデフォルト動作に委ねる設計になっています。
#122045でZipCompressionMethod.Deflate64が公開APIになったため、Deflate64Fuzzerの反射処理を削除し、公開enum値を直接使用するように更新しました。反射の削除により、コード保守性とパフォーマンスが向上します。
// 変更前: 反射を使用してenum値を取得
// 変更後: 公開APIの ZipCompressionMethod.Deflate64 を直接使用
var compressionMethod = ZipCompressionMethod.Deflate64;
Mono JITコンパイラのhelpers.cにおいて、opコード変数がOP_LAST値を取得する特定の条件下でバッファオーバーフローが発生する脆弱性を修正しました。opidx配列のサイズがOP_LAST - OP_LOAD要素であるため、境界チェックが不足していました。Linux Verification Center(SVACE)によって検出されたセキュリティ問題です。
no-pthreads共有メモリ実装におけるデッドロック問題を解決するため、名前付きMutex廃棄時のロック取得順序を修正しました。Wait Subsystemロックを保持したまま共有メモリプロセスレベルロックを取得していたのを、ロック順序を逆転させることで回避します。これにより、aspnetcore PR #65006がブロック解除されます。
aspnet2 SPMI収集スクリプトの動的バージョンチャネル使用に関する問題を修正しました。スクリプトが以前は "latest" チャネルを使用しようとしてビルド失敗が発生していたため、特定の .NET 10.0 RTM バージョンに一時的にピンニングするワークアラウンドを実装しています。
RyuJit/WASM コードジェネレーターのリファクタリングPRです。主な変更は、整数型と浮動小数点型の Live-in マスク用フィールドを統一し、単一のマスクフィールドに統合したことです。また、genEnregisterIncomingStackArgsメソッドが実装されました。このPRは差分がないはずの(no-diff)リファクタリングです。
InstructionSet列挙型から管理型へのマッピングロジックに合わせて、InstructionSetDesc.txtテーブルを修正しました。管理名を持つISAのみ管理名を記載し、管理型を持たないISAにはR2R名のみを使用するようにしました。この修正により、マッピングロジックと定義テーブルの一貫性が確保されます。
System.UriクラスにUriSchemeData定数を追加するPRです。データURI(data:スキーム)を扱う際に、文字列をハードコーディングする代わりに定数を使用できるようになります。.NET 6で確立されたURI スキーム定数の追加パターンに従っています。
namespace System
{
public partial class Uri
{
/// <summary>Specifies that the URI is a data URI.</summary>
public static readonly string UriSchemeData = "data";
}
}
このPRはブラウザプラットフォーム上のCoresCLR向けにJavaScript相互運用機能を実装しています。camelCase命名規則に対応し、C#とJavaScript間のマーシャリング、Promise/Task処理、オブジェクトライフタイム管理、双方向関数呼び出しの基盤を構築しました。CoreCLR向けにはLibraryImportとUnmanagedCallersOnlyを使用し、Mono互換性も維持しています。
// JavaScriptExports(Mono互換とCoresCLR向けの分岐実装)
[UnmanagedCallersOnly] // CoreCLR
public static void BindManagedFunction(...) { ... }
このPRは、XUnit wrapper生成器のouterloopテスト優先度追跡メカニズムを修復するものです。以前の実装で汎用的なPriorityプロパティが失われたため、outerloopテストが正しく実行されていませんでした。本変更により、テストインフラストラクチャ全体で使用されているCLRTestPriorityToBuild MSBuildプロパティに統一し、正常なテスト実行動作を復元します。
インタープリタ関連のテストを無効化するPull Request。複数のテストプロジェクト設定ファイルに対して、インタープリタでの実行を除外する設定が追加されています。各ファイルで1行ずつの追加となっており、テスト実行時の互換性問題やテスト失敗への対応と考えられます。
ファジングから生成されたテスト入力に対してコード カバレッジ レポートを生成するプロセスを自動化します。従来は複数の手動ステップが必要でしたが、collect-coverage.ps1 スクリプトにより、単一のコマンドで自動化できるようになります。
.\collect-coverage.ps1 HttpHeadersFuzzer inputs
このスクリプトは coverlet と reportgenerator ツールを使用して、アセンブリのインストルメンテーション、PDB ファイル管理、HTML レポート生成を自動化します。
プロセスシャットダウン時のベクタデストラクタによる競合状態を排除するため、process.cppをリファクタリングしました。std::vector<const char*> g_argvCreateDumpを固定サイズ配列(32エントリ)に置き換え、クラッシュダンプ生成時の潜在的なクラッシュやハングを防止します。
// 変更前
std::vector<const char*> g_argvCreateDump;
g_argvCreateDump.push_back(arg);
// 変更後
const char* g_argvCreateDump[MAX_ARGV_ENTRIES];
g_argvCreateDump[index] = arg;
CLRインタープリタモード(interpmode=2)使用時にデバッガが正常に動作しなかった問題を修正するPRです。EECodeInfo インフラストラクチャがインタープリタのスタブアドレスではなく実際のバイトコードアドレスを取得できるように改善されました。新たに GetInterpreterCodeFromInterpreterPrecodeIfPresent 関数を追加し、インタープリタプリコード(precode)から実際のバイトコードアドレスをアンラップして取得するようになります。
NativeAOT限定で、DOTNET_DbgCreateDumpToolPath 環境変数を追加し、createdumpツールのカスタムディレクトリを指定できるようにしました。createdumpが含まれていない環境で、ユーザーが独自のダンプ生成ツールを提供できます。
// 使用例
export DOTNET_DbgEnableMiniDump=1
export DOTNET_DbgCreateDumpToolPath=/path/to/directory
./myapp
// ランタイムは /path/to/directory/createdump を探します
WebAssembly向けのRyuJIT実装における呼び出し規約(Calling Convention)に関する包括的なドキュメントを追加しました。R2R(Ready-to-Run)およびJITコンパイル済みマネージドコードがWebAssemblyのスタックモデルとどのように相互運用するかを説明しています。
ARM ハードウェア内在関数のテストヘルパーメソッドをリファクタリングしました。型固有の overflow 検出実装を複数削除し、IBinaryInteger<T> と BigInteger を使用した汎用メソッドに統合しました。これにより、コード重複が削減され、overflow 検出の正確性が向上しました。
// 汎用な overflow 検出メソッドの例
public static bool TryAddOverflow<T>(T a, T b, out T result)
where T : IBinaryInteger<T>
{
// BigInteger を使用して正確な範囲チェックを実行
}
このPRは、TarEntry.DataStreamをシークできないストリームで破棄した後にTarReader.GetNextEntry()を呼び出すとObjectDisposedExceptionがスローされていた既存のバグに対するリグレッションテストを追加します。バグ自体は既に修正済みで、SubReadStream.AdvanceToEnd()メソッドが破棄時にスローするプロパティではなく内部フィールドに直接アクセスするように改善されています。
例外処理(EH)の不要なコードパスをクリーンアップし、ThreadStartExceptionをマネージドコードに移動するPRです。特に、RaiseExceptionが必要な場合とDispatchManagedExceptionで十分な場合を区別し、Windows上での例外相互運用性を改善しています。
ZipArchiveで4GBを超えるファイルが4GBを超えるオフセットに書き込まれる際、ZIP64ヘッダが破損する問題を修正しました。WriteCentralDirectoryFileHeaderInitializeメソッドでオフセット設定時にZip64ExtraFieldが上書きされ、ファイルサイズ情報が失われていました。修正により、null-coalescing演算子(??=)を使用してサイズ情報を保持しながらオフセットを追加するようにしました。
// 修正前:サイズ情報が上書きされる
zip64ExtraField = new() { LocalHeaderOffset = _offsetOfLocalHeader };
// 修正後:サイズ情報を保持、オフセットを追加
zip64ExtraField ??= new();
zip64ExtraField.LocalHeaderOffset = _offsetOfLocalHeader;
このPRは、.github/policies/resourceManagement.ymlとdocs/area-owners.mdの間で、エリアラベル通知の購読者設定を同期しています。通知が正しいエリアリーダーとチームに送信されるよう、古い個別の購読者をチーム参照(例:dotnet/jit-contrib、dotnet/interop-contrib)に置き換え、所有権の割り当てを更新しました。
ValueStringBuilderに対して、デバッガー表示時に副作用を持たないデバッグ表示機能を追加しました。従来はToString()呼び出しでビルダーの内容がクリアされてしまい、デバッグ時に予期しない動作を引き起こしていました。[DebuggerDisplay]属性を追加し、ビルダーの内容を表示するが状態を変更しないプロパティを実装することで、デバッグ体験を改善しています。
Lazy.csのドキュメント文字列(XML documentation)を改善する軽微な変更です。Modeプロパティのサマリーに終了ピリオドを追加し、IsValueFaultedプロパティのサマリーを明確化して、値の作成時の失敗状態を示すよう改善しました。
BitArrayクラスにPopCountメソッドを追加しました。このメソッドはビット配列内で設定されている(1になっている)ビットの数をカウントします。BitArray内の1ビットの総数を効率的に取得する必要があるユースケースに対応します。
BitArray bits = new BitArray(new[] { true, false, true, true });
int count = bits.PopCount(); // returns 3
ReadOnlySequence<T>.GetOffset() メソッドのXML ドキュメンテーションを更新し、戻り値がゼロインデックスではないことを明確に伝えるようにしました。ゼロインデックスの値を得るための調整方法についてのRemarks セクションを追加しています。
/// <remarks>
/// The returned offset is not zero indexed from the start.
/// To obtain a zero-indexed value, subtract 1 from the returned offset.
/// </remarks>
Haiku OS向けのネイティブライブラリIO サポートを追加するPRです。ファイルシステムとマウントAPI(pal_io.cとpal_mount.c)にHaiku固有の実装を追加し、ポータビリティの向上に対応しています。これは#55803の一部の実装です。
このPull Requestは、release/8.0ブランチへの内部コミットのマージ作業です。具体的な変更ファイルや詳細情報が提供されていないため、リリース準備に関連する内部的なメンテナンス作業と考えられます。
このPull Requestは、dotnet/runtime リポジトリの release/9.0 ブランチ向けの内部コミットのマージです。ただし、詳細な変更内容は提供されていません。
Uri(Uri, Uri) コンストラクタが null の relativeUri パラメータを渡された際に NullReferenceException を投げる代わりに、適切に ArgumentNullException を投げるようにバグを修正しました。パラメータ検証時に例外が発生するようになり、デバッグ体験が向上します。
// 修正後: ArgumentNullException が即座に投げられる
Uri baseUri = new Uri("http://localhost/");
Uri result = new Uri(baseUri, (Uri)null); // ArgumentNullException with parameter name "relativeUri"
JIT コンパイラの関数シグネチャ変更に伴う呼び出し側の不整合を修正するパッチです。impGetNodeAddr 関数のシグネチャが #122381 で変更されましたが、#122167 で導入された呼び出しサイト impImportAndPushBoxForNullable が更新されていなかったため、ビルドが失敗していました。新しい allowedMustPreserveIndirFlags パラメータに GTF_IND_INITCLASS フラグを指定することで、nullable 型のボックス化時に initclass フラグの保持を許可するよう修正されました。
release/8.0-stagingをrelease/8.0にマージするメンテナンスPRです。主にバージョン情報、ビルドスクリプト、パイプライン設定、およびSystem.Net.HttpストレステストのDockerfile関連の更新が含まれています。OOB(Out-of-Band)パッケージの<GeneratePackageOnBuild>フラグのリセットは不要でした。
このプルリクエストは、dotnet/runtimeのrelease/9.0-stagingブランチをrelease/9.0ブランチへマージする定期的なリリース統合です。バージョン番号の更新、ビルド設定の調整、およびいくつかの技術的改善が含まれています。主な変更はバージョン管理ファイルとビルドパイプライン設定の更新です。
Composite ML-DSA仕様のdraft 14への対応により、コンテキスト認識署名のサポートを追加しました。テストベクトルが更新され、コンテキスト有無両方の署名検証シナリオをカバーするようになります。
WebAssembly (WASM) JIT コンパイラに stackification アルゴリズムの検証部分を追加しました。Stackification は WASM の stack-based アーキテクチャに最適化するための中核となるアルゴリズムです。現在は検証機能のみの実装であり、最適化ロジックは今後段階的に追加される予定です。また、呼び出し関連の軽微なバグ修正も含まれています。
PR #120625で導入されたリグレッションを修正します。垂直タブ(\v)がメタキャラクターリストに誤って追加され、Regex.Escape()が垂直タブをエスケープしていた問題を解決。垂直タブは正規表現のメタキャラクターではないため、エスケープされるべきではありません。修正はs_metacharsから\vを削除するだけで、IgnorePatternWhitespaceの正常な動作は保持されます。
// 修正前
SearchValues.Create("\t\n\v\f\r #$()*+.?[\\^{|");
// 修正後
SearchValues.Create("\t\n\f\r #$()*+.?[\\^{|");
System.DirectoryServices と System.Data.OleDb ライブラリで使用されていたカスタムの VARIANT および PROPVARIANT 型定義を、System.Runtime.InteropServices.Marshalling の標準 ComVariant 型に統一しました。Win32 VARIANT 型へのインターオップをベストプラクティスに従う形で実装し、コード重複を削減します。
// 変更前
Variant v = new Variant();
VariantInit(ref v);
// 変更後
ComVariant v = ComVariant.Create(true);
// ... 使用後 ...
v.Dispose();
ARM32プラットフォームで非同期継続オブジェクト参照を保持するr2レジスタをGC中に保護するための修正です。AMD64(rcx)とARM64(x2)の動作に合わせることで、hijack固定処理の正確性を確保します。
Ubuntu 24など、破損したGSSAPI実装を持つプラットフォーム上でNTLM認証テストを修正するPRです。ネイティブGSSAPIに頼らず、マネージド実装を使用することで、以前にスキップされていたテストが正常に実行されるようになります。
C言語のunion型のセマンティクスをサポートするExtendedLayoutKind.CUnionを実装しました。すべてのフィールドをオフセット0に配置し、型のサイズは最大フィールドのサイズで決定されます。CStructと同様にアンマネージドフィールドのみサポートし、auto layoutは非対応です。
// CUnion型の定義例
[StructLayout(LayoutKind.Explicit, Extended = ExtendedLayoutKind.CUnion)]
public struct MyCUnion
{
public int IntField; // offset 0
public long LongField; // offset 0 (サイズは8)
public float FloatField; // offset 0
}
このPRは、インタープリタが非同期再開スタブ(Async Resume Stub)をコンパイルしようとするのを防止します。これらのスタブはJIT固有の組み込み関数を使用しており、インタープリタは処理できません。代わりにJITまたはR2Rコンパイラによって生成されます。
// IsAsyncResumeStub() メソッドが DynamicMethodDesc に追加される
if (method->IsAsyncResumeStub())
{
// インタープリタでのコンパイルをスキップ
}
JsonNode.GetPath() が特殊文字を含むプロパティ名に対して、仕様に準拠した有効なJSON Path構文を生成していなかった問題を修正。プロパティ名が $ で始まる場合はドット記法ではなくブラケット記法を使用し、ブラケット記法内ではシングルクォートとバックスラッシュを適切にエスケープするようになります。
// Before: Invalid JSON Path returned
JsonNode.Parse("""{"$defs":{"foo['bar":"baz"}}""")["$defs"]["foo['bar"].GetPath();
// Returns: $.$defs['foo['bar']
// After: Valid JSON Path returned
// Returns: $['$defs']['foo[\'bar']
JsonSerializer.Serializeが[JsonExtensionData]属性を持つJsonObject型のプロパティをシリアライズする際、無効なJSONを生成していたバグを修正します。
var mix = new Mix { Id = 1, Extra = new JsonObject { ["nested"] = true } };
JsonSerializer.Serialize(mix);
// 修正前: {"Id":1,{"nested":true}} ← 無効なJSON
// 修正後: {"Id":1,"nested":true} ← 正常
CharSearchValuesPolyfill._ascii 配列のサイズが誤って uint[8] になっていたのを uint[4] に修正しました。ASCII文字(0-127)のビットマップ検索は c >> 5 によるオフセット(0-3)を使用するため、4要素が必要です。このバグにより、非ASCII文字(オフセット4-7)が誤ってバウンズチェックを通過し、NonAsciiContains() にフォールスルーせず、不正な検索結果が返されていました。
// 修正前: 非ASCII文字 char(200) が誤って _ascii[6] を検索
private readonly uint[] _ascii = new uint[8];
// 修正後: 非ASCII文字 char(200) が正しく NonAsciiContains に処理される
private readonly uint[] _ascii = new uint[4];
このPRはControl Flow Guard (CFG)が有効な場合のインターフェースメソッド呼び出しを、スタブディスパッチャーから高速解決ヘルパー(RhpResolveInterfaceMethodFast)経由に変更します。JIT下位化時にVSD呼び出しをリゾルバー呼び出しに変換し、二重間接参照を排除してパフォーマンスを改善します。
// インターフェースメソッド呼び出し
static int Call(IFoo f, int x, int y) => f.Call(x, y);
このPRはOpenSSL設定が不正な場合にセグメンテーション違反で.NETアプリケーションがクラッシュする問題を修正します。リリースビルドでassert()がコンパイルされて削除されることが原因で、DetectCiphersuiteConfiguration()関数内のエラーチェックが機能していません。修正により、不正なOpenSSL設定時にはデフォルトの暗号スイートへ自動的にフォールバックし、正常に動作継続します。
// 修正前(リリースビルドで assert() が削除される)
int rv = SSL_CTX_set_cipher_list(ctx, "ALL");
assert(rv); // コンパイルされない!
// 修正後(実行時エラーハンドリング)
int rv = SSL_CTX_set_cipher_list(ctx, "ALL");
if (!rv) {
ERR_clear_error();
SSL_CTX_free(ctx);
return; // デフォルト設定で続行
}
FileInfo.Create() に FileSystemRights.Read を指定した際に、返された FileStream の CanWrite プロパティが誤って true になる不具合を修正しました。根本原因は GetFileAccessFromRights メソッドのビット演算ロジックの誤りで、複合フラグ(FullControl、Modify)に対して「ビットが1つでも重なっているか」を確認していました。
修正前後の比較:
// 修正前(誤り)
if ((rights & FileSystemRights.FullControl) != 0)
return FileAccess.ReadWrite;
// 修正後(正)
if ((rights & FileSystemRights.FullControl) == FileSystemRights.FullControl)
return FileAccess.ReadWrite;
impGetNodeAddrが返すフラグ(volatile、unaligned、initclass)を5つのコールサイトが無視していた問題を修正します。allowConfiguredDerefsパラメータを追加し、volatile/unaligned/initclassフラグを含む間接参照をサポートできないコンテキスト(VMヘルパーへのアドレス渡し)では、フラグを保持するテンポラリ作成にフォールスルーするようにしました。
JITコンパイラのRange Check Analysis(境界値チェック最適化)を強化し、ビット演算(AND、OR、シフト、MOD)を含む式の値範囲を正確に計算できるようにしました。これにより、Base64エンコーディングなどのビット演算パターンで不要な境界チェックが自動的に削除されます。
サンプル:
int Test(byte inData)
{
ReadOnlySpan<byte> base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="u8;
return base64[((inData & 0x03) << 4) | ((inData & 0xf0) >> 4)];
}
最適化により、生成されるアセンブリのコードサイズが55バイトから36バイトに削減されました。
JITコンパイラにジェネリック仮想メソッドのdevirtualization(仮想化解除)機能を追加しました。実行時に正確な型が判明している場合、仮想メソッドの呼び出しを直接呼び出しに最適化できるようになります。これにより仮想ディスパッチのオーバーヘッドを削減し、インライン化などの後続最適化が可能になります。
public class IntProcessor : VirtualGenericClass
{
public override void Process<T>(T item)
{
Console.WriteLine(item.ToString());
}
}
// 以前は仮想ディスパッチが必須でしたが、
// 今後は型が判明していればdevirtualizeされます
VirtualGenericClass c = new IntProcessor();
c.Process(42);
RangeCheckの最適化により、同じブロック内で先行して生成された境界チェックアサーションを活用できるようになりました。従来は保守的にbbAssertionInのみを使用していましたが、本変更でブロック内部(inter-block)のアサーションも累積することで、冗長な境界チェックを削除可能になります。提供されたコード例では、i++後のarr[i] = 0での境界チェックが不要と判定され、5バイトのコード削減を実現しています。
Mono ランタイムにおいて、ジェネリック型パラメータの NullableAttribute メタデータが失われていた問題を修正しました。KeyValuePair<TKey, TValue> の nullability 検出が正常に機能していなかったため、ASP.NET Core の DataAnnotations テストで不正な NotNull 判定が発生していました。
// 修正前: Mono で Nullable が正しく検出されない
var kvpType = typeof(KeyValuePair<string, object>);
var keyProperty = kvpType.GetProperty("Key");
var nullabilityContext = new NullabilityInfoContext();
var result = nullabilityContext.Create(keyProperty);
// 期待値: Nullable
// 実際: NotNull(修正前)
X509Certificate2PemTests に関連するテスト項目をCredScanSuppressions.jsonの除外リストに追加するPull Requestです。セキュリティスキャンツール(CredScan)の誤検知を抑制するための設定変更です。
このPRは、Enum.Equals/GetHashCode の最適化実装を簡潔にするものです。RyuJIT が Equals の最適化を実装したため(PR #122779)、カスタム IL サンク生成を削除し、CoreCLR VM と同じアプローチを採用しています。GetHashCode 最適化は constrained call 解決時に enum 型を基になる型に置き換えることで実現されます。
Uri の UriFormat.Unescaped コードパスにおいて、空のスパンを処理する際に発生するデバッグアサーション失敗を修正しました。Overlaps メソッドが空のスパンに対して誤った判定を行うため、アサーション条件を修正して空のスパンチェックを追加しました。
.NETランタイムのGC(ガベージコレクション)から、未使用の SORT_MARK_STACK 機能と関連する rqsort1 関数を削除するPRです。このマーク スタック ソート機能は本番ビルドで有効化されておらず、現在はプリフェッチ最適化がマーク フェーズで利用可能となっているため、不要なコードの削除となります。
インタープリタベースのプラットフォーム向けハードウェア組み込み関数のルーティングロジックを最適化するPRです。サポートされている命令セットのみからメソッドをルーティングするよう変更され、システムモジュール内の全ハードウェア組み込み関数型を走査する必要がなくなりました。新しいLookupPlatformIntrinsicTypesヘルパーメソッドを追加し、命令セットから管理型へのマッピングを効率化しています。
このPRは、PInvokeArgIteratorを使用した未使用のネイティブスタック引数サイズ計算を削除し、ランタイムコードを簡素化します。デリゲートから関数ポインタを構築する際に、構造体パラメータのマーシャリングに関連する計算を削除することで、Unix X64プラットフォームでのコードサイズ削減と、すべてのWindows以外のプラットフォームでのわずかなパフォーマンス向上を実現します。Windows COM シナリオではPInvokeArgIteratorが引き続き必要なため、そこは未修正です。
ブートストラップビルドが事前ビルド使用状況追跡ファイルを上書きするという問題(#122968)を修正しました。ビルドの各段階が独立した追跡ファイルを保持するように、ブートストラップビルド中のカスタムパスを設定します。
このPRは、.NET runtimeのCI/CDパイプラインにおけるmacOS Helixテストキューを、バージョン13からバージョン14へアップグレードするものです。arm64およびx64アーキテクチャ向けのテスト基盤をmacOS 14に統一し、CI/CDインフラの最新化を図っています。
WebAssembly(WASM)上で実行される.NET CoreCLRランタイムのテストスイートをReleaseビルドでCI環境で有効化するPRです。System.Runtime.Testsを含む主要なライブラリテストがWasmプラットフォームで実行可能になり、複数の関連するランタイム問題の修正と回避策が含まれています。主な変更は、IL Trimmingの無効化、インタプリタから管理コードへの呼び出しシグネチャの追加、Emscriptenビルドの最適化です。
HashSet<T>.UnionWithメソッドを最適化し、空のHashSet<T>に対して同じコンパレアを持つ別のHashSet<T>から呼び出された場合、各要素を個別に追加するのではなく、内部データ構造を直接コピーするようにしました。これにより、Clear後にUnionWithで再入力するパターンでのパフォーマンスが向上します。
// 最適化の概要
if (Count == 0 && other is HashSet<T> otherAsSet &&
EffectiveEqualityComparersAreEqual(this, otherAsSet))
{
ConstructFrom(otherAsSet); // 直接コピー
return;
}
カスタム JsonConverter<object> が特定の型(例:string)を CanConvert で処理する場合、文字列キーを持つディクショナリをシリアライズする際に StackOverflowException が発生する問題を修正しました。根本原因は CastingConverter の無限再帰で、ソースコンバーターの型が対象型と一致しない場合に無限ループが発生していました。
// 修正前に再現する例
public class GenericJsonConverter : JsonConverter<object>
{
public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(string);
public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString();
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) => writer.WriteStringValue(value.ToString());
}
var options = new JsonSerializerOptions { Converters = { new GenericJsonConverter() } };
var value = new Dictionary<string, int> { { "key", 123 } };
JsonSerializer.Serialize(value, options); // StackOverflowException
OpenSSL 4.0-dev との互換性を確保するため、System.Security.Cryptography.Native の関数シグネチャにconst修飾子を追加しました。OpenSSL が const を要求するようになった複数のメソッドに対応し、今後の OpenSSL 本体ブランチとの互換性を維持できるようにしています。
.NET 10で導入されたUseSizeOptimizedLinq=true時に使用されるSizeOptIListSelectIteratorおよびSizeOptIListWhereIteratorが、保持している_enumerator参照を破棄していない回帰バグを修正。カスタムIList<T>実装でEnumerator破棄を追跡している実装(例:ICSharpCode.Decompiler)が機能しなくなっていた。
public override void Dispose()
{
if (_enumerator is { } e)
{
_enumerator = null;
e.Dispose();
}
base.Dispose();
}
KeyAnalyzer.csのコメントを更新し、以前のPR #119673でIsAllAsciiからAscii.IsValidに変更された実装に合わせて、コメント記述を修正するものです。コード実装は変更されず、ドキュメンテーションの正確性を向上させています。
このPRはmacOS 13からmacOS 15(Xcode 16対応)へのビルドイメージアップグレードを行うcherry-pickです。パブリックビルドの既定イメージをmacOS 15に更新し、新環境で互換性のないSwift相互運用性ストレステストを除外します。ビルドプラットフォームは常に最新バージョンを使用すべきという指針コメントも追加されています。
非ASCII文字を含むURIの正規化ロジックをParseRemainingから独立したParseRemaining_RecreateNormalizedStringヘルパーメソッドに分割し、約5個の一時的な文字列割り当てを削減。コード可読性の向上とメモリ効率化を実現しました。
// 変更前:複数の場所で正規化を繰り返し実行
if (HasUnicode)
{
_string += Normalize(_originalString, origIdx, ...);
}
// 変更後:単一のヘルパーメソッドで統合
if (HasUnicode)
{
Rebuild(); // 一度の処理で全ての正規化を完了
}
ZipArchiveEntry.Open() と OpenAsync() に FileAccess パラメータを受け付ける新しいオーバーロードが追加されました。これにより、ユーザーは ZipArchiveMode.Update モードで開かれたアーカイブから、エントリを読み取り専用で効率的にストリーミング読込できるようになります。従来は常に読み書き可能なストリームが返され、メモリ全体にデコンプレスされていました。
public Stream Open(FileAccess access);
public Task<Stream> OpenAsync(FileAccess access, CancellationToken cancellationToken = default);
NativeAOT テストをランナー統合後もモバイルプラットフォーム上で実行できるように、各テストプロジェクトを独立した「マージされたランナー」として設定し直しました。また、CoreCLR と NativeAOT の ComWrappers 実装が共有化されたため、重複していた ComWrappers テストを削除しました。
System.Timers.Timerの一度限りのタイマー(AutoReset=false)で、発火後にIntervalまたはAutoResetを設定すると、タイマーが意図せず再起動してしまい、その後Stop()が機能しなくなるバグを修正しました。UpdateTimer()メソッドに_enabledフラグのチェックを追加することで、無効化されたタイマーの再起動を防ぎます。
private void UpdateTimer()
{
if (_timer is null || !_enabled)
{
return;
}
int i = (int)Math.Ceiling(_interval);
_timer.Change(i, _autoReset ? i : Timeout.Infinite);
}
System.Security.Cryptography.Xml ライブラリの単体テストカバレッジを大幅に向上させるプルリクエストです。特に CanonicalXmlEntityReference クラスのカバレッジを 0% から 92.8% に引き上げ、XML正規化変換、エンティティ参照、ハッシング処理などをカバーする複数の新規テストケースが追加されています。
macOS内部ビルドイメージをmacOS-13からmacOS-15に更新するインフラストラクチャ変更です。Azure Pipelinesの設定を更新し、macOS、Mac Catalyst、iOS、tvOS、およびそれらのシミュレータプラットフォーム向けの内部ビルドがより新しいmacOSバージョンで実行されるようになります。
dotnet/runtimeプロジェクトのcopilot-instructions.mdを再構成し、AIコーディングエージェントが基本ビルド(baseline build)をスキップするのを防止しました。基本ビルドを最初のセクションに移動し、⚠️MANDATORYの強調表示と明示的な警告を追加。ドキュメントを約325行から約185行に削減(43%削減)し、スキャン性を向上させました。
Uri パス正規化処理において、Compress メソッドが先頭スラッシュのないパス全体を削除した場合に発生していたデバッグアサーション失敗を修正しました。ValueStringBuilder の this[] アクセッサで範囲外読み込みが発生していましたが、実際の動作は安全です。修正内容は dest.Length > start の境界チェック追加です。
DOTNET_DbgEnableMiniDump環境変数が設定されている場合、createdumpバイナリが存在しないことを示すエラーメッセージがランタイム初期化時に出力されていました。この変更により、エラーメッセージの出力をダンプ作成時点まで遅延させることで、crossgenのようなダンプ生成が不要なシナリオでの不要な警告を排除します。
Enum.EqualsメソッドをJIT intrinsicとして実装し、enum比較時のボックス化を排除します。ジェネリック型パラメータでのenum比較が、ボックス化なしで直接基礎型の値を比較するように最適化されます。アセンブリコードサイズが70バイトから10バイトへ削減され、パフォーマンスが大幅に向上します。
bool Test<T>(T a, T b) => a.Equals(b);
// Test<MethodImplOptions>呼び出し時、ボックス化せず直接比較に最適化
macOS のデフォルトビルド環境を macOS 13 から macOS 15(Xcode 16 を含む)にアップグレードするもの。パブリックビルドプールのインフラストラクチャを更新し、新しい環境で失敗する Swift 相互運用性ストレステストを除外します。
内部メソッド DumpHeaders の署名を、C# 12のparams ReadOnlySpan<T>を使用するように更新しました。従来のparams arrayによる不要なヒープ割り当てを排除しています。APIサーフェスの変更はなく、内部実装のみの改善です。
// 変更前
internal static void DumpHeaders(ref ValueStringBuilder sb, params HttpHeaders?[] headers)
// 変更後
internal static void DumpHeaders(ref ValueStringBuilder sb, params ReadOnlySpan<HttpHeaders?> headers)
非同期処理の大規模テスト(CapacityTests)がGCストレステスト時に問題を起こすため、[SkipOnCoreClr("", RuntimeTestModes.AnyGCStress)]属性を追加してスキップするようにマークしました。対象は4万個のメソッドを持つテストクラスを動的に生成するテストメソッド3つです。
NativeAOT (Ahead-Of-Time) コンパイルでプロキシ型マップのエントリが不正にトリミングされる問題を修正します。ジェネリック型がランタイムで動的にインスタンス化される可能性がある場合、型ローダーテンプレートを保持するための依存関係を自動的に作成するようになりました。これにより、リフレクション経由でジェネリック型が生成される際に必要な型情報が確実に保存されます。
Copilot Coding Agent (CCA)のセットアップ時間を短縮するPRです。従来は初期セットアップに20分以上の完全ビルドが必要でしたが、このビルドステップを削除し、指示を柔軟化することで初期化時間を削減します。コメントやドキュメント変更時はビルドをスキップできるようにし、System.Private.CoreLibの作業ガイダンスも追加しています。
CLDR グローバライゼーションデータの更新により、ak-GH ロケールの AM/PM 指定子が AN/ANW に変更されました。新しい値では AM 指定子が PM 指定子のプリフィックスになるため、DateTime パース時にバグが発生していました。このプリフィックスの問題に対応するため、常に最長マッチを優先的にパースし、必要に応じてフォールバックする修正です。
// 修正例:PM指定子がAM指定子を含む場合に最長マッチを優先
if (pmDesignator.StartsWith(amDesignator))
{
// PM指定子の方が長い場合は優先的に照合
// その後AM指定子にフォールバック
}
WebAssembly JIT コードジェネレータにおいて、PackOperAndType 関数が TYP_REF(オブジェクト参照型)のチェックを欠落していた問題を修正しました。既存の TYP_BYREF(マネージドポインタ型)チェックと同様に TYP_REF も TYP_I_IMPL(ネイティブ整数型)に正規化する処理を追加し、100件以上の superPMI テストの失敗を解決しています。
System.Net.Security.Nativeの検出ロジックを修正するPRです。CheckHasSystemNetSecurityNativeメソッドが、ネイティブinterop機能の可用性を正しく判定するようにしました。従来はgss-ntlmsspの存在を誤って検出していましたが、GSSAPI呼び出し可能なネイティブinteropの実際の可用性に基づいて判定するよう改善されています。
// 修正内容:ネイティブinteropが実際に利用可能かつ
// GSSAPI呼び出しが可能な場合にのみtrueを返すよう改善
GetFullName(DefType) 拡張メソッドをTypeSystemHelpers.csから削除し、EcmaType.csの唯一の使用箇所をThrowHelper.ThrowTypeLoadException(this)に置き換える内部リファクタリング。他のGetFullNameオーバーロード(TypeDesc、FieldDesc、MethodDesc)は変更なし。
// 変更前
throw new TypeSystemException.TypeLoadException(ExceptionStringID.ClassLoadGeneral, GetFullName());
// 変更後
ThrowHelper.ThrowTypeLoadException(this);
.NET 10で導入されたEC-DSA/EC-DH PEM鍵ロードの順序変更に起因するリグレッションを修正します。PKCS#8形式の秘密鍵に埋め込まれたキー使用属性を検査するようにロジックを改善しました。Windows CNGが書き出したPKCS#8鍵のdigitalSignatureなどの属性を尊重し、EC-DSAキーが誤ってEC-DHとしてロードされる問題を解決します。
// 修正前の問題:PKCS#8の属性を無視してEC-DHでロード
// 修正後:PKCS#8の keyUsage 属性を確認してから適切なアルゴリズムでロード
X509Certificate2.ImportFromPem(pemData); // 正しく処理される
CLR インタープリタの例外処理(EH)ロジックにおけるエッジケースを修正しました。try ブロックが別の try/finally または try/catch ブロックを完全に囲み、ハンドラーが try 本体の終了地点と同じ位置で終了する場合に、leave チェーン島の ilOffset 表現でオフバイワン エラーが発生していた問題を解決しました。
タイムアウトPingテストが到達不可能なテストターゲットに対して実行されるときの誤検出を防ぐ改善です。テストターゲットがDestinationNetworkUnreachableステータスを返す場合、テストをSkipTestExceptionで動的にスキップするようになりました。
JITの非内部ブロック(non-internal block)に関する不変条件を修正するPRです。async rewriteで生成されるブロックがBBF_IMPORTEDフラグを適切に設定していなかったため、デバッグ検証で失敗していました。非内部ブロックは常にBBF_IMPORTEDでマークされる必要があるという JIT の不変条件を守るため、BBF_INTERNALフラグを削除した後にBBF_IMPORTEDフラグを追加します。
Fast tailcall で含まれた間接呼び出しターゲット(contained indirection)を使用する際の GC 情報追跡バグを修正しました。レジスタが消費される際に GC ポインタ情報が失われていた問題を、引数レジスタと同じパターンで base/index レジスタの GC ポインタ情報を明示的に復元することで解決します。
WebAssembly(WASM)環境におけるstructのメモリレイアウトをC言語のレイアウト規則に合わせるために修正されました。8バイト整列が必要なWASM型において、ハードコーディングされた8バイト整列ではなく、実際のフィールド整列要件を参照するように変更されています。
iOS および tvOS デバイステスト基盤を、スカウティング用 Helix キューから macOS 15 搭載の本番環境キューへ移行します。これにより、以前無効化されていた tvos_arm64 および ios_arm64 プラットフォームが有効化され、iOS/tvOS デバイスのテストが再開可能になります。
SYSLIB1045アナライザーがマルチライン正規表現パターンに対して診断を報告する際、エディタの全行に"..."のサジェスション修飾子を表示していた問題を修正しました。診断スパンを開き括弧の前までに絞ることで、Regex.IsMatch、new Regex、target-typed newなどのメソッド/コンストラクタ名のみを指すようにしています。これにより、マルチラインパターンでのUI混雑を改善します。
このPRは、.NET 10.0以上をターゲットとしているため、すべての [GeneratedRegex] 属性の宣言をメソッド構文からプロパティ構文に変換します。プロパティ構文はプロパティアクセス形式 { get; } を使用でき、コードをより簡潔にすることができます。
変換例:
// 変更前(メソッド構文)
[GeneratedRegex(...)]
static partial Regex Something();
// 変更後(プロパティ構文)
[GeneratedRegex(...)]
static partial Regex Something { get; }
Mono ランタイムのビルド時に発生していた IDE0036 修飾子順序エラーを修正するPRです。SpanHelpers.ByteMemOps.cs の2つのメソッド (memmove と memset) の修飾子順序を C# コーディング標準に準拠させました。修飾子の順序を private static unsafe extern から private static extern unsafe に修正しています。
EventSourceGeneratorは内部ツールとして位置づけられているため、.NET Core App参照パック(ref pack)から除外する変更です。Issue #121180で内部ツールとして分類されたことに伴う対応です。
testhost フォルダ作成時に、dotnet、hostfxr、hostpolicy のホストコンポーネント用シンボルファイル(Windows では PDB、他のプラットフォームでは .pdb/.dwarf)をコピーするよう変更されました。これにより、デバッグおよびプロファイリング時により詳細な情報が利用可能になります。
Wasm RyuJITコンパイラにおいて、命令選択関数ins_Loadとins_StoreでTYP_REFおよびTYP_BYREFの型ケースが欠落しており、superpmi replayの際にアサーション失敗が発生していました。本PRでは、これらの型ケースを追加し、WASM32の4バイトポインタに対応するi32命令にマッピングすることで解決しています。
CoreCLR インタプリタの UnhandledException ハンドラの実行タイミングを修正しました。従来は finally ブロック実行後に実行されていましたが、本変更により最初のパス例外処理(first pass EH)中に例外が検出された時点で実行されるようになります。これにより baseservices/exceptions/UnhandledExceptionHandler/NoEffectInMainThread テストの失敗が解決されます。
C# 製 ilasm ツールの EntityRegistry で複数の機能を実装しました。ClassLayout、FieldLayout、FieldRVA テーブルのエミット対応、pinned 型署名のサポート、アセンブリ修飾名の完全構築、コア アセンブリ解決ロジックの改善などが含まれます。これにより native ilasm との互換性が向上します。
BufferedStream.WriteToUnderlyingStreamAsyncで~1GB以上のバッファ書き込み時にOverflowExceptionが発生する符号付き整数オーバーフロー問題を修正。同期メソッドのWriteでは既に(uint)キャスティングで対応済みだったが、非同期パスに対応漏れがあったため修正。
// 修正前(OverflowException発生)
useBuffer = (totalUserBytes + buffer.Length < (_bufferSize + _bufferSize));
// 修正後(int.MaxValueまで対応)
useBuffer = ((uint)totalUserBytes + buffer.Length < (_bufferSize + _bufferSize));
WebAssemblyターゲットがサポートしていないmadviseシステムコールを、CoreCLRおよびネイティブライブラリ全体で無効化するPull Requestです。TARGET_WASMガード条件を追加することで、WASM環境でのランタイム問題を防止します。
WebAssembly (Wasm) ターゲットにおいて、genCreateAddrMode 関数を無効化しました。これにより SuperPMI の失敗カテゴリに対応しています。Wasm では従来のアドレスモード最適化が適切に機能しないため、この機能を制限することで JIT コンパイルの安定性を向上させます。
ブラウザホストのアセット読み込み機能を大幅に改善するPRです。ダウンロード時の並列数制限とリトライロジック、PDBファイル対応、モジュールライフサイクルフック(onRuntimeConfigLoaded、onRuntimeReady)、ダウンロード進捗コールバック(Module.onDownloadResourceProgress)を追加し、信頼性と拡張性を向上させました。また、Emscripten APIを簡潔化し、remoteSourcesサポートを削除しました。
このPRはWebAssembly環境において、ネイティブイメージ(.ni.dll)のプローブ処理を削除することで、アセンブリロードのパフォーマンスを最適化しています。WASM環境ではネイティブイメージが非対応となったため、不要なプローブロジックと関連する遺産コードを削除し、スタートアップパフォーマンスを改善します。
// 変更前: すべてのプラットフォームで.ni.dllをプローブ
// 変更後: WASM環境では.ni.dllプローブを除外
#ifdef TARGET_WASM
// .ni.dllプローブをスキップ
#endif
R2R(ReadyToRun)PE ファイルのセクション数を削減するため、セクションフォルディング機構を導入しました。ObjectNodePhase.Ordered と ObjectNodeOrder を使用してPEデータディレクトリエントリに必要な"well-known"ノードを識別し、rdataセクションをtextセクションへ統合できるようにします。これにより、PE ファイルの構造がシンプル化され、セクション数が減少します。
CLRインタープリタの生成コードをランタイムダンプとイベントパイプで正しく処理するためのトレーシング修正です。インタープリタコードヒープの走査機能を追加し、CodeHeapIteratorのムーブコンストラクタを修正し、イベントパイプがスタックフレームなしで処理できるよう改善します。これによりBinderTracingTest.ResolutionFlowとrundownvalidationテストが修正されます。
Azure Pipelines の checkout ステップに fetchTags: false パラメータを追加し、git タグの不要な取得をスキップして、チェックアウトパフォーマンスを最適化するCI/CD パイプライン設定の改善です。8つのパイプラインYAMLファイルにおける10の checkout ステップすべてに対して、一貫して適用されています。
- checkout: self
clean: true
fetchDepth: $(checkoutFetchDepth)
fetchTags: false # タグ取得をスキップ
CI パイプラインの全チェックアウトステップに fetchTags: false パラメータを追加し、git タグの不要な取得をスキップすることで、チェックアウト時間とネットワークオーバーヘッドを削減します。8つのパイプライン YAML ファイルの11個のチェックアウトステップが更新されました。
- checkout: self
clean: true
fetchDepth: $(checkoutFetchDepth)
fetchTags: false # 追加
ILLink Roslyn アナライザーがC# 14の拡張メンバーを解析する際にクラッシュする問題を修正するバックポートです。問題の原因は、パラメータのContainingSymbolが常にIMethodSymbolであると仮定していたことで、拡張メンバーの場合は拡張型が入るためInvalidCastExceptionが発生していました。修正により、拡張メンバーの解析をスキップし、安全なキャスト処理に変更しています。
RISC-V64アーキテクチャでConstant CSE(共通部分式排除)最適化を有効化するPRです。大きな定数の読み込みに複数命令が必要なRISC-Vにおいて、繰り返し使用される定数のロード命令をホイストして共有することで、冗長な命令シーケンスを削減します。これにより、ARM/ARM64と同等の最適化レベルに到達します。
// 例:3つの大きな定数を使用する場合
// 最適化前:各使用箇所で独立してロード命令を発行(合計9命令)
// 最適化後:定数ロード命令を1度だけ実行し、複数箇所で共有
ARM64ハードウェアイントリンシックテスト生成コードのリファクタリング。テストグループと テンプレート用の構造体を導入し、ISA(Instruction Set Architecture)と LoadIsa 値をテストグループレベルで一元管理。コード生成処理関数(Process* 関数)を整理してテストコード生成の保守性と可読性を向上。
.NET 10以降のみをターゲットするように変更されたため、リポジトリ全体から廃止予定のNET9_0_OR_GREATERおよびNET10_0_OR_GREATERプリプロセッサ定数を削除するクリーンアップです。ファイルの用途に応じて、条件付きコンパイルディレクティブを#if NETに置き換えるか、完全に削除しました。
async/awaitの非同期フロー制御に関する複数の問題を修正するPull Requestです。suppressed flowの問題を解決し、DOTNET_JitOptimizeAwait環境変数のサポートをインタープリタに追加することで、JITの動作との一貫性を取ります。いくつかのテストは無効化されています。
条件付きエスケープ分析(CEA)がネストされたGetEnumerator呼び出しに対応していなかった問題を修正。オブジェクトのGetEnumeratorが別のGetEnumerator呼び出しの結果を返す場合、JITが適切にフラグを設定できていなかった。フラグ設定ロジックを改善し、インライン化されたメソッドからの戻り値がコール式の場合もそのコールにフラグを設定するようにしました。
PR #122558でのdotnet/arcadeからの依存関係更新をリバートするPull Requestです。このリバートにより、ビルドやテスト関連の設定が以前の状態に戻されます。リバート理由は関連するIssue #122979およびWasmテストのタイムアウト問題に対応するためです。
WinRT明示的初期化/初期化解除コードを削除し、ランタイムを簡略化するPRです。標準的なCOM初期化(CoInitializeEx/CoUninitialize)でCOM/WinRTインターオペラビリティが十分に対応できるため、冗長なRoInitialize/RoUninitialize呼び出しと関連するスレッド状態フラグを削除しました。顧客への影響はなく、内部ランタイム最適化です。
CLR インタープリタで、thisコール呼び出し規約を使用して関数を呼び出す際に、実際にthis引数が渡されていない場合の検出機能を追加します。EmptyThisCall テストの修正に対応する変更で、不正な関数呼び出しパターンをコンパイル時に検出し、エラーを防ぎます。
Monoデバッガーでジャグ配列(string[][])型のプロパティを検査する際のバグを修正したPull Requestです。デバッガーエージェントとプロトコルの定義に関連する小規模な変更により、ジャグ配列型のオブジェクトプロパティの適切な検査機能を実現しています。
public class TestObject
{
public string[][] TestProperty { get; set; } = [[], ["hi"]];
}
C# ilasm置き換えツールに複数の機能を追加するPRです。診断レポーティング基盤の実装、エスケープシーケンス解析、typedef(型エイリアス)サポート、およびマーシャルクローズ関連のバグ修正が含まれています。これらの機能拡張により、IL アセンブラの互換性と機能性が向上します。
HTTP ストレステストの Dockerfile で ASAN (Address Sanitizer) のプリロード失敗を修正するPR。GCC をインストールし、新しい場所から libasan.so を読み込むように変更。これにより、ld.so のエラーメッセージ「object '/usr/lib/gcc/x86_64-linux-gnu/13/libasan.so' from LD_PRELOAD cannot be preloaded」が解消される。
Windows 7がサポート対象外になったため、PlatformDetection.IsWindows7とIsNotWindows7プロパティを削除するクリーンアップです。これらのプロパティは常にfalseとtrueを返していたため、コード内の関連する条件分岐や特殊ケース処理を削除し、コードを簡素化しました。
[UnmanagedCallersOnly]属性を持つメソッドへのデリゲート作成時の早期チェックを削除し、ポリシーの一貫性を実現するPR。従来はNotSupportedExceptionを即座にスローしていましたが、他のコードパス(リフレクション呼び出しなど)と同様に、実際の呼び出し時にのみfailfastが発生するように変更されました。
// 変更前: デリゲート作成時に例外
var del = new Func<int, int>(MyUnmanagedCallersOnlyMethod); // NotSupportedException
// 変更後: デリゲート作成は成功、呼び出し時にfailfast
var del = new Func<int, int>(MyUnmanagedCallersOnlyMethod);
del(42); // ここでfailfast
AutomaticDecompressionを使用する際のオーバーヘッドを削減するPRです。Accept-Encodingヘッダが未設定の一般的なケースの最適化、Content-Encodingヘッダ確認時の割り当て削減、圧縮済みコンテンツヘッダのムーブセマンティクス活用により、パフォーマンスを大幅に改善します。
arm64 Unix環境でのインタープリタの例外処理後の再開時に発生していたバグを修正しました。DispatchManagedExceptionとDispatchRethrownManagedExceptionがNORETURNマークされていたため、C++コンパイラの最適化により関数のエピログが削除され、リターンアドレスが別の関数に位置するようになってしまい、InterpreterCodeManager::ResumeAfterCatchでの非volatile レジスタの復元が正確でなくなっていた問題です。
浮動小数点数とSIMD操作の最適化を改善するPR。否定演算の二重否定の除去や、乗算の代わりに加算・否定を使用する最適化、2の累乗による除算・乗算を逆数乗算に変換するなど、複数の簡潔化を実装しています。JITコンパイラの形態素解析段階(morph)でこれらの最適化を行い、生成されるコードの効率を向上させます。
JITコンパイラが構造体フィールドのオフセット計算パターンを認識する最適化を改善しました。従来の昇格機構(old promotion)で昇格された構造体の場合、アドレスが取られるときに親ローカルと子フィールドが共有ストレージを持つ際に、この最適化が機能していなかった問題を修正しています。
public unsafe nint Test()
{
MyStruct dummy;
return (nint)((byte*)&dummy.Field - (byte*)&dummy);
}
Nullable型のボックス化時にインライン化とスタック割り当てを実現するPR。従来はNullable<T>のボックス化に専用のヘルパー関数を使用していたが、本変更によりJITが動的割り当てを回避し、スタック上で直接処理できるようになります。
object Test(long? n)
{
return n;
}
上記のコードでコード生成が26バイトから46バイトに増加しますが、メモリ割り当てが削減されます。
Browser向けのビルドで発生していたコンパイルエラーを修正するPull Requestです。ThreadPool.Browser.Threads.csファイルの13行目と14行目に構文エラーが発生していたため、コメント行と閉じ括弧の配置を修正しました。2行の変更でビルド失敗を解決しています。
CoreLibの複数の箇所でHashtableをConcurrentDictionaryに置き換える変更。キーと値のボックス化を回避し、型安全性を向上させ、コード行数を削減することで、メンテナンス性とパフォーマンスを改善する改革的な変更です。
PALテストスイートから削除されたテストの参照を設定ファイルから削除するハウスキーピング作業です。compilableTests.txtとpaltestlist.txtから不要になったテストエントリを削除し、テストスイートの整合性を保つことが目的です。
ildasm出力に含まれていた非決定的な「Image base:」コメント行を削除しました。このコメントはPEイメージのランタイムロードアドレスを表示していましたが、実行ごと、特にASLR環境では値が変動するため、出力の再現性が損なわれていました。dasm.cppの2行(6652-6653行目)を削除することで、ildasm出力を決定的かつ一貫性のあるものにします。
WASMプラットフォームにおけるマネージ例外のネイティブフレームへの伝播を修正するPRです。UNINSTALL_MANAGED_EXCEPTION_DISPATCHER_EX内で例外を無視するように改善し、ターゲットフレームに到達するまで例外を保持します。WASMではスタック巻き戻しが他のプラットフォームと異なるため、この対応が必要です。また、PAL_SEHExceptionクラスから廃止ビットも削除されています。
FEATURE_EH_FUNCLETSの削除に伴い、不要になったPOPFRAMESスタックウォークオプションを完全に削除するPR。STACKWALKER_MAY_POP_FRAMESifdefの下のコードも合わせて除去され、不要な機能が整理される。
このPull Requestは、issue #122762で報告されたSuppressGCTransition属性の処理に関する問題を修正します。アンマネージ呼び出し規約の処理において、SuppressGCTransitionハンドリングの復元を行う変更です。
JIT最適化におけるSpanHelpers.Fillメソッドが最後の引数をエスケープする可能性がある問題を修正しました。Fillメソッドが汎用型で参照型の値を許可するため、GCリファレンスの処理で問題が発生していました。オブジェクトのスタック割り当て最適化時にこの引数が不正にエスケープされるのを防止します。
macOS上でdotnetミューラー、apphost、singlefilehostおよびcorerunからcom.apple.security.cs.debuggerエンタイトルメントを削除するPRです。このエンタイトルメントはデバッガ用であり、ミューラーには不要です。デバッガは独自のapphostを使用し、独自のエンタイトルメントを設定すべきです。createdumpはptrace APIを使用するため、そのエンタイトルメントは保持されます。
JsonSourceGenerationOptionsAttributeコンストラクタがJsonSerializerDefaults.Strictに対応していないため、ArgumentOutOfRangeExceptionが発生していた問題を修正。JsonSerializerOptionsコンストラクタと同期させ、Strictモード用の4つのプロパティ設定を追加しました。
[JsonSourceGenerationOptions(JsonSerializerDefaults.Strict)]
[JsonSerializable(typeof(Example))]
internal partial class SourceGenerationContext : JsonSerializerContext;
.NET Runtime 9.0.13のブランディング更新を行うPull Requestです。eng/Versions.propsファイル内のバージョン情報を更新し、リリース準備のための変更を実施しています。説明文の詳細はありませんが、バージョン番号の更新が主な内容となっています。
.NET Runtime 8.0.24へのブランディング更新を行うPull Requestです。バージョン情報を含む設定ファイルが更新されました。説明文は記載されていません。
TypeMapLazyDictionary.CreateMaps()メソッドにおいて、as演算子を使用した型キャストをC#の直接キャスト構文に変更するコード品質改善です。Assembly.Load()とAssembly.GetEntryAssembly()の戻り値をRuntimeAssemblyに変換する際、型不一致が発生した場合に暗黙的にnullを返すのではなく、明示的にInvalidCastExceptionを発生させることで、より厳格な型安全性を実現します。
Windows 7以前の互換性コードをCoreClrから削除するクリーンアップです。.NETランタイムは現在Windows 8以降のみサポートしているため、古いOSの互換性処理が不要になりました。WinRT APIとversion.dllの遅延ロード処理も削除され、/DEPENDENTLOADFLAG:0x800フラグにより依存関係が確実にSystem32から読み込まれるようになっています。
JITコンパイラにおいて、GCリファレンスを含むカスタムレイアウト構造体のアライメント処理に関するバグ修正です。Issue #122859を解決するもので、async.cppの1行を修正しています。GCポインタを含むカスタムレイアウトに対して、ポインタサイズへの適切なアライメント処理を確保するための変更です。
ブラウザ環境でのCoreCLR実装において、dotnetAssert.fastCheckの呼び出しをインライン化し、失敗しない場合の文字列フォーマットとクロージャ割り当てを削減するパフォーマンス最適化。従来の関数呼び出しから直接的なif文での例外スローに変更。
// 変更前
dotnetAssert.fastCheck(Number.isSafeInteger(value), () => `Value is not an integer: ${value} (${typeof (value)})`);
// 変更後
if (!(Number.isSafeInteger(value))) throw new Error(`Assert failed: Value is not an integer: ${value} (${typeof (value)})`);
async メソッドからの明示的なテールコールは許可されていないため、テールコール ストレスを有効にすることは意味がありません。有効化すると、GT_RETURN ノードの作成をスキップする可能性があり、async 変換で予期しない IR の変更が発生します。このプルリクエストはテールコール ストレスを async メソッドで禁止する修正を実施しています。
AsyncHelpers.AsyncCallContinuationイントリンシックを明示的に使用する場合、JITのASYNC_CONTINUATIONノードが非同期呼び出しの直後に線形順序で配置される必要があります。しかし、呼び出し結果のstlocがヘルパー呼び出しに変換される場合など、中間に他の処理が挿入されることがあります。本修正では、前の非同期呼び出しをより確実に探索し、他の非非同期呼び出しをスキップできるようにしました。
Socket.SendFileがBlocking=falseの場合、プラットフォーム固有の未定義動作を引き起こす問題を修正しました。Windowsではブロックされ、Linuxではデータが部分的に送信される可能性があります。修正では、ブロッキングモード非対応時にInvalidOperationExceptionをスローするバリデーションを追加しています。
ブラウザホスト向けのTypeScript/rollup構成を改善するPRです。グローバル宣言の可視性問題を解決するため、_ems_ヘルパーを導入して擬似モジュール化し、TypeScriptの型安全性向上とモジュール間の循環依存を修正。CIでリリース/ミニファイJS生成も実装。
Linux Verification Center(SVACE)の静的解析により検出されたMonoランタイムのメモリリーク問題を修正するPull Requestです。関数の早期リターン時にメモリが適切に解放されていなかった問題を複数のファイルで対処しています。
UnsafeAccessorで構造体のインスタンスメソッドを呼び出す際、暗黙的なthis引数がbyrefで表現されていました。署名生成時にこのbyref署名をターゲット型署名として使用していたため、ランタイムがnullのMethodTableでジェネリックコンテキストを解決し、クラッシュが発生する問題を修正しました。修正内容は、ターゲット型署名からbyrefを削除し、基礎となる要素型Tを使用するようにしています。
スケーラビリティ実験の推奨に基づくスレッドプール最適化の第1弾。ワークアイテムの投入と実行のオーバーヘッドを削減し、不要なスレッド起動を防ぎ、同期プリミティブを改善することで、タスク処理効率を向上させる。
インタープリタサポート環境でのInterop スイートの複数の問題を修正するPull Requestです。主な修正内容は、IsBuiltInComEnabled のプラットフォーム検出の改善と、最適化されたデリゲートコンストラクタの使用です。[UnmanagedCallersOnly]属性でマークされた関数へのデリゲート作成時の問題を回避し、同時にコンパイラの改善を実現しています。
OpenSSL依存関係をopenSUSEおよびSLES向けに更新するPR。libopenssl1からlibopenssl3への切り替えを実施。libopenssl3は対象となるすべてのディストリビューションリリースでデフォルトでサポート・インストールされており、openSUSE Tumbleweelではこれが唯一の利用可能なバージョンとなるため、この更新が必要。
NativeRuntimeEventSourceTestのタイムアウト値が5秒から45秒に変更されました。既存のタイムアウトが短すぎて、テスト実行時に不安定な結果が生じていたため、より余裕のある値に調整されています。これはランタイムイベントソースのトレーシングテストの安定性向上を目的とした変更です。
非同期メソッドの実行コンテキスト状態をOSR(On-Stack Replacement)とEnC(Edit and Continue)トランジション中に正しく復元するための対応です。非同期メソッドの本体周囲に保存されるコンテキスト状態が、コード更新や最適化時に失われないようにします。
Roslyn 4.14.0によるC# 14コンパイラの導入に伴い、イテレータステートマシンのコード生成が変更され、IL2062トリミング分析警告が発生するようになりました。テストのIteratorWithIntegerDataflow()メソッドで、コメントアウトされていた[UnexpectedWarning("IL2062", ...)]属性をコメント解除し、この警告が期待される動作であることを示すテスト修正です。
System.Text.RegularExpressionsのMatch.AddMatchメソッドで、手動のループ処理をArray.Copyに置き換えることで、コードの簡潔化とパフォーマンス向上を実現した変更です。正規表現マッチング時の配列コピー処理を最適化しています。
正規表現のHashtableExtensionsにおいて、Hashtableへのダブルルックアップを回避する最適化が実施されました。同じキーに対する重複した検索操作を1回に削減し、パフォーマンスを向上させています。
Windows 7のサポート終了に伴い、暗号化関連のテストコードを更新するPull Requestです。Windows 7専用の条件付きテストを削除し、Windows 7以外の環境での実行条件を簡素化しました。テストロジック自体の変更ではなく、プラットフォーム依存の条件分岐を整理する内容です。
ILDasm で -METADATA=RAW フラグを使用した際にアサーション失敗で クラッシュする問題を修正。ELEMENT_TYPE_CMOD_INTERNAL がメタデータ情報用の配列に不足していたため、メタデータ検査が機能しない状態でした。修正では g_szMapElementType と g_szMapUndecorateType 配列に「CMOD_INTERNAL」エントリを追加し、ELEMENT_TYPE_MAX 値との一致を確保しました。
このPRはx86プラットフォーム向けの非funclet例外処理(EH)コードとFEATURE_EH_WINDOWS_X86フラグを削除するもの。.NET Runtimeは現在funcletベースの例外処理に統一され、レガシーな非funclet実装は不要になったため、コードベースを簡潔化する変更。複数のJITコンパイラファイルから条件分岐とレガシーロジックを削除し、保守性を向上させる。
JITのswitch認識機能において、すべてのsuccessorが同じブロックを対象とする退化したswitch文を検出して処理するバグ修正。issue #121691を解決するもので、switchrecognition.cpp に最小限の変更(2行追加、1行削除)が加えられている。
PR #122850で導入された回帰を修正するPRです。NativeAOTランタイムのTypecast.cs内のアサーション条件を緩和し、外部ループテストで発生していたアサーション失敗エラーを解決します。具体的には、elementTypeの検証条件を見直し、より広い範囲の要素型を許容するようにしています。
空のTagListに対してCopyTo(array, arrayIndex)を呼び出すとArgumentOutOfRangeExceptionが発生する問題を修正しました。空のTagListの場合、コピー対象がないためarrayIndex == array.Lengthを許可し、ActivityTagsCollectionと一貫した動作にしました。LINQ のToArray()も正常に動作するようになります。
var emptyArray = new KeyValuePair<string, object>[0];
var tagList = new TagList();
tagList.CopyTo(emptyArray, 0); // 修正前: 例外発生、修正後: 正常に動作
R2R PE ファイルのレイアウト計算時に空のセクションをスキップするよう PEObjectWriter を改善しました。非Windows プラットフォームで空のセクションに対して不要な 64 kB パディングが割り当てられていた問題を解決し、PE ファイルサイズを大幅に削減します。
HashProviderCngクラスにおいて、Windows 7のサポート終了に伴い、BCRYPT_HASH_REUSABLE_FLAGが常にサポートされていると仮定するように変更されました。これまでWindows 7の非互換性に対応するためのコードが存在していましたが、それらの条件分岐が不要になったため削除されています。
ブラウザ環境(WASM)で動作するJavaScript モジュールにgitHashを埋め込み、起動時に一貫性をチェックする機能を追加しました。HTTPキャッシュやビルドフォルダに矛盾したバージョンのJSファイルが存在する場合、早期に失敗させることで デバッグを容易にします。
JsonSourceGeneratorがinit-onlyプロパティのコード生成時に、C#の予約キーワードを使用したプロパティ名の前置@記号を削除していた問題を修正しました。例えば@elseというプロパティがelseとして生成され、コンパイルエラーになっていました。
class MyClass { public string @else { get; init; } }
[JsonSerializable(typeof(MyClass))]
partial class Ctx : JsonSerializerContext;
上記コードでnew MyClass(){ @else = ... }ではなくnew MyClass(){ else = ... }と誤って生成されていました。
LoongArch64およびRISCV64プラットフォームにおいて、非同期ノード(async nodes)の処理を追加するパッチです。NativeAOTでELF/Mach-O形式を出力する際に必要な機能を実装しており、コミュニティプラットフォーム向けの対応となります。各プラットフォームのコード生成部に8行ずつ追加されています。
HTTP/3のトレーラーハンドリングにおいて、不要な一時的なList割り当てを削除する最適化です。ヘッダーデータを最終的なコレクションに直接書き込むことで、メモリ効率を改善しています。この手法はHTTP/2で既に実装されている同じパターンに統一しています。
HybridGlobalization機能のエラーメッセージを更新するPRです。Apple モバイルプラットフォームではHybridGlobalizationが無効化できなくなったため、ユーザーに誤解を招く「無効化してより大きなICUバンドルを読み込む」というガイダンスを削除し、より正確な説明に置き換えました。6つのエラーメッセージが対象です。
WebAssembly(Wasm)ターゲット向けのJITコンパイラで、x86クロスコンパイルMCHリプレイ中に発生していた複数の未実装(NYI)エラーと他の問題を修正するPRです。主にフローグラフ処理、値の番号付け、下位レベルコード生成で改善が加えられています。
インタープリタの呼び出し規約におけるガベージコレクション(GC)レポート時の二重報告問題を修正しています。callee のスタック空間を指すポインタの保守的な報告を削除することで、過度な保守的レポートを減らします。IL スタック上に保持されたオブジェクト参照は引き続き保守的に報告されます。
非同期テストとプロファイラのleaveコールバックが組み合わさった場合に、標準リターン時に非同期継続を適切にゼロ化していなかった問題を修正。#122195で導入された非同期テストが他のストレス設定と組み合わせて実行される際に、leave callbacksの出力時に非同期継続の適切なクリアが行われていないことが判明し、本PRで対応。
CoreMangLibテストスイートを統合し、56個の個別csprojファイルを削除してテストプロジェクト構造を簡素化しています。複数の独立したテストプロジェクトを1つのプロジェクトに統合することで、ビルドとメンテナンスの効率を向上させています。
Windows x86 Checked ビルドで /O2 最適化フラグを使用するよう変更するPull Request。レガシー例外処理(EH)に特定のアサーション失敗を修正し、パフォーマンスとビルド設定の改善に貢献しています。
FEATURE_EH_FUNCLETS機能フラグが常に有効であるため、条件付きコンパイルディレクティブと関連するレガシーコードを削除するクリーンアップPRです。例外処理(EH)funcletの実装が標準化され、条件分岐が不要になったため、3202行のx86例外処理コード(excepx86.cpp)を含む大量の不要なコードが削除されています。
ブラウザ環境でのWebAssembly実行時に、JavaScriptエンジンがWASM例外処理(EH)とSIMD機能に対応しているかを事前に検証するvalidateWasmFeatures()関数を新たに実装しました。これにより、非対応環境での実行時エラーを防ぎ、早期に失敗させることができます。
browser/coreCLRのインクリメンタルビルドを修正するPR。主にJSファイルがbrowserhost CMakeをトリガーするようにし、copy_version_files.ps1のファイル読み込み方法の不一致(改行有無)によって発生していた不要な再コンパイルを解消。また、browserhostサンプルコードを削除しています。
SerialStream.EventLoopRunnerでイベントハンドラーが一度だけチェックされるが複数回呼び出される問題を修正しました。ハンドラーが最初の呼び出し中にアンサブスクライブすると、その後の呼び出しでNullReferenceExceptionが発生していました。null条件演算子(?.Invoke)を使用して各呼び出し前に安全にチェックするように変更しました。
CertificateRevocationListBuilder.LoadPemメソッドにおいて、PEM形式のデータ内に末尾データが存在する場合の処理を改善しました。従来はアサーション失敗で対応していましたが、適切な例外を発生させるよう修正し、DERリーダーが末尾データを検証するように強化しています。
Windows 7専用だった SP800-108 HMAC Counter KDF のマネージド実装を削除するPRです。不要になった手動実装を廃止することで、NativeAOT の効率性向上に貢献します。Windows では CNG(Cryptography API: Next Generation)のネイティブ実装のみを使用します。
Windows 7は既にサポート対象外となったため、BCryptDeriveKeyPBKDF2 APIの使用を削除するPRです。PBKDF2実装をWindows 7専用の古いAPI呼び出しから移行させ、コードベースを整理します。これによりレガシーAPI依存性が排除され、メンテナンス性が向上します。
FromBase64Transformの2つのバグを修正します。1つ目は、前のブロックから保持されたバイト列がある場合にCryptoPoolからのレンタルサイズが不足する問題で、inputCountではなくbytesToTransformを使用するよう修正しました。2つ目は、出力バッファが不足している場合の例外処理を改善し、Debug.Assert失敗と不正なFormatExceptionではなく適切にArgumentOutOfRangeExceptionをスローするようにしました。
macOS上でDriveInfo.GetDrives()が複数スレッドから並行呼び出しされた際にランダムなAccessViolationExceptionを発生させる問題を修正。スレッドセーフでないgetmntinfo()を、呼び出し側でバッファを確保するgetfsstat()に置き換えることで解決します。
AsyncSafeThreadMapクラスをSignalSafeThreadMapにリネームするリファクタリング。.NETのasync/awaitパターンとの混同を避けるため、シグナルハンドラー内での安全な使用を目的とした本クラスの実際の用途に合わせた命名に統一しました。命名の一貫性向上により、コード意図の明確化を実現します。
CoreCLR、NativeAOT、Monoの3つのランタイム間で重複するネイティブヘルパー実装(X86Base、Interlocked、Buffer)を統合し、共有コードを最大化するリファクタリング。新しい共有実装をsrc/coreclr/runtime/MiscNativeHelpers.cpp/hに集約し、すべてのランタイムが同一のマネージドコードファイルを使用するよう統一しました。プラットフォーム固有の部分クラス(*.CoreCLR.cs、*.NativeAot.cs、*.Mono.cs)をすべて削除。
GetInterpThreadContextを割り当て型と非割り当て型の2つのバリアントに分割し、インタープリタが実際に使用される場合のみInterpThreadContextを確保するように改善したPull Requestです。従来はTryEnsureSufficientExecutionStackなどの処理でインタープリタを使用していない場合でも不要なメモリ割り当てが発生していました。
RISC-V 64ビット向けコード生成部分(codegenriscv64.cpp)のコメントと書式をクリーンアップするマイナー更新です。機能的な変更は含まれておらず、コードの可読性と保守性の向上を目的としています。
ARM向けのレジスタ予約ロジック(RBM_SAVED_LOCALLOC_SP)をコンパイラのcompCompile関数から、LSRA(Linear Scan Register Allocator)のsetFrameType関数へ移動するリファクタリング。コード機能の変更なし。
NativeAOT(ネイティブAOT)のヘルパーメソッドをCoreClrのパターンに合わせてリファクタリングするPR。ArrayHelpers.csとTypedReferenceHelpers.csから適切なターゲット型にメソッドを移動し、NativeAOTと非NativeAOTの構造をより類似させることが目的。これにより、コード保守性が向上し、プラットフォーム間の一貫性が改善される。
Windows 7のサポート終了に伴い、Environment.IsWindows8OrAbove内部プロパティとそれに関連するWindows 7互換性コードを削除するクリーンアップPRです。EventProvider、EventSource、Environment、CompareInfoなど複数のファイルから不要なコード分岐を削除し、コードベースの簡潔化を実現します。