Commit Graph

718 Commits

Author SHA1 Message Date
pjh123 18aaa0fb0f fix: Vm 增加 Drop 收尾释放全部 session 堆数据消除逐实例泄漏
test262 每测试新建 Vm 直接 drop,此前对象堆数据/串/BigInt/cell 全部
泄漏。新增 teardown 收尾函数(epoch+session 对象堆数据、串、BigInt、
cell 统一释放)供 full_reset 与 Drop 共用。连带补齐 promote 分支的
ArrayBuffer 字节缓冲深拷贝(与 sweep 对齐,消除共享所有权 double-free),
并修正依赖旧泄漏行为跨 Vm 解析字符串的 error 测试。
2026-08-15 19:13:51 +08:00
pjh123 9e8ee96491 fix: 生成器状态盒深拷贝消除 sweep/promote 共享所有权 UAF,full_reset 补释放 session 堆数据
GeneratorState 状态盒此前由 epoch 原对象独占释放,promote 与 sweep 克隆
浅拷贝 native_data 共享同一盒,旧对象 drop 即悬垂。新增 clone 深拷贝
(参照 async_generator),promote/sweep 两处接入,恢复执行读新盒;
full_reset 在 session arena 重置前遍历 session 对象释放堆数据,
配合深拷贝形成单所有权。补 sweep/promote/full_reset 三回归与
生成器捕获闭包跨 GC 回归。
2026-08-15 19:02:39 +08:00
pjh123 4373b88303 fix: full_reset 存在 session 对象时强制重建 global 堵池路径 UAF
覆盖既有 global 槽的写入不递增 generation,脏检测漏判导致保留的
global 持有已释放的 session 对象指针。session 对象非空即强制 bump
global generation,借既有快照机制触发重建。
2026-08-15 18:56:25 +08:00
pjh123 f81b7bca46 fix: upvalue cell 改独立堆分配消除 GC sweep 后悬垂
upvalue cell 原先分配于 session_epoch bump arena,对象 sweep 替换 arena
后旧 Bump drop,全部闭包 cell 悬垂:后续分配复用其内存导致 upvalue 值
被覆盖(私有字段 brand 检查跨语句误报、release 下可致 SIGSEGV)。

cell 改为 Box::into_raw 独立堆分配并登记进 session_cell_ptrs 追踪表,
与 arena 生命周期解耦:sweep 搬移对象时 cell 指针稳定,只重写
cell.value 中的对象引用;full_reset 统一释放,无 double-free。
2026-08-15 18:50:07 +08:00
pjh123 5fbc0ccda5 fix: f64 转字符串 ryu 路径负数改追加防破坏非空缓冲前缀 2026-08-15 17:35:27 +08:00
pjh123 9a7fe9777d perf: typeof 改 js_type 单次提取并复用进程级静态字符串消除每次分配 2026-08-15 16:09:19 +08:00
pjh123 735db1b141 perf: 相等/严格相等/ToNumber 改 js_type 单次提取收敛并修复混合 tag 严格相等 ±0 语义 2026-08-15 15:50:35 +08:00
pjh123 744735015f perf: 模板字面量字符串段借用直写并消除末尾克隆 2026-08-15 15:10:23 +08:00
pjh123 9ba1eb4c1c perf: f64 转字符串去中间分配并加整数 double 快路径 2026-08-15 15:06:43 +08:00
pjh123 dd930bc39d fix: generator resume 错误路径归还 native_call_depth 防执行期 GC 永久跳过 2026-08-15 14:53:07 +08:00
pjh123 350b65c091 perf: 字符串 +/+= 二元拼接改 Cons rope 惰性扁平化消除 O(n²)
JsString 拆 Flat/Cons 变体:Cons 经独立 ConsNode 保存左右子节点 + O(1)
字节长 + 惰性扁平化产物缓存(OnceLock 原子发布,产物挂节点生命周期)。
concat_strings 接线:总长 ≤ 128B 的小链急切扁平(与 rope 前同款,拼接即
消费场景零开销),大链 O(1) 链接——大段重复拼接从 O(n²) 拷贝降为 O(n)
链接,文本在消费点(.length/==/string_ref/方法族)首次扁平化后缓存。

GC 兼容:mark 收口 mark_string_live 传播 Cons 子节点与产物闭包(显式栈
防深链爆栈);sweep/full_reset 共用 drop 辅助连带释放产物;节点字节记账
用 O(1) byte_len。rope 节点登记 session 字符串表,与执行期字符串 GC
(指令边界触发)天然兼容。JsString 结构 32B 与 rope 前同 bin,小串路径
零结构回退;unsafe impl Send/Sync 论证同 StringPtr(perm 恒 Flat)。
2026-08-15 14:32:08 +08:00
pjh123 517aef7fba fix: release 构建下 debug 断言调用点补 cfg 守卫
collect_strings_only 中 debug 兜底断言调用点无 cfg 守卫,release
(无 debug_assertions)下方法不存在导致编译失败;与定义侧守卫对齐。
2026-08-15 14:31:43 +08:00
pjh123 a39236a775 fix: 执行期字符串 GC 触发加 native 深度守卫防嵌套 dispatch 回调悬垂 2026-08-15 13:50:57 +08:00
pjh123 a0788b363b fix: 执行期字符串 GC 触发点移到指令边界,消除 builtin 局部活串悬垂
分配点触发会把仅存于 builtin 函数栈上局部 JsValue 与构造中未登记对象的
存活串判死释放(temporal 槽、regexp exec 构造中数组、replace 回调参数
Vec),长会话超阈值即悬垂。触发改在 dispatch 指令边界,此时所有局部值已
落地为执行根;分配点只留账目。水位采用上次收集存活字节加阈值增量,活串
超阈值时不会每指令重复白跑;reset 完整收集仍按阈值直接比较。debug 构建下
收集后断言存活对象字符串边已登记。补低阈值回归:regexp exec 旧行为直接
SIGABRT,temporal 与 replace 结果断言守护。
2026-08-15 13:20:04 +08:00
pjh123 e5d6d1e4d7 fix: strings-only 收集结尾清对象 mark 位,恢复完整收集 mark 不变量
collect_strings_only 只清位开头、mark 后不还原,残留 marked 对象会让
后续 reset 完整收集的 mark DFS 短路漏标其字符串边,存活串被误释放、
存活对象持悬垂指针。结尾与 sweep 同点 clear_all_marks 收尾,并补
strings-only 后接完整收集的回归(单测 + 集成,覆盖 global 子树串跨
reset 存活)。
2026-08-15 13:14:09 +08:00
pjh123 ce60df0212 test: 压帧窗口测试判别力修正:删真空 overlap 锚点补 NEW+arguments 覆盖
原两个嵌套 callee overlap 集成测试在 identity 精确别名几何下(实参区==
形参区,first==param_base 写即自赋值)不触发重叠,缺陷代码上亦绿(真空)。
真实重叠几何无法经编译器自然构造(实参连续区与 identity 形参段系统性
不相交,已穷举验证),重叠判别由 vm 单元测试直接构造承担。删除两例,
改为补 NEW 路径 + 多实参 + arguments 对象集成覆盖(构造路径读 arguments
此前为盲区)。try 分支 catch 存活测试已实证在含 try 函数未跳过窗口编码
时真实 Red,保留。
2026-08-15 12:13:47 +08:00
pjh123 7ce384e9a4 test: NEW 收敛路径压帧参数重叠几何判别回归
统一入口 spill 前置 + 形参源改读 spill 区已闭合 CALL/NEW/SUPER 三路径,
NEW 入口(vm_dispatch_misc 收敛后)与普通调用同享该修复。补经
NEW_EXPRESSION 入口构造的重叠几何单元测试(实参源 regs[1..3) 与 callee
形参写入区 regs[2..4) 重叠,first < param_base):形参与 spill 实参区
(arguments 对象源)须取原始实参值,并校验 NEW 帧契约(construct_result_reg/
constructed_this/derived 标志)。该测试在重叠修复回退后真实 Red。
2026-08-15 12:13:41 +08:00
pjh123 41f030dfc8 fix: NEW_SPREAD/SUPER_SPREAD 构造深递归统一走压帧入口可捕获深度检查
收敛后普通 NEW/SUPER 深递归经 push_bytecode_frame 深度检查抛可捕获
RangeError,而 NEW_SPREAD/SUPER_SPREAD 仍保留显式引擎 Err(不可捕获),
构造路径行为分叉。删除两处显式检查,交由统一入口处理:spread 变体与
普通路径一致抛可捕获 RangeError。补浅深度配置下 NEW/NEW_SPREAD 深递归
try/catch 可捕获断言(普通 NEW 作对照锚点)。
2026-08-15 12:13:36 +08:00
pjh123 354ab2f192 perf: 执行期 session 字符串 GC 阈值回收(超 32MiB 触发,跳过对象 sweep)
new_string_owned 分配前做廉价阈值检查(1 次 usize 比较 + 阈值读取),
超 session_gc_threshold 即调 collect_strings_only:clear_all_marks →
完整 mark(现成)→ sweep_session_strings(现成),跳过对象 sweep 搬移,
builtin 层对象裸指针跨分配点零悬垂面。触发检查在登记之前——返回值
尚未根化,登记后回收会被本次 GC 判死致悬垂。分配前触发亦使 GC 期间
新串仍在栈上未登记,天然安全。

长循环字符串累积场景(REPL 常驻 / test262 长测试 / kernel_batch 复用)
session 内存从无界变为有界(≤ 阈值 + 存活串);bench gc_trigger_count
恢复有效(string_build 由 0 → 2 次触发)。07.2 rope 死节点回收依赖本机制。
2026-08-15 12:12:03 +08:00
pjh123 24ed868d7a fix: 压帧先拷 spill 实参区再写形参防参数区重叠串值
push_bytecode_frame 原先边写形参边读调用方寄存器:nested callee identity 高位
param_base 与调用方实参源区间重叠(first < param_base)时,先写 regs[param_base+i]
会破坏尚未读取的实参槽,形参与 spill 实参区(arguments 对象)取值串错。改为先
把完整实参拷入 spill 栈实参区、形参再从 spill 区取源(独立栈,天然消除与 regs
的重叠),实参不足仍补 undefined。补 first < param_base 重叠场景的单元测试
(形参 b 与 spill 实参区取值验证)。
2026-08-15 11:42:04 +08:00
pjh123 6a5ed5c78e fix: 含 try 指令的函数跳过调用窗口编码防异常 handler 丢存活寄存器
异常边只从 TRY 标记所在 BB 发出,分支/循环 BB 内调用点的 liveness 不含仅
catch/finally 存活的寄存器;按存活上界截断窗口会使 unwind 恢复后 handler 读到
callee 残留垃圾值(可为悬垂对象指针)。含 TRY_BEGIN/TRY_FINALLY_BEGIN 的函数
整体跳过窗口编码(回退全量窗口),恢复基线保守行为,普通函数不受影响。
补分支内调用 + catch 读 try 前变量的 Red/Green 测试与 finally 回归锚点。
2026-08-15 11:41:58 +08:00
pjh123 37252e55b5 perf: 三处手写压帧收敛单一入口并免实参堆 Vec 物化 2026-08-15 10:27:14 +08:00
pjh123 d9acda7417 perf: 字节码调用压帧窗口按调用点存活上界拷贝减少整窗搬移
RegAlloc 改写后补第三次 liveness,为每条 CALL/NEW/SUPER_CALL 计算调用点
存活上界(最大存活物理槽号 + 1,254/255 由帧单独保存不计入),编码进
ext 高 8 位(nargs 低 8 位不变)。三处手写压帧窗口 = min(调用方活动寄存
器, 存活上界),restore_frame 按窗口回拷;CallFrame 新增
caller_active_reg_limit 保存调用方真实活动上限,恢复时不随截断窗口缩水。
生成器/异步函数体调用点保持全量窗口。spread 调用与运行时发起压帧
(accessor/内联)走全量路径不受影响。
2026-08-15 09:56:22 +08:00
pjh123 5e14817eaa fix: member 复合写数组 length 分流 ordinary_set 防影子槽绕过 ArraySetLength 2026-08-15 09:17:03 +08:00
pjh123 38a4f20743 perf: CONCAT_N 多操作数拼接单趟精确预分配替代逐次 ADD
新增 CONCAT_N opcode(0x93):连续加号左结合链摊平为单条指令,
字符串模式单趟精确总长预分配,消除 N-2 次中间串分配与逐次整串重拷贝。

- emit 只下钻 left 链、right 括号不拆(a+(b+c) 退化 ADD),求值序与
  f64 结合性保持左结合原义;摊平上限 14 防超长链寄存器压力
- dispatch 两阶段:数值前缀逐项复用 ADD 判定序列(int 溢出升 double、
  BigInt 混合 TypeError、对象 ToPrimitive 副作用序),遇字符串转入
  字符串模式单趟预分配拼接(concat_n_strings)
- RegAlloc graph/rewrite 登记 CONCAT_N ext 操作数(漏收集即错值);
  ic_helper ext_word_count 登记(clear_ic_caches 字节定位)
- contract golden 显式 CONCAT_N 分支(规避 canonical_inst _ 兜底)
2026-08-15 09:08:05 +08:00
pjh123 aa4c28cdf0 perf: member 复合写路径接入 IC 写命中(depth 0)消除每次 DashMap 查询与回写
set_member_prop 增加 ic_set_hit_own(仅接受 depth==0 槽,跳过读侧学习的
原型条目防原型污染)命中直写槽,ext_pc 由 read_member_prop 显式带出消除
隐式 pc 契约;写新属性 miss 分支(IC_SET 分发 + member 写)统一改
CreateDataProperty 快路径(保留原型链 setter/readonly 检查),砍掉
ordinary_set 全链路的重复查询与 shape 转换开销。
2026-08-15 08:16:49 +08:00
pjh123 abeab6f216 fix: finally 体直落进入时置位 finally_active 防完成穿越计数错乱
catch 体正常结束后指令直落入 finally 体,此前 finally_active 未被置位,
finally 内 break/continue/return/throw 触发未进入分支导致 finally 体重复
执行、完成计数错乱。新增无操作数标记指令 TRY_FINALLY_ENTER,在 finally
体入口统一置位栈顶 handler 的 finally_active,覆盖 JMP/直落/unwind/完成
穿越/挂起恢复全部进入路径,并删除 control_flow.rs 中对跳转目标匹配的
脆弱栈顶检测。
2026-08-15 07:47:54 +08:00
pjh123 63f827432d test: IC 多态 primitive receiver 断言(扩展字跳越无错位) 2026-08-15 06:40:57 +08:00
pjh123 54b6955f6b perf: IC 多态化 4 槽缓存(FIFO 滚动写回)消除多态场景 miss 重解析
每条 IC 指令扩展字 3→8(4 槽 × [shape_id|proto_depth, slot]),命中槽 0
单态快路径零额外成本,槽 1..3 懒解码遍历,miss 写回 FIFO 滚动(新条目进
槽 0、最老丢弃)。修复原型链 IC 深度解析多走一步与 prop_forge 模板不匹配
不写回两个使缓存恒失效的问题。ic_cache 基准命中率 34.8%→78.9%,
耗时 -29%;单态 prop_access 因扩展字布局膨胀有 ~20% 取指回归(后续
side-table 方案可根除)。
2026-08-15 06:40:19 +08:00
pjh123 461b18fa05 fix: inline 回调抛原始异常值时 catch 保留原值不再包装成 Error
dispatch_native_call 的 NativeResult::Err 分支此前把非对象异常值
(用户 throw 的数字/字符串/null/undefined/false)包装成 Error 对象,
违反 ECMAScript throw 任意值语义:catch 应收到原始值。raise_call_error
与 TailCall 分支已通过 last_uncaught_value 保留原值,此处为唯一不一致点。
统一为原样保留异常值,并补数组回调/嵌套 inline/finally 组合回归测试。
2026-08-15 05:49:59 +08:00
pjh123 ee4a12668f perf: 数组元素访问 dispatch 内联 fast path + length_si 缓存
GET_PROP_DYNAMIC/SET_PROP_DYNAMIC 开头内联数组元素 fast path:整数键 +
真数组 + 无元素 meta + 界内时直读/直写元素区,免 primitive_property_get /
ordinary_get/set 调用链与 __proto__ 每次 RwLock 查询;越界与有 meta
场景回退原路径(CreateDataProperty + length 扩展 / accessor/hole 协议)。
GET 侧 is_object() 快检先于 checked_object_ptr,保持原始值 receiver
不抛错。length_si 缓存为 Vm 字段(builtin 绑定后取 id,稳定非 0),
普通属性路径 5 处 hot spot 改读缓存,消除每次 intern 的共享锁开销。
2026-08-15 04:58:57 +08:00
pjh123 63d549aec2 fix: string.search 无参调用越界 panic,参数读取守卫前置返回 -1 2026-08-15 04:28:01 +08:00
pjh123 179eab6cc6 fix: property_key_si 对象与兜底原始值键统一走字符串键规范化
对象经 ToPrimitive 转字符串后直接 intern 绕过 canonical_index_of,产生
与整数键区间分裂的字符串键(o[{toString(){return "5"}}] 与 o[5] 不同
键);bigint 等兜底原始值键同病。统一经 string_key_si 规范化:规范数字
串映射整数键,其余 intern,与字符串分支及 03.1 各建键入口口径一致。

补回归:对象 ToPropertyKey 数字串键与 o[5]/o["5"] 键等价(读写双向)、
o[5n] 与 o[5]/o["5"] 键等价。
2026-08-15 04:20:26 +08:00
pjh123 f9f54214fa fix: inline 回调窗口保存上限提到 254 覆盖物理槽 253
RegAlloc 合法产物 n_registers=254(builtin 槽落 253 或高活度着色)的
inline 字节码回调会写 regs[253],而 save_inline_state 窗口截断
regs_end.min(253) 漏存该槽,restore 不回拷 → 调用方 active_reg_limit=254
时 regs[253] 活动值静默丢失,与 native 分支 saved_r253 单存不对称。
窗口上限 253→254 后保存 regs[0..=253] + 254/255 单存,与全量 256 语义
逐槽等价;同步修正 InlineSyncState 与 save_inline_state 文档。

补三条回归:窗口 254 往返(含槽 253)、n_registers=254 inline 回调不
覆盖调用方活动 regs[253]、native 回调内嵌 254 寄存器 inline 回调不污染
外层 receiver 槽。
2026-08-15 04:16:59 +08:00
pjh123 b479fb4a4d fix: rebuild 时泄漏保活旧 function/object 家族消除 wrapper 悬垂原型 UAF 2026-08-15 04:05:16 +08:00
pjh123 c16ed8a8c6 chore: 接入电源后重跑基准,更新 baseline 2026-08-15 03:56:07 +08:00
pjh123 dc98074d79 fix: 对象建键入口统一走 property_key_si 规范化,数字键不再分裂
Object.fromEntries/JSON.parse/new Map 对象 entry/rest 解构静态 excluded
四处直接 intern 动态字符串键绕过整数键区间映射,规范数字键分裂为
字符串键与整数键两个键。统一经 string_key_si 规范化:规范数字串映射
整数键,其余 intern 字符串键,与 property_key_si 字符串分支口径一致。
make_int_key 增加 debug 断言兜底索引越界。
2026-08-14 22:37:46 +08:00
pjh123 e07bf2fbe9 test: full_reset 后跨家族方法调用回归防线覆盖 call/apply/bind 路径 2026-08-14 22:01:03 +08:00
pjh123 aadc0a376d fix: session_gc sweep 测试改读 rewrite 后新指针消除 UAF 2026-08-14 21:54:48 +08:00
pjh123 36c1ef1208 fix: replaceAll 类正则对象统一走 ToString 文本路径与 replace 对齐 2026-08-14 21:15:00 +08:00
pjh123 6c6d4320a6 perf: replace 函数 replacer 回调免每匹配整串复制
回调第 4 参(原字符串)由每匹配复制整串改为调用方预构一次:
原始字符串 receiver 直接复用原值零拷贝,对象 receiver 提升为单次会话串。
覆盖 String.prototype.replace/replaceAll 与 RegExp.prototype[Symbol.replace]
的函数 replacer 路径。补回调第 4 参断言测试与 fn-replacer 压测。
2026-08-14 21:00:43 +08:00
pjh123 786557a166 chore: 换测试设备后重跑基准,更新 baseline 2026-08-14 20:28:52 +08:00
pjh123 91103851c8 perf: replace 字符串 pattern 走共享借用零拷贝并修 replace 语义 2026-08-14 12:54:27 +08:00
pjh123 1c5676e614 perf: ASCII 单字符缓存 + 字符串迭代器游标收尾 2026-08-14 12:11:54 +08:00
pjh123 5061ad7a44 fix: 计算成员复合赋值保规范求值序 2026-08-14 11:41:50 +08:00
pjh123 fbd568e814 fix: split 分隔符为 RegExp 子类对象时按字符串语义切分 2026-08-14 10:44:23 +08:00
pjh123 6a39bccc94 perf: 常量字符串键计算成员折叠走 IC 静态路径 2026-08-14 10:20:32 +08:00
pjh123 33db6dad9c test: 数值断言容忍 int 表示,类私有字段 for-in 用例补公有字段 2026-08-14 06:14:38 +08:00
pjh123 ace6bea2c4 fix: 访问器属性合并定义时继承未提供半边,防 get/set 互相覆盖 2026-08-14 06:14:38 +08:00
pjh123 4f80fb4fb6 fix: builtin 快照数组与枚举判别值错位致符号/时间族永久脏 2026-08-14 05:50:46 +08:00