Commit Graph

794 Commits

Author SHA1 Message Date
pjh123 d309379551 fix: 未声明标识符读取抛 ReferenceError(typeof 特判返回 undefined) 2026-08-16 00:10:08 +08:00
pjh123 e448c642a5 fix: 迭代器原型形状补全(Iterator.prototype/string 中继层/next 原型化) 2026-08-15 23:36:01 +08:00
pjh123 3358cf712e fix: 非常量键成员 **= 复合赋值 rhs 生效 2026-08-15 23:20:36 +08:00
pjh123 2a447b17fe fix: 块内函数声明预声明支持(Annex B 块级绑定) 2026-08-15 23:13:26 +08:00
pjh123 ec32e42ce5 feat: 迭代器原型基建:%IteratorPrototype% 链 + 各集合迭代器原型
新增 %IteratorPrototype%(含 @@iterator 返回自身,经原型链被全部迭代器
继承,it[Symbol.iterator]() === it 恒等)与 %ArrayIteratorPrototype%/
%MapIteratorPrototype%/%SetIteratorPrototype%/%StringIteratorPrototype%/
%RegExpStringIteratorPrototype%(链到 %IteratorPrototype%);Array/Map/Set/
TA/String/matchAll 迭代器包装统一挂对应原型;补 Array/String 的 @@iterator
别名绑定。集合迭代器原型不含 return 方法(规范集合迭代器无 return)。
2026-08-15 22:57:03 +08:00
pjh123 c230edeb57 feat: Function.prototype[Symbol.hasInstance] 绑定与 bound 函数构造语义
@@hasInstance 按 OrdinaryHasInstance 实现(非可调用 this 返回 false、
prototype 非对象抛 TypeError、bound 链递归到最内层 target);
new boundFn() 解包 [[BoundTargetFunction]] 链后转发构造:绑定实参前置、
新对象原型取 target.prototype、new.target 替换为最内层 target。
2026-08-15 22:40:45 +08:00
pjh123 d83d598221 fix: parseInt/parseFloat 对象参数按 ToString 完整转换并传播异常
对象参数走 ToPrimitive(string hint) 后取串解析(toString 结果可见),
Symbol 抛 TypeError,对象方法抛出的原始异常原样传播。
2026-08-15 22:32:14 +08:00
pjh123 9390ed6be4 fix: for-const 循环 update 段豁免 const 写检查(per-iteration 绑定合法) 2026-08-15 22:29:09 +08:00
pjh123 3e34607380 fix: Promise.prototype.then 按构造器建派生能力支持子类 2026-08-15 22:16:05 +08:00
pjh123 07ea7e6d4f fix: TDZ 写与 const 赋值检查补全(含闭包捕获路径) 2026-08-15 21:55:43 +08:00
pjh123 2669967967 fix: parseInt/parseFloat 前缀解析与 radix 语义符合规范 2026-08-15 21:40:27 +08:00
pjh123 07d6c83c6b fix: 错误对象属性枚举性、toString 标签与构造器调用语义
- message/name 属性改非枚举(CreateNonEnumerableDataPropertyOrThrow),
  Object.keys/for-in/JSON.stringify 不再泄漏错误信息
- 新增 Error 家族对象标签,Object.prototype.toString 输出 [object Error],
  含子类型与用户子类(沿原型链判定)
- Error 家族构造器补 length=1,函数调用忽略 this 一律新建对象
- JSON.stringify 序列化仅含可枚举自身属性(规范 EnumerableOwnPropertyNames)
2026-08-15 21:30:28 +08:00
pjh123 c4961fae29 feat: 二元幂运算 opcode 支持 number 与 BigInt
- 新增 EXP opcode(0x94)与 emit 层 Exponential 分支,二元 a ** b 不再 compile error
- dispatch_exp 与 dispatch_compound_exp 共享 exp_result:IEEE-754 powf 快路径 +
  BigInt 幂(负/超 u32 指数 RangeError)+ 混合 BigInt/Number TypeError
- 复合 **= 补 BigInt 语义(此前走 f64 近似),与二元 ** 行为一致
2026-08-15 21:17:49 +08:00
pjh123 b706b8c506 feat: Object keys 系列合并数组元素区,assign 按规范过滤枚举/触发 getter
walk_own_keys 返回值语义改为绝对存储索引:数组对象先枚举元素区
(跳过 hole),命名属性偏移到元素区之后;shape 槽位计数含 symbol 键
与物理存储对齐(修 symbol 键错位读值)。delete_own_property /
REST / SPREAD 四连锁点同步去偏移,REST/SPREAD 删除独立元素区循环
(由 walk_own_keys 统一覆盖,防重复键)。

Object.assign 增补:源只取可枚举自身属性;取值改 ordinary_get
(accessor 触发 getter,receiver=源);提交写 receiver 修正为 target
(目标同名 setter 的 this 指向 target)。
2026-08-15 21:04:24 +08:00
pjh123 970c2e988e feat: freeze/seal/preventExtensions 写路径拦截(逐属性 meta + extensible 检查)
freeze/seal 逐属性改写 meta(数据属性 writable/configurable=false,
访问器 configurable=false,含数组元素区),使 has_prop_meta() 恒 true,
IC 直写路径自动失效;ordinary_set/create_named_prop_fast/
set_or_create_prop_value/define_* 增补 extensible/frozen 检查,
SET_ELEM 直写入口回落 ordinary_set 或拒绝新元素。

引擎未实现 strict 标志,赋值失败统一 raise_type_error(sloppy 静默留待后续)。
2026-08-15 20:55:20 +08:00
pjh123 f4e790978d fix: matchAll 空匹配推进至少一个字符,RegExp 补 GC 搬移深拷贝
matchAll 迭代器在空匹配(range.start == range.end)后把游标停在原位置,
同一位置反复空匹配导致死循环;改为按 UTF-8 字符边界推进(与 regress
find_iter 的 next_right_pos 一致),串尾空匹配把游标推到串长之后保证下轮
耗尽。

另修 RegExp 在 GC sweep 与 epoch 晋升中的指针别名:克隆只复制 native_fn 槽
的 Box 指针,源对象释放后克隆持悬垂指针,teardown 双重释放(heap 损坏)。
新增 clone_regexp_native 深拷贝已编译正则,sweep/promote 两处挂接,与
drop 配对保证单次释放。
2026-08-15 20:31:51 +08:00
pjh123 1c70d0343d fix: Function.prototype.apply 解除实参上限,native 大实参集走 spill 溢出区
apply 曾把实参数组静默截断到 55 个(寄存器窗口限制),导致
String.fromCodePoint.apply(null, codePoints) 这类大参数集调用只取前 55 个。
改为直接物化全部实参经 TailCall 下发:字节码目标走帧参数区(spill 栈)任意
个数;native 目标新增 spill 溢出区通道,寄存器窗口(253)之外的实参转存
spill 栈(GC 根、嵌套安全),builtin 经 VmHost::native_arg_count/native_arg_at
读取,String.fromCodePoint 迁移为新接口。大实参集不再静默截断。
2026-08-15 20:31:32 +08:00
pjh123 1b9974fe7f fix: BigInt64Array/BigUint64Array 与 DataView BigInt 存取走真 BigInt 语义
TA 元素读写按 kind 分流:BigInt 类型走 ToBigInt(Number 入参抛 TypeError、
写入 mod 2^64 截断、读出为真 BigInt 值),数值类型走 ToNumber 且显式拒绝
BigInt 值;消除 64 位整数经 f64 中转的静默精度丢失。

- runtime_api 新增公共 to_bigint_full / string_to_bigint_full,bigint 构造器
  与 asIntN/asUintN 改调公共版消除双实现
- sort/toSorted 默认序对 BigInt 类型按 i64/u64 值比较;reverse/copyWithin/
  filter/toReversed/with 消除无谓数值中转
- 构造器第一参数非对象统一走 ToIndex(bool/null/BigInt/字符串),Symbol 抛
  TypeError
- DataView get/setBigInt64/getBigUint64 返回 BigInt 值、入参按 ToBigInt 校验
- 测试:精度往返 / TypeError / mod 2^64 / 字节序 / 排序 / 回调值类型断言
2026-08-15 20:04:48 +08:00
pjh123 f63b41454f fix: 字符串索引体系改 UTF-16 code unit 语义(astral 字符正确) 2026-08-15 19:34:55 +08:00
pjh123 ffe1d6fc02 fix: json 测试保留 Vm 生命周期再读字符串结果
eval 返回 (Vm, JsValue) 但绑定符丢弃 Vm 使字符串随 Vm drop 释放,
stringify_val 随后读已释放内存。命名绑定保留 Vm 到断言结束。
2026-08-15 19:18:19 +08:00
pjh123 12d1a85e44 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 d97d39e8ad 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 e718394072 fix: full_reset 存在 session 对象时强制重建 global 堵池路径 UAF
覆盖既有 global 槽的写入不递增 generation,脏检测漏判导致保留的
global 持有已释放的 session 对象指针。session 对象非空即强制 bump
global generation,借既有快照机制触发重建。
2026-08-15 18:56:25 +08:00
pjh123 13e9ee3543 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 3eec7fb7ff fix: f64 转字符串 ryu 路径负数改追加防破坏非空缓冲前缀 2026-08-15 17:35:27 +08:00
pjh123 3d1ece321b perf: typeof 改 js_type 单次提取并复用进程级静态字符串消除每次分配 2026-08-15 16:09:19 +08:00
pjh123 31296ed16d perf: 相等/严格相等/ToNumber 改 js_type 单次提取收敛并修复混合 tag 严格相等 ±0 语义 2026-08-15 15:50:35 +08:00
pjh123 3c9e33f227 perf: 模板字面量字符串段借用直写并消除末尾克隆 2026-08-15 15:10:23 +08:00
pjh123 f9c639426d perf: f64 转字符串去中间分配并加整数 double 快路径 2026-08-15 15:06:43 +08:00
pjh123 1f8cf449ad fix: generator resume 错误路径归还 native_call_depth 防执行期 GC 永久跳过 2026-08-15 14:53:07 +08:00
pjh123 f2535ffc77 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 f25a3a1b95 fix: release 构建下 debug 断言调用点补 cfg 守卫
collect_strings_only 中 debug 兜底断言调用点无 cfg 守卫,release
(无 debug_assertions)下方法不存在导致编译失败;与定义侧守卫对齐。
2026-08-15 14:31:43 +08:00
pjh123 ee592bf7e7 fix: 执行期字符串 GC 触发加 native 深度守卫防嵌套 dispatch 回调悬垂 2026-08-15 13:50:57 +08:00
pjh123 81f54f280d 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 f4c58d5dd9 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 6a7d94dfc2 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 d77649e8cf 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 47d4d2a921 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 239309925e 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 df99cd3b2a 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 e251f219ff 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 8bdcb43aba perf: 三处手写压帧收敛单一入口并免实参堆 Vec 物化 2026-08-15 10:27:14 +08:00
pjh123 2239eeac24 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 ff129d626f fix: member 复合写数组 length 分流 ordinary_set 防影子槽绕过 ArraySetLength 2026-08-15 09:17:03 +08:00
pjh123 9b2e33916a 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 f8dacb192a 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 31ca1dd5db 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 ed964b5e2b test: IC 多态 primitive receiver 断言(扩展字跳越无错位) 2026-08-15 06:40:57 +08:00
pjh123 b62348eb5d 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 96da78e817 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