项目私有 Jint 补丁
固定输入为 Jint 4.11.0 / net10.0 原始程序集 SHA256
acf8a1a9f98aa771c95c2b15b9b58f21de8b77f027e2a8d5ca92597e87752d9d。
工具只改项目私有 obj 副本,不修改全局 NuGet 包。
默认模式保留 V2 异常清理补丁:将可支持的 finally 清理镜像到 catch/rethrow,并保留正常 finally 路径和重复进入保护;未支持的嵌套异常形状在收据中明确列出。
--bind-only 为 Windows 宿主项目提供独立的可调用目标修复。原版本 BindFunction 自身实现 ICallable,却把其绑定目标强制转为 Function,导致再次绑定和绑定 Proxy 后调用失败。修复只将实际调用分派改为 ICallable.Call;instanceof 同样通过可表达这些对象的 ObjectInstance / JsValue.OrdinaryHasInstance 分派。原绑定参数、接收者、构造和异常路径保留。
原实现可查 Jint 4.11.0 BindFunction.cs。
根 Directory.Build.targets 导入 HostJint.targets,在每个实际宿主可执行文件或测试的复制阶段完成后,将该宿主的 Jint 复制到独立 obj/XfeJintHost、验证固定源哈希、校验并修正 IL,再复制回该项目自己的输出目录。Jint.dll.XfeBind.json 记录真正输出程序集的 SHA256。依赖编译引用不改,Interop 限制不放宽。
--bind-and-cleanup 用于 Cosmos 原生编译私有副本,先校验固定版本与方法形状,再应用原 V2 清理和相同的可调用目标修复。最终 .XfeCleanup.json 与 .XfeBind.json 都绑定实际最终 DLL 的 SHA256;前者增加 BoundCallablePatchVersion: 1。相同输入和有效收据可幂等重试,收据缺失、哈希改变、未标记非原始输入或非私有路径会被拒绝。
dotnet test Tests/XFESystem.JintCleanupPatch.Tests/XFESystem.JintCleanupPatch.Tests.csproj -c Release --artifacts-path <独立绝对路径>
测试包含原异常清理行为、实际加载宿主 DLL 标记与哈希、重复绑定、Proxy、接收者与参数、构造和 instanceof、名称和长度、非函数拒绝、原始包不变以及双补丁最终收据。
两个绑定模式还固定应用 JintOwnedWeakCollectionsV1:保留真实 JsWeakMap / JsWeakSet 的构造器、原型、参数验证和全部算法,仅把其私有 ConditionalWeakTable 存储及固定 11 / 4 处调用改为 XFESystem.Collections.OwnedWeakTable。原生运行时没有终结器,原 CWT 的移除、扩容和销毁不能及时释放依赖句柄。
每个 Engine 直接实现 IWeakCollectionOwner,独占一个 WeakCollectionScope。注册表只持有表的弱 GCHandle 和不含强键的依赖句柄存储,不强持有表或引擎;周期 Pump 清理死亡键和死亡表,页面退出明确释放全部弱句柄与依赖句柄,不依赖终结器。存活键的值反向引用表时,表的保持行为与实际 .NET 10 CWT 对照一致;无根的键/值循环仍可回收。释放之后存取明确拒绝,不能重新创建未注册句柄。
收据包含 WeakCollectionsPatchVersion: 1 并绑定最终 DLL;幂等调用重新验证 helper 程序集版本、Engine 所有权接口、私有字段和调用点完整性。全局 NuGet 包和原始网站、Monaco JavaScript 均不改。
JintOwnedEngineWeakCollectionsV1 将实际 Monaco 使用的 Engine._emptyShapes 与 JavaScript 私有类成员 _privateElementStore 也纳入同一个显式作用域。两个缓存仍按原位置惰性创建;原 GetValue 回调委托保留,空回调先验证,工厂重入添加的既存值优先,空值与工厂异常语义均有原 CWT 对照。私有成员字典通过精确的无参数构造工厂创建,不使用反射或 Activator。唯一主 Engine 构造器在基类构造之后增加 catch/rethrow;失败时只释放已经存在的作用域,原异常实例继续传出。其余四个构造器仍转发到该主构造器。
新增收据 EngineWeakCollectionsPatchVersion: 1,严格检查字段、固定 2 / 5 个调用、字典工厂及构造器异常区域;旧的已验证 Map/Set 补丁可以升级,部分补丁或收据不匹配则拒绝。原生公开自检还运行 128 个含私有字段、方法和访问器的对象、Object.create 原型身份、构造器形状缓存和配置回调抛错,要求释放前后的实际原生依赖槽数完全相等。该范围不包含没有在本轮路径证实的 Interop 缓存、WeakRef 或 FinalizationRegistry。