Pull Request on 2026年07月30日

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

注意点

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


目次

  1. #131561 Implement cDAC native code info DacDbi APIs
  2. #131560 [RyuJIT Wasm] Remove some unreachable uses of NYI_WASM
  3. #131559 JIT: evaluate wasm localloc call args to temps
  4. #131550 Fix Uri perf regression from stackallocs
  5. #131547 [clrinterp] Small peep fixes
  6. #131540 Remove NYI_WASM_SIMD and JitNyiWasmSimdToR2RUnsupported
  7. #131534 Interop.Process: Avoid unhandled exception on FreeBSD
  8. #131532 Add process isolation requirement for GC tests
  9. #131531 Enable process isolation for GC handle tests
  10. #131523 Add System.Text.Json converters for BFloat16 and the IEEE 754 decimal types
  11. #131488 [arm64] Use the scalar shift when scaling Vector64 shuffle indices
  12. #131486 Bypass CreateReadStream for PhysicalFileInfo in FileConfigurationProvider
  13. #131480 Treat empty string value from chained configuration as present
  14. #131453 Escape C# keyword identifiers in Configuration Binder source generator
  15. #131445 Enable ML-DSA CMS tests on .NET Framework
  16. #131438 Split the Copilot instruction files by activity
  17. #131432 [release/10.0] Fix g_gc_lowest_address updating
  18. #131422 Ensure that Decimal32/64/128 ToString roundtrips and preserves the cohort
  19. #131365 Implement IXCLRDataTypeDefinition metadata methods in cDAC
  20. #131334 Implement IXCLRDataExceptionState.GetManagedObject in cDAC
  21. #131326 Re-enable the ArrayPool PollingEventFires test
  22. #131310 Fix WKS BGC access violation from stale ma_committed on unlinked expansion segment (#123490)
  23. #131307 Add Reset() to the Zlib-based Encoders/Decoders
  24. #131302 XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements
  25. #131275 [HTTP] High cardinality metrics to observable
  26. #131069 Fix non-monotonic GC.GetTotalAllocatedBytes under DATAS (Server GC)
  27. #131045 ConfigurationBinder: Skip binding null getter-only collection properties
  28. #131027 Use cdac for metadata serialization
  29. #131018 Optimize method invocations in System.Text.Json et al.
  30. #128152 JIT: Use a "resumed?" indicator variable in runtime async instead of lvaAsyncContinuationArg != nullptr

#131561 Implement cDAC native code info DacDbi APIs

  • 作成者: @Copilot
  • 作成日時: 2026年07月30日 00:32:43(UTC)
  • マージ日時: 2026年07月30日 14:24:29(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDAC(Component Data Access Contract)向けに GetNativeCodeInfo と GetNativeCodeInfoForAddr DacDbi APIを実装し、レガシーDAC動作との互換性を確保します。ネイティブコード領域の解決、MethodDesc、ジェネリック状態、モジュール/トークン、EnCバージョンの取得に対応し、非同期バリアント、インタープリタプリコード、32ビットアドレスなどのエッジケースを処理します。

変更内容

  • DacDbi実装 (DacDbiImpl.cs): GetNativeCodeInfo/GetNativeCodeInfoForAddrの実装追加。ネイティブコード情報の解決、EnCバージョン管理、メモリ不足時の対応を実装。DEBUG検証を含む。
  • 契約インターフェース:
    • ILoader.cs: LookupMemberRefAsMethodメソッド追加(フィールドフィルタリング付きMemberRef検索)
    • IRuntimeTypeSystem.cs: GetAsyncVariant、GetAsyncMethodFlags等のメソッド追加
    • Loader_1.cs/RuntimeTypeSystem_1.cs: 新機能の実装
  • ドキュメント (Loader.md, RuntimeTypeSystem.md): 新規契約サーフェスの仕様説明を追加
  • テスト: DacDbiImplTests、LoaderTests、MethodDescTests、MockDescriptorsに包括的な単体テスト追加(メソッド/アドレス検索、EnC、非同期・インタープリタパス、メモリ不足、MemberRef対応)
  • その他: レガシーDAC側も同期更新(dacdbiimpl.cpp/.h等)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

懸念事項(Copilot指摘):

  1. Null参照検証の欠落: DacDbiImpl.csの2706行で出力ポインタ pCodeInfo がnull検証なしにデリファレンスされており、他メソッドと異なりE_POINTERを返さずにAVが発生する可能性がある。
  2. オプショナル出力ポインタの非条件デリファレンス: 2773行で pVmModule と pFunctionToken がnullチェックなしに初期化され、メモリ不足時の正常なハンドリングが妨げられる可能性がある。
  3. APIレビューの未承認: 新規公開契約メソッド(ILoader.LookupMemberRefAsMethod、IRuntimeTypeSystem.GetAsyncVariant等)がapi-approvedのIssueにリンクされていない。公開APIの場合は正式なレビュープロセスが必要。
  4. テスト設定の潜在的問題: MockDescriptorsの SetMemberRefToDescMap でLookupMap構造体の書き込み位置が不適切である可能性がある。

#131560 [RyuJIT Wasm] Remove some unreachable uses of NYI_WASM

概要

WebAssembly(Wasm)コード生成において到達不可能なコードパスに関連する NYI_WASM(Not Yet Implemented for WebAssembly)マクロの不要なインスタンスを削除しました。また、Wasm向けに不要な emitJumpDistBind を条件付きコンパイルで制御します。

変更内容

  • codegenwasm.cpp: NYI_WASM マクロの使用を削除(3行追加、10行削除)
  • emitwasm.cpp: Wasm固有の生成ロジック最適化(8行追加、10行削除)
  • codegencommon.cpp: 条件付きコンパイル対応(2行追加)
  • emit.cpp: emitJumpDistBind の #ifdef 処理化(4行追加、4行削除)

パフォーマンスへの影響

影響なし(クリーンアップと不要なコードの削除)

関連Issue

なし

その他

本変更はRyuJIT Wasm コード生成パスの整理を目的とした内部実装の改善です。到達不可能なエラーハンドリングコードを削除することで、コードの意図が明確化され、保守性が向上します。公開APIへの影響はありません。


#131559 JIT: evaluate wasm localloc call args to temps

概要

WASM環境でlocalloc(GT_LCLHEAP)が関数呼び出しの引数に含まれる場合、引数評価順序の問題を修正します。シャドウスタックポインタがlocalloc後の正確なスタックポインタを反映するよう、引数を一時変数に評価することで対応しています。

変更内容

  • src/coreclr/jit/morph.cpp: CallArgs::ArgsCompleteにWASM固有のロジックを追加。GT_LCLHEAPがある引数を強制的に一時変数に評価することで、シャドウSP引数の順序を正確にします。
  • src/tests/JIT/Regression/JitBlue/Runtime_131557/Runtime_131557.cs: stackalloc/呼び出し間の相互作用によるバッファ破損を検出する回帰テストを新規追加します。

パフォーマンスへの影響

WASM環境でlocallocを含む呼び出しの場合、引数が一時変数に評価される追加コストが発生する可能性があります。ただし、ベンチマーク結果は提供されていません。

関連Issue

#131557

その他

  • 変更はWASM(WebAssembly)環境に限定されています。
  • JITコンパイラの内部実装部分への変更で、公開APIへの影響はありません。

#131550 Fix Uri perf regression from stackallocs

  • 作成者: @MihaZupan
  • 作成日時: 2026年07月29日 21:14:21(UTC)
  • マージ日時: 2026年07月30日 11:32:16(UTC)
  • ラベル: area-System.Net

概要

Uri コンストラクタのパフォーマンス回帰を修正するため、stackalloc ベースの ValueStringBuilder の使用を専用ヘルパーメソッドに移動しました。これにより、大規模なメソッド内での JIT/codegen の悪影響を軽減し、Uri 解析パスのスループットを向上させます。

変更内容

  • src/libraries/System.Private.Uri/src/System/Uri.cs: EscapeUnescapeIri() という新規プライベートヘルパーメソッドを追加し、IRI ユーザー情報の再構築時にこのヘルパーを使用
  • src/libraries/System.Private.Uri/src/System/UriExt.cs: Unicode/IRI 相対 URI パスにおける _string 生成時に新規ヘルパーを使用し、大規模なメソッドからインライン stackalloc を削除

パフォーマンスへの影響

改善: Uri コンストラクタのベンチマークで 6~12% の高速化を確認

シナリオ 改善率
http://dot.net 6%
http://höst.with.ünicode 4%
Unicode IDN (エンコード済み) 10%
長いドメイン 6%
https://contoso.com 8%
https://CONTOSO.com 12%

関連Issue

#123394

その他

この変更は公開 API に影響を与えない内部実装の最適化です。stackalloc をメソッドの外に分離することで、JIT コンパイラが大規模メソッドをより効率的に処理できるようになります。


#131547 [clrinterp] Small peep fixes

概要

CLR インタプリタの Peephole 最適化ロジックにおいて、STLOC/LDLOC オペコードのサイズ計算とオペランドデコーディングの不具合を修正しています。これらのオペコードは IL ストリーム上で 4 バイトですが、長形式オペコード(0xFE プレフィックス)を適切に処理していなかったため、ローカル変数の取得に失敗し、無効なメモリアクセスによるクラッシュが発生する可能性がありました。

変更内容

  • src/coreclr/interpreter/compiler.cpp
    • peepStLdLoc のパターンオフセット終了マーカーを修正し、Peep サイズが実際の IL バイト長(4 バイト)と一致するよう調整
    • IsStoreLoadPeep における CEE_STLOC/CEE_LDLOC のデコーディングを修正し、長形式オペコードプレフィックス後の u2 型ローカル変数インデックスを正しく読み込み
    • CEE_STLOC コード生成スイッチケースの余分な行継続バックスラッシュを削除

パフォーマンスへの影響

影響なし(バグ修正のため)

関連Issue

なし

その他

この修正は内部実装(CLR インタプリタ)の変更であり、公開 API への影響はありません。ただし、以前の不具合により特定の Peephole 最適化パターンでクラッシュする可能性があったため、安定性向上が期待できます。


#131540 Remove NYI_WASM_SIMD and JitNyiWasmSimdToR2RUnsupported

概要

Wasm SIMD固有のNYI(Not Yet Implemented)エスケープハッチであるNYI_WASM_SIMDマクロとJitWasmSimdNyiToR2RUnsupportedJIT設定オプションを削除し、既存の「到達不可能」メカニズム(unreached()、NO_WAY()、IMPL_LIMITATION())に置き換える変更です。これにより、Wasm SIMD処理のエラーハンドリングをより明確で標準化された形式に統一します。

変更内容

  • error.h: NYI_WASM_SIMDマクロ定義(10行)を削除
  • jitconfigvalues.h: JitWasmSimdNyiToR2RUnsupported設定オプションを削除
  • hwintrinsicwasm.cpp: Wasm SIMD NYIをNO_WAY()に変換
  • hwintrinsiccodegenwasm.cpp: switch文のフォールスルーでNYI_WASM_SIMDをunreached()で置き換え
  • gentree.cpp: Wasm SIMD NYIをunreached()またはIMPL_LIMITATION()で置き換え
  • morph.cpp: マスク付きHW組み込み関数ロジックからNYI_WASM_SIMDを削除し、プリプロセッサ構造を調整
  • superpmi.py: Wasm向けオプション強制を削除(38行削除)
  • CLRTest.CrossGen.targets、crossgen-corelib.proj: Wasm CrossGen2設定からSIMD-NYI関連オプションを削除

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

注記: Copilotレビュアーから、src/coreclr/jit/morph.cpp:11800の#endifコメントについて、#ifdef FEATURE_MASKED_HW_INTRINSICSに対応する末尾コメントが!FEATURE_MASKED_HW_INTRINSICSと反対になっているという指摘がありますが、本変更では修正されていません。


#131534 Interop.Process: Avoid unhandled exception on FreeBSD

概要

FreeBSD環境で GetProcInfo() ヘルパーメソッドが無効なプロセスID(PID)を渡された際に未処理例外をスローする問題を修正しました。短命プロセスがPIDが無効になるほど速く終了する場合に頻繁に発生する可能性があるため、呼び出しをtry-catchブロックで囲んで対応しています。

変更内容

  • src/libraries/Common/src/Interop/FreeBSD/Interop.Process.cs
    • GetProcInfo() の呼び出しをtry-catchブロックで保護
    • 無効なPIDに対する例外ハンドリングを追加

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

FreeBSD固有の相互運用コード修正です。短命プロセスのハンドリング時にスローされていた例外が抑制されます。


#131532 Add process isolation requirement for GC tests

概要

GCリグレッションテストプロジェクト(460373)にプロセス分離要件を追加します。これは#126108の影響による変更で、テスト実行時に他のテストへの副作用(例:漏洩したGCハンドル)を防ぐため、プロセス内実行ではなくプロセス分離での実行を強制します。

変更内容

  • src/tests/GC/Regressions/v2.0-beta2/460373/460373.csproj: RequiresProcessIsolation設定を追加(説明コメント付き)

パフォーマンスへの影響

テスト実行時間はプロセス分離によるオーバーヘッドが発生するため増加の可能性がありますが、テスト結果の信頼性向上(他テストへの干渉排除)が優先されています。

関連Issue

#126108

その他

なし


#131531 Enable process isolation for GC handle tests

概要

GCハンドルのリグレッションテストプロジェクト 445488 にプロセス分離を有効にする設定を追加します。これは #126108 の影響に対応するもので、リークされたGCハンドルがテスト間で干渉するのを防ぐためです。

変更内容

  • src/tests/GC/Regressions/v2.0-beta2/445488/445488.csproj: <RequiresProcessIsolation>true</RequiresProcessIsolation> を追加し、このテストプロジェクトが独立したプロセスで実行されるようにしました。

パフォーマンスへの影響

影響なし(テスト実行時の分離に関連した変更であり、本体のパフォーマンスには影響しません)

関連Issue

#126108

その他

なし


#131523 Add System.Text.Json converters for BFloat16 and the IEEE 754 decimal types

概要

System.Text.JsonでSystem.Numerics.BFloat16、Decimal32、Decimal64、Decimal128の組み込みシリアライゼーション機能を実装しました。JsonMetadataServicesに対応する4つの公開プロパティが追加されます。

namespace System.Text.Json.Serialization.Metadata
{
    public static partial class JsonMetadataServices
    {
        public static JsonConverter<System.Numerics.BFloat16> BFloat16Converter { get; }
        public static JsonConverter<System.Numerics.Decimal32> Decimal32Converter { get; }
        public static JsonConverter<System.Numerics.Decimal64> Decimal64Converter { get; }
        public static JsonConverter<System.Numerics.Decimal128> Decimal128Converter { get; }
    }
}

変更内容

  • 共有コンバーター実装:Ieee754FloatingPointConverter<T>(IFloatingPointIeee754<T>に制約)により4つの型を統一的にサポート
  • バッファ最適化:IEEE 754 decimal型は位置記法でフォーマットされるため、64バイトのスタックバッファから開始しArrayPool<byte>で動的に拡張
  • コンバーター登録:DefaultJsonTypeInfoResolver.Converters(シンプルコンバーター数:31→35)、JsonPropertyInfo、JsonValueOfT.DetermineValueKindForTypeに統合
  • ソースジェネレータ対応:KnownTypeSymbolsとCreateBuiltInSupportTypeSetに追加、[JsonSerializable]でメタデータサービスを自動解決
  • リソース整理:ThrowHelper.ThrowFormatException(NumericType)の14分岐switchを単一パラメータ文字列に統合し、14個の型別フォーマットリソースを削除
  • プロパティ最適化:JsonMetadataServices.Converters.csでC# fieldキーワード使用により39個のバッキングフィールドを削除

パフォーマンスへの影響

影響なし(パフォーマンス関連の数値情報の記載なし)

関連Issue

#131097

その他

  • .NET バージョン制約:すべての新機能は#if NET11_0_OR_GREATERでゲート。netstandard2.0とnet462をターゲットとしているため#if NETでは不十分
  • テスト実績:net11.0(Windows x64)にてSystem.Text.Json.Tests 53471 passed、System.Text.Json.SourceGeneration.Roslyn4.4.Tests 10868 passed
  • テスト範囲:共有テストスイート(Ieee754NumericConverterTests.cs)でルート値、ボックス化オブジェクト、POCOプロパティ、List/Dictionary要素、JsonNode経由での往復シリアライゼーション、命名リテラル(NaN/Infinity)、バッファ拡張パスを網羅

#131488 [arm64] Use the scalar shift when scaling Vector64 shuffle indices

概要

arm64 の checked JIT で Vector64.Shuffle / Vector64.ShuffleNative が64ビット要素型(1D アレンジメント)の場合にアサーション失敗していた問題を修正しました。シャッフルインデックスのスケーリング時に、この特定のケースではスカラーシフト組み込み関数を使用するようにしました。

// Vector64<nint> や Vector64<nuint> での変数インデックス指定時に有効
var indices = stackalloc int[] { 0 };
var result = Vector64.Shuffle(vector, GetIndices(indices)); // 変数インデックス経由で修正パスを通る

変更内容

  • src/coreclr/jit/gentree.cpp: gtNewSimdShuffleVariableNode でシャッフルインデックススケーリング時に、simdSize == 8 && elementSize == 8 の場合は NI_AdvSimd_ShiftLeftLogicalScalar を選択し、ベクター形式のシフトを避けるようにしました。
  • src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector64Tests.cs: Vector64<nint> / Vector64<nuint> の Shuffle および ShuffleNative について、変数インデックスパスをカバーする回帰テストを4件追加しました。

パフォーマンスへの影響

影響なし。修正はコード生成パスの選択であり、実行性能に変化なし。

関連Issue

#131487

その他

  • この問題は checked arm64 JIT で NativeAOT ビルドを失敗させていました(ILC が ShuffleNative<nuint> をインスタンス化する際)。Release ビルドではアサーションが削除されるため CI では検出されませんでした。
  • osx-arm64 checked runtime で検証済み: 修正前は Assertion failed 'opt != INS_OPTS_1D' で失敗、修正後は新規テスト4件全パス、既存テスト 13008 件中失敗 0 件、ILC による CoreLib コンパイルが正常完了。
  • 変数インデックスパスのみシフト演出を行うため、テストはメソッド境界で変数インデックスを経由させています。

#131486 Bypass CreateReadStream for PhysicalFileInfo in FileConfigurationProvider

概要

.NET 5以降、PhysicalPathを報告しながらCreateReadStreamでコンテンツを変換するカスタムIFileProvider(暗号化されたappsettings.jsonを復号化するケースなど)が設定システムで無視される問題を修正します。FileConfigurationProviderの高速パスを、正確にPhysicalFileInfo型の場合のみに限定し、カスタムプロバイダーの変換ロジックを尊重しつつ、同期I/O最適化を維持します。

変更内容

  • FileConfigurationProvider.cs: fileInfo.PhysicalPath != nullチェックからfileInfo.GetType() == typeof(PhysicalFileInfo)チェックに変更。同期ファイルストリームの直接オープンを、組み込みのPhysicalFileInfoインスタンスのみに制限しました。
  • FileConfigurationProviderTest.cs: 物理/委譲/派生/カスタムプロバイダーをカバーする新しいテスト理論を追加。テストヘルパーFileInfoImpl.CreateReadStream()を実際のファイルストリームをオープンするよう更新。

パフォーマンスへの影響

PhysicalFileInfoを使用する場合、既存の同期I/O最適化が維持されます。カスタムプロバイダーではそのCreateReadStream実装が呼び出される正しい動作に戻りますが、パフォーマンス上のペナルティは意図した設計です。CompositeFileProviderなどの委譲プロバイダーが内部のPhysicalFileInfoを返す場合は、高速パスが保持されます。

関連Issue

#47455、#37846、#47934

その他

  • Microsoft.Extensions.FileProviders.Physicalは既に無条件の依存関係なため、新規依存は不要です。
  • 型チェックのみでリフレクション不使用のため、trim/AOT懸念なし。
  • 型アイデンティティのチェックであり、ファイルプロバイダー自体の可変性(FileConfigurationSource.FileProviderは読み込みのたびに再評価)に対応した堅牢な設計です。

#131480 Treat empty string value from chained configuration as present

概要

ChainedConfigurationProvider.TryGetのロジックを修正し、空文字列("")を有効な値として扱うように変更しました。これまでは!string.IsNullOrEmpty(value)を使用していたため、空文字列を持つキーが見つからないものとして扱われていました。この修正により、チェーン設定の動作が.NET 10で標準化された「空文字列は値、nullは欠落」というルールに合致するようになります。

変更内容

  • ChainedConfigurationProvider.cs: TryGetメソッドの存在判定ロジックを!string.IsNullOrEmpty(value)からvalue != nullに変更。空文字列は有効な値として扱い、nullのみを「見つからない」と判定するように修正
  • ChainedConfigurationProviderTests.cs: 空文字列のシャドーイング動作、null値の非寄与をピンするテストを追加(249行追加)

パフォーマンスへの影響

影響なし

関連Issue

#65594、#116677(.NET 10での類似修正)

その他

破壊的変更: このPRは動作上の破壊的変更です。空文字列値を持つキーが以前は見つからないものとして扱われていましたが、今後は見つかるものとして扱われます。.NET 10の「Null values preserved in configuration」の対となる変更として位置づけられています。

注意点: null値の動作は意図的に変更されていません。ラップされたIConfigurationがインデクサのみを公開しており、null値と欠落キーを区別できないためです。


#131453 Escape C# keyword identifiers in Configuration Binder source generator

概要

Configuration Binder source generatorが、C#キーワード(base、eventなど)をメンバー名として持つモデルに対して生成されたコードをコンパイルできないバグを修正しました。キーワード名の識別子に@プレフィックスを付与することで、有効なC#コードの生成を実現します。

変更内容

  • Helpers.cs: C#キーワードおよびコンテキストキーワードを検出し、識別子に@プレフィックスを付与するEscapeIdentifierヘルパーメソッドを追加(RoslynのSyntaxFactsに基づき実装)
  • CoreBindingHelpers.cs: ローカル変数やメンバーアクセス・初期化子の生成時に、EscapeIdentifierを使用してエスケープされた識別子を使用
  • GeneratorTests.cs: キーワード名のコンストラクタパラメータを持つモデルに対して生成されたコードがコンパイル可能であることを検証する回帰テストを追加

パフォーマンスへの影響

影響なし

関連Issue

#130433

その他

  • 本修正は既にOptions source generatorで使用されているパターンに準拠しています
  • 生成されるコードの位置に現れるメンバー名すべてにエスケープが適用されています
  • テストはコンストラクタパラメータの場合を含んでおり、キーワード名のプロパティについても対応していることが想定されます

#131445 Enable ML-DSA CMS tests on .NET Framework

概要

.NET Framework上でML-DSA(Module-Lattice-Based Digital Signature Algorithm)のCMS署名テストを有効化するテスト更新です。プラットフォームがML-DSAをサポートしている場合、SignedCmsおよびSignerInfoのML-DSA関連テストを実行可能にし、Windows CAPIのSHAKEダイジェストアルゴリズム非対応に関する既知制限を適切にハンドルします。

変更内容

  • SignedCmsTests.cs: ML-DSAテストのゲーティング条件をMLDsa.IsSupportedに変更。SHAKE128/SHAKE256ダイジェストについては.NET Framework上でCryptographicException発生を期待する分岐を追加。非SHAKEダイジェストの署名・ラウンドトリップ検証パスは維持(デタッチドコンテンツカバレッジを含む)。
  • SignerInfoTests.cs: ML-DSAカウンター署名テストを同様にMLDsa.IsSupportedに基づいて実行可能化。SHAKE関連のエラー期待分岐を追加。
  • SignedCmsTests.netcoreapp.cs: 削除されたヘルパー関数への依存を排除し、MLDsa.IsSupported条件に統一。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

テスト実行結果: System.Security.Cryptography.Pkcs.Tests (net481, Release) で386テスト中、失敗0、エラー0、スキップ9。Windows CAPIのSHAKEダイジェスト非対応は既知制限であり、テストで明示的にCryptographicException発生を検証することで制限を文書化しています。


#131438 Split the Copilot instruction files by activity

  • 作成者: @tannergooding
  • 作成日時: 2026年07月27日 20:42:41(UTC)
  • マージ日時: 2026年07月30日 21:47:38(UTC)
  • ラベル: area-skills

概要

dotnet/runtimeのGitHub Copilot指示ファイルを、活動(コード作成、PR作成、レビュー、ビルド・テスト)別に分割し、常にロードされるプロンプト内容を削減しました。.github/copilot-instructions.mdは3,934トークンから1,725トークンに削減(-56%)され、ビルド・テスト手順は新しいbuild-and-testスキルに分離され、レビュー基準はpr-assessment.mdに独立させられました。この変更により、文脈サイズの削減によるAIコスト削減と、ルール発火の誤作動防止が実現されています。

変更内容

  • プロンプトサイズ削減: .github/copilot-instructions.mdから2,654トークン分のビルド・テスト手順を削除
  • 新スキルの追加: .github/skills/build-and-test/SKILL.mdと4つのコンポーネント別ガイダンス(runtime.md, runtime-tests.md, libraries.md, host-and-tools.md)
  • レビュー基準の独立: .github/skills/code-review/pr-assessment.mdを新規作成し、ホリスティックなPR評価基準を集約
  • 指示ファイルの命名変更: review-*プレフィックスを削除し、ドメイン別に再命名(conventions.instructions.md, csharp.instructions.md, native.instructions.md, tests.instructions.md, core-runtime.instructions.mdを追加/更新)
  • 古いファイルの削除: review-all-src.instructions.mdを削除
  • API承認ルールの最適化: 提案段階のプロトタイプブランチと本提出分を区別

パフォーマンスへの影響

トークン削減(tiktoken/o200k_base測定):

  • クエリのみ(ファイル未読): -56%(3,934→1,725トークン)
  • クエリ+.csファイル読込: -37%(9,857→6,255トークン)
  • Libraries C#変更: -13%(9,857→8,572トークン)
  • CoreCLR JIT変更: -15%(8,228→6,976トークン)

AIクレジット削減(1クレジット≈2,039加重トークン):

  • 単一呼び出し(クエリのみ): +1.6クレジット削減
  • 5プロンプト(クエリ+ファイル読込): +13.4クレジット削減
  • 10プロンプト反復(C#変更): +35.4クレジット削減
  • 480モデル呼び出し長時間実行: +105.1クレジット削減(クエリ+ファイル読込時)

その他パフォーマンス考慮:

  • プロンプトキャッシュのTTL(~5分)により、キャッシュなし再開時の初呼び出しは全フレッシュ入力となり、サイズ削減がより効果的
  • 計測値: キャッシュあり文脈の94.6%は読み取り、フレッシュ入力は平均約7kトークン/呼び出し

関連Issue

なし

その他

  • すべてのファイルが.md形式であり、eng/pipelines/runtime.ymlの'**.md'除外によりCI

#131432 [release/10.0] Fix g_gc_lowest_address updating

概要

GCメモリ管理の稀なエッジケースにおいて、g_gc_lowest_addressが不正に0に設定されてしまう問題を修正します。この問題が発生すると、GCがNULLポインタを有効なヒープ参照として扱い、クラッシュの原因となります。

変更内容

  • src/coreclr/gc/gc.cpp: GCアドレス空間の下限を拡張する際の比較演算子を修正(> → >=)。これにより、仮想メモリブロックのアドレスが特定の条件(g_gc_lowest_addressがg_gc_highest_addressの正確に2/3)を満たす場合でも、g_gc_lowest_addressがOS_PAGE_SIZE以上にクリップされるようになります。

パフォーマンスへの影響

影響なし

関連Issue

#131216、#131324

その他

  • 本プルリクエストはrelease/10.0ブランチへのバックポートです
  • 顧客により報告された問題の修正です
  • 修正はエッジケースの条件判定を正確にするシンプルな変更であり、リスクは低いと評価されています
  • 通常のcoreclr/librariesテストで検証済み

#131422 Ensure that Decimal32/64/128 ToString roundtrips and preserves the cohort

概要

Decimal32/Decimal64/Decimal128 の ToString メソッドが、ラウンドトリップ可能な結果を生成し、コホート(同じ値を表現する異なるエンコーディング)を保持するように修正されました。

主な改善点:

  • 正の quantum exponent を持つ値が固定小数点表記で表示されていたため、再パース時に異なるコホートメンバーに解析されていた問題を解決
  • ゼロ係数の quantum を保持するよう DecimalIeee754ToNumber を修正
  • 丸め動作を IEEE 754 に準拠した ties-to-even に統一
  • 負のゼロの符号を保持

出力例:

// 修正前 → 修正後
1e7:      "10000000" → "1E+07"
10e6:     "10000000" → "1.0E+07"
0e2:      "0" → "0E+02"
-0 (E2フォーマット): "0.00E+000" → "-0.00E+000"
0.5 (F0フォーマット): "1" → "0"  // ties-to-even

変更内容

  • Number.Formatting.cs (+94/-5): FormatGeneralAndRoundTripDecimalIeee754 を実装し、scientific notation を quantum exponent が正の場合または compact な場合に発行。新しい NumberBufferKind.DecimalIeee754 を追加
  • Number.NumberBuffer.cs (+9/-1): 新しいバッファ種別 DecimalIeee754 を追加
  • Number.Formatting.Common.cs (+26/-2): ゼロ係数での Scale クランプを削除、符号付きゼロ対応
  • Number.Parsing.cs/Number.Parsing.Common.cs: DecimalIeee754ToNumber でゼロ係数の quantum 保持
  • テストファイル (Decimal32/64/128Tests.cs): ラウンドトリップ、コホート保持、ties-to-even の検証を追加(計355行増加)

パフォーマンスへの影響

影響なし

関連Issue

#131422

その他

  • IEEE 754 §5.12 に準拠した formatting 仕様への変更。公開 API である ToString の動作変更
  • 破壊的変更:G/R フォーマットの出力形式が変更される(以前は 10000000、今は 1E+07)
  • ties-to-even の採用は System.Decimal との非互換性を導入するが、同じ型の Round/quantize/Parse などと一貫性を持つようになった
  • 1,006,382 サンプル Decimal32 値、4,368 Decimal64/Decimal128 値でラウンドトリップ検証済み(ゼロ失敗)
  • System.Runtime.Tests 76,591 テスト、System.Runtime.Numerics.Tests 8,422 テストすべてパス

#131365 Implement IXCLRDataTypeDefinition metadata methods in cDAC

  • 作成者: @Copilot
  • 作成日時: 2026年07月25日 04:26:53(UTC)
  • マージ日時: 2026年07月30日 01:14:41(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDACでIXCLRDataTypeDefinitionのメタデータメソッド(GetCorElementType、GetName、GetTokenAndScope)を実装し、レガシーDACの命名規則とセマンティクスに合わせました。ClrDataTypeDefinitionにモジュール、型ハンドル、メタデータトークンを保持し、デバッグビルドではcDACの結果とレガシーDACの結果を相互検証します。

変更内容

  • ClrDataTypeDefinition.cs: モジュール・型ハンドル・メタデータトークンを保持するフィールドを追加。GetCorElementType、GetName、GetTokenAndScopeメソッドを実装し、ネイティブDAC互換のバッファ処理とHRESULT形式に対応。デバッグビルドでcDACとレガシーDACの結果を検証。
  • CorDbHResults.cs: HRESULTの定数定義を調整。
  • TypeHandleTests.cs: 出力値、無効な引数、バッファトランケーションのカバレッジを追加。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

Copilotによる低信度コメント:デバッグビルドのクロスバリデーション処理で、bufLen == 0の場合にnew string(nameBuf)が呼び出し元のバッファを越えて読み込む可能性が指摘されています。バッファ長が0でない場合のみ文字列比較を実行するようガード処理を追加することが推奨されています。


#131334 Implement IXCLRDataExceptionState.GetManagedObject in cDAC

  • 作成者: @Copilot
  • 作成日時: 2026年07月24日 17:35:56(UTC)
  • マージ日時: 2026年07月30日 01:18:28(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDACでIXCLRDataExceptionState.GetManagedObjectを実装し、マネージド例外オブジェクトの取得機能をレガシーDAC互換の動作で提供します。スローされたオブジェクトハンドルをClrDataValueに解決し、オブジェクトサイジングセマンティクスを保持します。

変更内容

  • ClrDataExceptionState.cs: GetManagedObjectメソッドの実装追加。スローオブジェクトハンドルの妥当性検証、null/読取不可能なハンドルをE_INVALIDARGにマッピング、null出力パラメータでE_POINTERを保持、デバッグビルドでレガシーDAC互換性の検証を実施
  • ClrDataExceptionStateTests.cs: 実装に対応するユニットテストを追加(110行の新規テスト)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 互換性: レガシーDAC互換の動作を意図的に保持していますが、Copilotレビューの指摘では、null出力ポインタが渡された場合の優先度処理について検証の改善が推奨されています
  • テストカバレッジ: 現在のテスト実装では、出力ポインタがnullかつスローオブジェクトハンドルが無効な場合の優先度テストケースが欠落しているとの指摘があります

#131326 Re-enable the ArrayPool PollingEventFires test

概要

2020年から無効化されていた System.Buffers.ArrayPool.Tests.CollectionTests.PollingEventFires テストを再度有効化するPR。ArrayPool の完全な実装改善により、元々の問題は解消されたが、BufferTrimPoll イベント発火の検証ロジックをGC/ファイナライザータイミングの揺らぎに強くするため、ポーリング検査にリトライロジックを追加しています。

変更内容

  • src/libraries/System.Runtime/tests/System.Buffers.Tests/ArrayPool/CollectionTests.cs
    • [ActiveIssue("https://github.com/dotnet/runtime/issues/44037")] 属性を削除してテストを再度有効化
    • 2番目のポーリング検査に対して、BufferTrimPoll イベントが発火するまで複数回リトライする機構を追加
    • イベント発火の検証をより堅牢にするため、GC.Collect(2) + GC.WaitForPendingFinalizers() の実行を制限回数内で繰り返す仕様に変更

パフォーマンスへの影響

影響なし(テストコードの堅牢性向上であり、ランタイムパフォーマンスへの影響なし)

関連Issue

#44037

その他

  • テスト修正は、SharedArrayPool<T> の完全改善後における Gen2GcCallback ファイナライザー内でのイベント発火タイミングの不確定性に対応するもの
  • ローカルで30回のテスト実行で確認され、ハング/失敗なし

#131310 Fix WKS BGC access violation from stale ma_committed on unlinked expansion segment (#123490)

  • 作成者: @kkokosa
  • 作成日時: 2026年07月24日 10:40:33(UTC)
  • マージ日時: 2026年07月30日 11:08:56(UTC)
  • ラベル: area-GC-coreclr

概要

Workstation背景GC(セグメント方式)で発生するアクセス違反の修正。フォアグラウンドGC中に未リンク状態の拡張セグメント上のマークアレイが未コミット状態のままとなり、後続のBGCでピンオブジェクトのスキャン時に無効メモリへのアクセスが発生していた。Server GCで既に実装されている安全ネット(拡張セグメント追跡とマークアレイ再コミット)をWorkstation GCに拡張することで修正。

変更内容

  • src/coreclr/gc/plan_phase.cpp: Workstationコンパクティング+拡張GC時にnew_heap_segmentをリセットおよび設定
  • src/coreclr/gc/gcpriv.h: Workstation単一ヒープ向けにnew_heap_segmentフィールドを!USE_REGIONSビルドに追加
  • src/coreclr/gc/gc.cpp: Workstation向けにnew_heap_segmentスタティック変数を定義・初期化
  • src/coreclr/gc/background.cpp: マークアレイ成長時に未リンク拡張セグメントのマークアレイスライスを再コミット

パフォーマンスへの影響

新規ロック機構の追加なし。既存Server GCパターンのミラーリング。メモリオーバーヘッドなし。

関連Issue

#123490
#88977
#93162
#105211

その他

  • 影響範囲: Workstation + セグメント方式(!USE_REGIONS)のみ(32ビットビルド)。64ビットデフォルト(Regions方式)およびServer GCは変更なし
  • 検証: x86 Checked ビルドで、決定論的な再現テストにより修正前は6/6クラッシュ、修正後は8/8パス確認
  • 互換性: 破壊的変更なし。既にServer GCで数年間運用されているパターンの統一

#131307 Add Reset() to the Zlib-based Encoders/Decoders

概要

System.IO.Compression内の6つのzlib系ストリームレス圧縮/展開コーダー(DeflateEncoder/DeflateDecoder、ZLibEncoder/ZLibDecoder、GZipEncoder/GZipDecoder)にReset()メソッドを追加し、インスタンスを初期状態に戻して再利用できるようにします。

var encoder = new DeflateEncoder();
encoder.Encode(data1, buffer1, out _, out _);
encoder.Reset(); // 初期状態に戻す
encoder.Encode(data2, buffer2, out _, out _); // 新しい圧縮操作を開始

変更内容

  • ネイティブ層: 新しいCompressionNative_DeflateResetエクスポート(Windows/Unix)と対応するPAL実装を追加(pal_zlib.cでdeflateResetをラップ)
  • 相互運用: LibraryImport経由でCompressionNative_DeflateResetのマネージドラッパーを追加(Interop.zlib.cs)
  • SafeHandle: ZLibStreamHandleにDeflateReset()メソッドを追加
  • パブリックAPI: 6つのエンコーダー/デコーダー型にReset()メソッドを追加(ref/System.IO.Compression.csで公開面に記載)
    • DeflateEncoder/DeflateDecoder: ネイティブ呼び出しと管理状態クリア
    • ZLibEncoder/ZLibDecoder、GZipEncoder/GZipDecoder: 内部のDeflateEncoder/DeflateDecoderへの委譲
  • テスト: 共有テスト基盤にReset()関連テストを追加(新規インスタンス、部分的な作業後のリセットなど)

パフォーマンスへの影響

影響なし。Reset()は既存インスタンスの再利用を可能にするため、新しいインスタンス生成によるメモリ割り当てを削減できます。

関連Issue

#130465
#129090

その他

  • API承認: Copilotのレビューコメントで、API承認の追跡が不完全であることが指摘されています。承認済みラベルの適用が必要です。
  • ドキュメント精度: Reset()のリマークに、ZLibCompressionOptionsから構築された場合に圧縮戦略(compression strategy)も保持される点が記載されていないとの指摘があります。
  • パブリックAPI: 内部実装ではなく、公開APIの追加です。

#131302 XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements

概要

XmlSerializerのUnknownAttributeイベントが、プリミティブ型・配列・コレクション型にマップされた要素の不正な属性に対して発火していなかった問題を修正しました。これまでこれらの型は属性をチェックせずコンテンツを直接読み込んでいたため、余分な属性は無視されていました。修正後、ユーザー定義型と同様に属性を走査し、UnknownAttributeイベントを発火させるようになります。

変更内容

  • XmlSerializationReader.cs: プリミティブ/配列/コレクション要素の属性走査ロジックを追加(28行追加)
  • XmlSerializationReaderILGen.cs: IL生成リーダーに同様の属性チェック機能を実装(98行追加)
  • ReflectionXmlSerializationReader.cs: リフレクションベースリーダーに属性走査機能を追加(25行追加)
  • XmlSerializerTests.cs: 回帰テスト2件を追加
    • XmlUnknownAttributeOnBuiltInTypedMembersTest: string/int/nullable-int/list/array メンバーの不正な属性が報告されることを検証
    • XmlNilAttributeOnBuiltInTypedMembersNotReportedTest: xsi:nilが不正な属性として報告されないことを検証
  • SerializableAssembly.XmlSerializers.cs: コード生成されたシリアライザー更新

パフォーマンスへの影響

影響なし(属性走査は既に構造体パスで実装されている既存ロジックを拡張したもの)

関連Issue

#96683

その他

  • 互換性影響: なし。UnknownAttributeイベントにハンドラーが購読されていない場合、動作は変わりません。購読されている場合のみ、プリミティブ型要素の属性についても通知されるようになります。
  • xsi:nil属性は意図的にスキップされます(GetNullAttr()でガード)。これは既存の構造体パスの動作に合致しています。
  • 3つのリーダー(リフレクション、IL生成、コード生成)に一貫した変更が適用されています。

#131275 [HTTP] High cardinality metrics to observable

  • 作成者: @ManickaP
  • 作成日時: 2026年07月23日 15:59:15(UTC)
  • マージ日時: 2026年07月30日 09:19:54(UTC)
  • ラベル: area-System.Net.Http

概要

System.Net.Httpクライアントメトリクスの高カーディナリティタグによるデータ蓄積問題を緩和するため、http.client.open_connectionsとhttp.client.active_requestsをイベントベースのUpDownCounter<long>から、スナップショット報告型のObservableUpDownCounter<long>に変更します。これにより、モニタリング側でのメトリクスデータ蓄積を軽減します。

重要な互換性への影響: MeterListenerを直接利用している場合、RecordObservableInstruments()の呼び出しが必須になります。

変更内容

  • MetricsHandler.cs: http.client.active_requestsをObservableUpDownCounterに変更し、リクエストタグ別に追跡するトラッカー(ConcurrentDictionary)を導入。
  • SocketsHttpHandlerMetrics.cs: http.client.open_connectionsをObservableUpDownCounterに変更し、タグ別の接続数トラッカーを実装。
  • ConnectionMetrics.cs: 接続の開閉・アイドル状態遷移を新しいオープン接続トラッカーで追跡するよう更新。
  • Http3Connection.cs: 軽微な変更(4行)。
  • MetricsTest.cs: テストを更新し、MeterListener.RecordObservableInstruments()の明示的な呼び出しとスナップショット型の観測値検証に対応。

パフォーマンスへの影響

メトリクスデータの蓄積を軽減するため、メモリ効率が向上します。詳細な改善率は提供されていません。

関連Issue

#122752

その他

  • この変更は一時的な緩和措置であり、OpenTelemetry側で根本的な解決がなされた時点で将来的に変更を取り消す予定です。参照: https://github.com/open-telemetry/semantic-conventions/issues/3279
  • MeterListenerを直接利用するコード(サードパーティライブラリなど)は、本変更後にRecordObservableInstruments()を呼び出して値を取得する必要があります。

#131069 Fix non-monotonic GC.GetTotalAllocatedBytes under DATAS (Server GC)

  • 作成者: @kkokosa
  • 作成日時: 2026年07月20日 10:24:09(UTC)
  • マージ日時: 2026年07月30日 11:14:19(UTC)
  • ラベル: area-GC-coreclr

概要

Server GC環境でDATAS(Dynamic Adaptation To Application Sizes)が有効な場合、GC.GetTotalAllocatedBytes()が非単調(減少)になるバグを修正しました。根本原因は、アクティブなヒープ数のみを集計していたため、ヒープが一時停止されると割り当てバイト数が減少していました。修正は、現在アクティブなヒープだけでなく、存在したすべてのヒープの累積値を集計することで、単調性を保証します。

変更内容

  • src/coreclr/gc/interface.cpp: GCHeap::GetTotalAllocatedBytes()のループを n_heaps から n_max_heaps に変更し、すべてのヒープ(非アクティブを含む)のtotal_alloc_bytesを集計するように修正
  • src/tests/GC/API/GC/GetTotalAllocatedBytesServerGC.cs: Server GC + DATAS環境での回帰テストを追加。振動する割り当て負荷と強制的なgen2 GCの下で、GC.GetTotalAllocatedBytes(precise: true)が64 MB許容範囲を超えて減少しないことを検証
  • src/tests/GC/API/GC/GetTotalAllocatedBytesServerGC.csproj: テストプロジェクト設定(優先度1、Server GC + DATAS構成)

パフォーマンスへの影響

影響なし。合計値の計算ロジックのみの変更であり、パフォーマンスに関連する変更ではありません。

関連Issue

その他

  • 修正前の動作: DATAS収縮時に割り当て総量が最大64~94 GB減少(テスト環境では1回の実行で5~12回の低下を記録)
  • 修正後の動作: 単調性を保証(テスト環境で0回の低下、1.13M回のプローブでも単調)
  • precise: false(デフォルト)のパスはハイウォーターマーク制限により低下がマスクされていたため、precise: trueのパスほど顕著ではありませんでしたが、同じ根本原因で問題が発生していました
  • DATAS無効時はn_heaps == n_max_heapsのため、動作は変わりません

#131045 ConfigurationBinder: Skip binding null getter-only collection properties

概要

Configuration Binder ソースジェネレータが、null値のゲッター専用コレクションプロパティへのバインディングを試みていた問題を修正。ゲッター専用プロパティは割り当てできないため、バインドされた一時的なコレクションがすぐに破棄される無駄な割り当てが発生していました。本変更により、プロパティ値が非nullの場合のみバインディングロジックを実行するようになります。

変更内容

  • CoreBindingHelpers.cs: ゲッター専用プロパティの現在の値を一時変数に読み込み、非null時のみバインディングロジックを呼び出すロジックを追加(+14行)
  • テストベースライン: GetterOnlyCollectionPropertiesテストの期待出力ファイルをnet462・netcoreappの各バージョン別に追加(合計554行)
  • GeneratorTests.Baselines.cs: テストケース定義を追加(+29行)

パフォーマンスへの影響

メモリ割り当てと不要なバインディング処理の削減。getter-only null プロパティに対して、無駄なコレクション割り当てと初期化処理がスキップされるため、パフォーマンス向上が期待されます。

関連Issue

#130879

その他

  • net11.0とnet472での動作確認完了
  • SourceGenerationTests全体で331/317テスト合格(net11.0/net472)
  • 内部実装の改善で、公開APIへの破壊的変更なし

#131027 Use cdac for metadata serialization

  • 作成者: @rcj1
  • 作成日時: 2026年07月19日 05:43:29(UTC)
  • マージ日時: 2026年07月30日 02:44:43(UTC)
  • ラベル: area-Diagnostics-cdac

概要

このPRはデバッガのメタデータ取得をレガシーな「リモートMD構造逆シリアライゼーション」パスから、DacDbi + cDAC ベースのシリアライゼーション手法に切り替えます。読み書き可能なメタデータ(MDInternalRW)をcontiguousなECMA-335 metadataブロブとしてシリアライズし、cDACのEcmaMetadataコントラクト内に処理をカプセル化することで、従来のカスタムデータソースインフラストラクチャ全体を削除します。

変更内容

DacDbi API変更(内部実装)

  • IDacDbiInterfaceからGetDefinesVersion/SetDefinesVersionを削除
  • 新しいAPI追加:GetReadWriteMetadataSize、FillReadWriteMetadata で読み書きメタデータのシリアライゼーション対応

cDAC契約の拡張

  • IEcmaMetadata.GetReadWriteMetadataを追加(読み書きメタデータのシリアライズ処理とキャッシング機能を実装)
  • IDebuggerコントラクトを簡潔化(初期化状態のみを保持)

削除対象

  • FEATURE_METADATA_CUSTOM_DATA_SOURCE 関連コード全削除
  • src/coreclr/md/datasource/ 配下の「RemoteMDInternalRWSource」「DataTargetReader」など、カスタムデータソースの実装全体
  • メタデータレイアウト検証インフラ(VerifyLayoutsMD)
  • IMetaDataDispenserCustomインターフェース

ファイル削除: datasource関連13ファイル、verifylayouts関連2ファイル

デバッガ呼び出し元の変更

  • module.cpp:GetReadWriteMetadataSize → FillReadWriteMetadata → OpenScopeOnMemory の流れで対応

パフォーマンスへの影響

構造的な改善により二重走査の可能性あり(Copilotコメント参照):GetReadWriteMetadataSizeとFillReadWriteMetadataが背後で同じSerializeReadWriteMetadataを実行するため、メタデータ刷新時に2回のウォークが発生する懸念。単一パスでの取得APIの検討が推奨されています。

関連Issue

#131027

その他

コード品質への注記(Copilotの指摘)

  • 公開API IEcmaMetadata.GetReadWriteMetadata は承認プロセスの確認が必要
  • CoTaskMemAlloc の OOM チェック不足(module.cpp:507)
  • バッファサイズキャスト時の オーバーフロー懸念(DacDbiImpl.cs:407)
  • DEBUG検証ブロックのコンパイルエラー(キャスト非チェック)
  • 新しいGetReadWriteMetadataSize/FillReadWriteMetadata APIに対するダンプベースの統合テスト追加が推奨

#131018 Optimize method invocations in System.Text.Json et al.

概要

System.Text.Jsonのリフレクションベースメンバーアクセッサをリファクタリングし、サポートされているフレームワークでMethodInvoker/ConstructorInvoker APIを使用するよう更新しました。これによりメソッド呼び出しが高速化され、TargetInvocationExceptionでのラッピングが回避されます。また、属性の存在確認をIsDefinedに置き換えて不要なアロケーションを削減しています。

変更内容

  • ReflectionMemberAccessor.cs: リフレクション呼び出しをConstructorInvoker/MethodInvokerに置き換え(NET条件付き)
  • MemberAccessor.cs: パラメータ化されたコンストラクタの抽象API署名をFunc<object?[], T>に更新
  • ReflectionEmitMemberAccessor.cs / ReflectionEmitCachingMemberAccessor.cs: コンストラクタデリゲート署名をFunc<object?[], T>に統一
  • ReflectionExtensions.cs: JsonConstructorAttributeの存在確認をGetCustomAttribute() != nullからIsDefined()に変更し、属性インスタンスの不要なアロケーション削減

パフォーマンスへの影響

メソッド呼び出し経路の最適化により、System.Text.Jsonのシリアライズ/デシリアライズパフォーマンスが向上します。MethodInvoker/ConstructorInvokerは直接呼び出しに近い高速パスを提供し、IsDefinedへの置き換えはリフレクション操作のメモリアロケーション削減。

関連Issue

なし

その他

内部実装の最適化であり、パブリックAPIへの破壊的変更なし。


#128152 JIT: Use a "resumed?" indicator variable in runtime async instead of lvaAsyncContinuationArg != nullptr

概要

JITのランタイム非同期処理において、lvaAsyncContinuationArg != nullptr による暗黙的な「再開済み」判定を、明示的なブール型ローカル変数 lvaResumedIndicator に置き換えます。これは非同期メソッドのインライン化を実現するための基盤変更です。従来の判定方法はインライン関数では無効であるため、明確な指標変数が必要とされています。

変更内容

  • async.cpp/async.h: lvaResumedIndicator (TYP_UBYTE型) を導入し、プロローグ/OSRエントリ/ループで初期化。AsyncResumedUse/AsyncResumedDef という新しい疑似引数を追加し、すべての非同期呼び出しを通じて伝播。再開パスで指標変数に1を格納。
  • compiler.h/compiler.cpp: lvaResumedIndicator フィールド追加、OSRローカル整合性チェックに組み込み。
  • compiler.hpp: VisitLocalDefs/VisitLocalDefNodes を拡張し、呼び出しの非同期再開defも訪問対象に。
  • gentree.h/gentree.cpp: 新しい WellKnownArg 値と gtCallGetDefinedAsyncResumedLclAddr 追加。
  • morph.cpp/lclmorph.cpp: アドレスエスケープロジック一般化、AsyncResumedDef (サイズ1) の認識。
  • importer.cpp/fginline.cpp: 新しい疑似引数をインライン引数情報構築時にスキップ。
  • lclvars.cpp/fgdiagnostic.cpp: リンク型ローカルのデバッグチェック拡張。

パフォーマンスへの影響

影響は混在しており、通常の改善ではありません。新しい指標変数へのストア生成が必要なため、すべてのケースで利点があるわけではありません。代替案として、ルート関数では lvaAsyncContinuationArg != null 継続使用、インライン関数のみで指標ローカル使用という検討の余地があります(OSR対応も簡潔化可能)。

関連Issue

なし

その他

Copilotからの指摘として、CreateSharedFinishContextHandlingBB で作成される共有「resumed」ローカルが TYP_UBYTE として読み込まれていますが、後続の処理で TYP_INT が期待される可能性があり、型/ABIの不一致に注意が必要です。ローカル自体は TYP_UBYTE 保持しつつ、読み込みを TYP_INT にすることで一貫性確保が推奨されています。


目次