注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
- #125021 Skip NonBacktracking deep nesting test on single-threaded WASM
- #125014 Fix browser-targeting builds: move
declare globalfrom public-api.ts to export-api.ts - #125001 Update EncodingTable to use ConcurrentDictionary for performance
- #124997 Reduce lock contention in socket on Windows
- #124850 [WBT] enable coreCLR
- #124408 Fix TypeLoadException in GetMarshalAs when SafeArray has zero-length user-defined type name
#125021 Skip NonBacktracking deep nesting test on single-threaded WASM
- 作成者: @lewing
- 作成日時: 2026年03月01日 02:36:41(UTC)
- マージ日時: 2026年03月01日 22:32:42(UTC)
- ラベル: area-System.Text.RegularExpressions
概要
WASM等のマルチスレッド非対応プラットフォームで、NonBacktracking正規表現エンジンの深いネスト構造テストが失敗する問題を修正しています。テストを[ConditionalTheory]に変更し、マルチスレッド非対応環境ではNonBacktrackingエンジンのみをスキップするガード処理を追加することで、他のエンジン(Interpreter、Compiled)は引き続き全プラットフォームで実行されます。
変更内容
- ファイル:
src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/Regex.Match.Tests.cs[Theory]属性を[ConditionalTheory]属性に変更- テスト内で
!PlatformDetection.IsMultithreadingSupportedをチェックするガード処理を追加 - NonBacktrackingエンジンの実行をマルチスレッド対応プラットフォームに限定
パフォーマンスへの影響
影響なし。本変更はテスト実行時の条件分岐のみで、実装コードへの変更はありません。
関連Issue
- #125020(本修正の対象Issue)
- #124995(当該テストを追加したPR)
その他
この修正により、ブラウザベースのWASM環境を含むマルチスレッド非対応プラットフォームでのテスト実行がより堅牢になります。PlatformNotSupportedExceptionによる例外は回避され、テストスイートの実行がスキップで適切に処理されるようになります。
#125014 Fix browser-targeting builds: move declare global from public-api.ts to export-api.ts
- 作成者: @Copilot
- 作成日時: 2026年02月28日 20:01:45(UTC)
- マージ日時: 2026年03月01日 00:34:12(UTC)
- ラベル: arch-wasm area-System.Runtime.InteropServices.JavaScript
概要
Browser/WASM向けのビルドがrollup-plugin-dts v6.2.3とrollup 4.59.0の組み合わせで失敗する問題を修正しました。public-api.ts内のdeclare global {}ブロックがrollupによって誤ってエクスポート対象として扱われ、"global"が実在しない変数として検出されるのが原因です。修正によりdeclare global {}をrollupのエントリーポイントであるexport-api.tsに移動することで、エクスポート検証に引っかからないようにしました。
変更内容
src/native/libs/Common/JavaScript/types/public-api.ts—declare global {}ブロック(3行)を削除src/native/libs/Common/JavaScript/types/export-api.ts—declare global {}ブロック(4行)を追加src/native/libs/Common/JavaScript/loader/dotnet.d.ts— 再生成(宣言順序のみ変更、API表面は同一)
パフォーマンスへの影響
影響なし。TypeScriptのソースコード構成変更のみで、生成される型定義の実質的な内容には変化がありません。
関連Issue
なし。ただしrollup 4.59.0のパッケージ更新による回帰対応です。
その他
- リスク評価:低 —
declare global {}ブロックの配置変更のみで、生成される.d.tsAPIサーフェスは変更されていません - テスト済み: ローカルでCI相当のrollup呼び出し(
Configuration:RELEASE)で失敗を再現し、修正後の解決を確認。TypeScript型チェック(tsc --noEmit)も合格 - 背景: Mono/browser runtimeの
export-types.tsでの既存パターンに準拠しています
#125001 Update EncodingTable to use ConcurrentDictionary for performance
- 作成者: @Copilot
- 作成日時: 2026年02月28日 03:45:02(UTC)
- マージ日時: 2026年03月01日 00:47:47(UTC)
- ラベル: area-System.Globalization
概要
System.Text.Encoding.CodePagesのEncodingTable.csで、Dictionary + ReaderWriterLockSlimによる複雑なロック機構をConcurrentDictionaryに置き換えました。読み取り時の高速パスでロック取得が不要になり、パフォーマンスが向上します。既にSystem.Private.CoreLibで使用されているパターンに統一しました。
変更内容
| ファイル | 変更内容 |
|---|---|
EncodingTable.cs |
Dictionaryフィールド4個 + ReaderWriterLockSlimをConcurrentDictionary4個に置き換え。GetCodePageItem、GetCodePageFromName、GetNameFromCodePageの3メソッドを、ネストされたEnterUpgradeableReadLock/EnterWriteLockパターンからTryGetValue/TryAddの単純な呼び出しに簡潔化(~50行削減) |
.csproj |
System.Collections.Concurrentプロジェクト参照を追加(NetCoreAppCurrentターゲット用) |
パフォーマンスへの影響
改善点:
ConcurrentDictionary.TryGetValueはロック不要なため、読み取り時の高速パスでロック取得オーバーヘッドが完全に排除されます- キャッシュヒット時の
CodePagesEncodingProvider.GetEncoding(name)やエンコーディングプロパティアクセッサが高速化 - 複雑なロック制御ロジックが削除され、コード保守性も向上
計測:
- @EgorBotベンチマーク実施済み(linux_amd、osx_arm64環境でホットキャッシュパスを計測中)
関連Issue
記載なし
その他
- ✅ ビルド成功(警告・エラー0件、全ターゲットフレームワーク対応)
- ✅ 既存テスト1250個すべてパス(失敗0件)
- 設計パターンが既存の
System.Private.CoreLibのEncodingTableと統一され、コード管理の一貫性が向上
#124997 Reduce lock contention in socket on Windows
- 作成者: @Copilot
- 作成日時: 2026年02月28日 01:09:54(UTC)
- マージ日時: 2026年03月01日 17:02:15(UTC)
- ラベル: area-System.Net.Sockets
概要
Windows上のソケット非同期操作において、DynamicWinsockMethods.GetMethods()が全呼び出しで同じグローバルロックを獲得していたロック競合を削減。List<T> + lock(s_methodTable)をvolatile配列を使用したロックフリーな読み取りパスに置き換え、テーブルが完全に満たされた後の不要なシリアライズを除去。
// 変更前:すべてのsocket操作で単一ロック上でシリアライズ
lock (s_methodTable) { /* linear scan + possible add */ }
// 変更後:読み取りはロックフリー、書き込みはコピーオンライト
foreach (DynamicWinsockMethods methods in s_methodTable) // volatile読み取り、ロック不要
if (methods.Matches(...)) return methods;
return GetMethodsSlow(...); // キャッシュミス時のみロック取得
変更内容
src/libraries/System.Net.Sockets/src/System/Net/Sockets/DynamicWinsockMethods.cs (40行修正)
List<DynamicWinsockMethods>+lock(s_methodTable)パターンを削除volatile DynamicWinsockMethods[]を導入してロックフリーな読み取りパス実装- 専用の
Lock s_methodTableLockを追加し、低速パス(キャッシュミス時)でのみ獲得 - ダブルチェック・ロックイディオムでスレッドセーフなコピーオンライト配列更新を実現
パフォーマンスへの影響
改善点:
- ロック競合削減:キャッシュヒット率が高い通常パスで完全なロックフリー化を実現。volatile読み取りのload-acquire セマンティクスにより可視性を確保
- 並行性向上:複数スレッドの同時アクセスが阻害されず、スケーラビリティ向上が期待される
- メモリ効率:
List<T>の動的再割り当てから固定サイズの配列スナップショット方式への変更で予測可能なメモリ動作
関連Issue
なし
その他
- 「
lock(collection)アンチパターン」の除去:以前のコードはList<T>インスタンス自体をロックキーとしていた不適切な実装を改善 - このパターンはWindows固有のソケット実装(Winsock)に限定された変更のため、他プラットフォームへの影響なし
#124850 [WBT] enable coreCLR
- 作成者: @pavelsavara
- 作成日時: 2026年02月25日 09:27:37(UTC)
- マージ日時: 2026年03月01日 12:31:51(UTC)
- ラベル: arch-wasm area-Infrastructure-coreclr os-browser
概要
このPRはWebAssembly(WASM)ブラウザテストスイートにおいてcoreCLRサポートを有効化するための変更です。主な内容は、WasmBrowserRunMainOnlyの削除、ネイティブテストカテゴリの追加、CoreCLR実行時のdotnet.diagnostics.jsの常時期待、ネイティブトレイトの無効化、およびAOTテストの分離です。
変更内容
主要な変更ファイル:
- パイプライン設定:
evaluate-default-paths.yml、runtime.ymlにWASM CoreCLR対応を追加 - テストジョブリスト:
BuildWasmAppsJobsListCoreCLR.txt(+12行)新規ファイルでCoreClrテストジョブを定義 - ビルドターゲット:
sendtohelix-browser.targets(3/-2)sendtohelix-wasm.targets(10/-3) 診断ファイル処理を更新
- Wasm.Build.Tests配下: 56ファイル中56ファイル変更
- 複数のテストクラスに
[TestCategory("native")]を追加 BrowserStructures/TestAsset.csから1行削除ModuleConfigTests.csで大幅な修正(16/-8)- Blazor、診断、DllImport、ICUシャーディング、メモリ、グローバライゼーション関連テストを更新
- 複数のテストクラスに
パフォーマンスへの影響
影響なし。本変更はテストインフラストラクチャの再構成であり、ランタイムパフォーマンスへの直接的な影響はありません。
関連Issue
記載情報なし(PR番号 #124850が参照されていますが、Issue詳細は記載なし)
その他
- テスト結果: Passing: 59, Failing: 27(未統合状態)
- 互換性:
WasmBrowserRunMainOnlyの削除は公開APIではなくテストインフラの内部変更 - スコープ: 本変更はWASMブラウザテストのみに限定され、他の実装に影響なし
#124408 Fix TypeLoadException in GetMarshalAs when SafeArray has zero-length user-defined type name
- 作成者: @Copilot
- 作成日時: 2026年02月13日 23:22:11(UTC)
- マージ日時: 2026年03月01日 04:55:23(UTC)
- ラベル: area-Interop-coreclr
概要
MetadataImport.GetMarshalAsで、SafeArrayに長さ0のユーザー定義型名がある場合にメモリ範囲外のデータを読み込んでTypeLoadExceptionが発生する回帰バグを修正します。tlibimpが生成するCOM相互運用アセンブリで発生していました。修正は、ネイティブ側でバイト長を提供してマネージド側で正確に読み込むように改善し、FCCallをQCallに変更して安全性を向上させています。
変更内容
- managedmdimport.cpp/hpp, ecalllist.h, qcallentrypoints.cpp:
GetMarshalAsをFCCall(11パラメータ)からQCall(14パラメータ)に変換。SafeArray、CustomMarshaler、Cookie文字列のバイト長を新たに渡す - MdImport.cs: マネージド側で
LibraryImport(QCall)に更新。CreateReadOnlySpanFromNullTerminatedの代わりにnew ReadOnlySpan<byte>(ptr, length)で安全に読み込む。safeArrayUserDefinedType解決時にTypeLoadExceptionをキャッチ - mlinfo.cpp: NATIVE_TYPE_SAFEARRAYとNATIVE_TYPE_CUSTOMARSHALERの末尾バイト数を厳密にチェックする過度なアサートを削除(ECMA-335は末尾バイト許可)
- callhelpers-interp-to-managed.cpp: WASM callhelpersを再生成(QCall署名対応)
- MarshalAsAttributeTests.cs: 回帰テスト追加(長さ0のFieldMarshalブロブを構築)
// 修正前:null終端文字列と仮定して読み込み(メモリ範囲外アクセス)
var span = CreateReadOnlySpanFromNullTerminated(nativeTypePtr);
// 修正後:ネイティブ側から提供されるバイト長を使用
var span = new ReadOnlySpan<byte>(nativeTypePtr, byteLength);
パフォーマンスへの影響
影響なし。FCCallからQCallへの変更により、関数呼び出しのオーバーヘッドはわずかですが、メタデータ解析時の安全性が向上します。
関連Issue
dotnet/runtime #124346(.NET 9/10での回帰、.NET 8では正常動作)
その他
- commit a3dc1337による回帰が原因(マネージド文字列返却から生ポインタ返却への変更)
- 実世界のtlibimpアセンブリ(Interop.MFilesAPI v26.2.2など)で確認済みの問題
- 既存テストのtypo修正:
Ctor_UmanagedTye→Ctor_UnmanagedType - テストは
IsBuiltInComEnabledとIsReflectionEmitSupportedでガード