docs: 改写迭代器域注释黑话并补无文档函数

This commit is contained in:
2026-09-17 12:37:40 +00:00
parent 10f0f74b76
commit c9eef0f417
+27 -23
View File
@@ -26,14 +26,15 @@ const INNER_NEXT_PROP: &str = "__inner_next__";
/// 1. `this` 非对象 → TypeError(普通调用 `Iterator()`:emit 以 undefined 作 this)。 /// 1. `this` 非对象 → TypeError(普通调用 `Iterator()`:emit 以 undefined 作 this)。
/// 2. `this.proto === %IteratorPrototype%` → TypeError(`new Iterator()`:调用方以 /// 2. `this.proto === %IteratorPrototype%` → TypeError(`new Iterator()`:调用方以
/// ctor.prototype 为原型建新对象传入)。 /// ctor.prototype 为原型建新对象传入)。
/// 3. newTarget 槽(regs[255])非对象 → TypeError(`Iterator.call(x)` 顶层调用, /// 3. newTarget 槽非对象 → TypeError(`Iterator.call(x)` 顶层调用,顶层 newTarget
/// 顶层 newTarget 初始化为 undefined)。 /// 初始化为 undefined)。newTarget 由 255 号寄存器承载:254/255 是 VM 为
/// `this` / new.target 保留的两个槽,调用方负责保存与恢复。
/// 4. 否则返回 undefined(subclass `super()`:调用方随后按 new.target.prototype /// 4. 否则返回 undefined(subclass `super()`:调用方随后按 new.target.prototype
/// 设置实例原型)。 /// 设置实例原型)。
/// ///
/// # 注意事项 /// # 注意事项
/// 类构造器内调用 `Iterator.call(x)` 时 regs[255] 为类对象会被放行(规范外罕见 /// 类构造器内调用 `Iterator.call(x)` 时 newTarget 槽为类对象会被放行(规范外
/// 场景,与 `Symbol` 构造器同款已知边界)。 /// 罕见场景,与 `Symbol` 构造器同款已知边界)。
pub fn iterator_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult { pub fn iterator_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
let this_val = vm.reg(if args.is_empty() { 0 } else { args[0] }); let this_val = vm.reg(if args.is_empty() { 0 } else { args[0] });
if !this_val.is_object() { if !this_val.is_object() {
@@ -62,9 +63,9 @@ pub fn iterator_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult
/// `%IteratorPrototype%` 上 `constructor` 访问器的 getter:返回当前 global 上的 /// `%IteratorPrototype%` 上 `constructor` 访问器的 getter:返回当前 global 上的
/// `Iterator` 构造器。 /// `Iterator` 构造器。
/// ///
/// 动态查 global(shape 槽查找)而非缓存指针:dirty reset 重建 global 时会换新的 /// 动态查 global(shape 槽查找)而非缓存指针:global 整体重建(dirty reset)会
/// `Iterator` 函数对象,缓存旧指针会指向已释放对象。lookup 失败(极端:global 无 /// 重建内置对象族,换新的 `Iterator` 函数对象;缓存旧指针会指向已释放对象。
/// `Iterator`)返回 undefined,不 panic。 /// lookup 失败(极端:global 无 `Iterator`)返回 undefined,不 panic。
pub fn iterator_constructor_getter<H: VmHost>(vm: &mut H, _args: &[u8]) -> NativeResult { pub fn iterator_constructor_getter<H: VmHost>(vm: &mut H, _args: &[u8]) -> NativeResult {
let global = vm.session().global_object(); let global = vm.session().global_object();
let si = vm.kernel_core().perm_interner().intern("Iterator").0; let si = vm.kernel_core().perm_interner().intern("Iterator").0;
@@ -80,13 +81,14 @@ pub fn iterator_to_string_tag_getter<H: VmHost>(vm: &mut H, _args: &[u8]) -> Nat
NativeResult::Ok(JsValue::perm_string(sf.string_ptr(sf.intern("Iterator").0))) NativeResult::Ok(JsValue::perm_string(sf.string_ptr(sf.intern("Iterator").0)))
} }
/// SetterThatIgnoresPrototypeProperties 的共享实现:`%IteratorPrototype%` 的 /// 忽略原型属性的 setter 的共享实现(对应规范 SetterThatIgnoresPrototypeProperties):
/// `constructor` 与 `Symbol.toStringTag` 访问器共用同一语义,仅属性键不同。 /// `%IteratorPrototype%` 的 `constructor` 与 `Symbol.toStringTag` 访问器共用同一
/// 语义,仅属性键不同。
/// ///
/// # 步骤 /// # 步骤
/// 1. `this` 非对象 → TypeError(原始值直接抛,不建 own 属性)。 /// 1. `this` 非对象 → TypeError(原始值直接抛,不建 own 属性)。
/// 2. `this` 为 `%IteratorPrototype%`(home 对象)→ TypeError(模拟对 home 不可写 /// 2. `this` 为 `%IteratorPrototype%` 本体 → TypeError(模拟对原型上不可写数据
/// 数据属性的严格模式赋值)。 /// 属性的严格模式赋值)。
/// 3. `this` 无 own 指定键属性 → CreateDataPropertyOrThrow(写全可写可枚举)。 /// 3. `this` 无 own 指定键属性 → CreateDataPropertyOrThrow(写全可写可枚举)。
/// 4. 有 own 属性 → 普通 Set(继承访问器时在此被调用的场景)。 /// 4. 有 own 属性 → 普通 Set(继承访问器时在此被调用的场景)。
fn iterator_setter_ignore_proto_props<H: VmHost>(vm: &mut H, args: &[u8], key: u32) -> NativeResult { fn iterator_setter_ignore_proto_props<H: VmHost>(vm: &mut H, args: &[u8], key: u32) -> NativeResult {
@@ -127,7 +129,7 @@ pub fn iterator_constructor_setter<H: VmHost>(vm: &mut H, args: &[u8]) -> Native
iterator_setter_ignore_proto_props(vm, args, key) iterator_setter_ignore_proto_props(vm, args, key)
} }
/// `Symbol.toStringTag` 访问器的 setter(键 = well-known symbol 9)。 /// `Symbol.toStringTag` 访问器的 setter(键为 `@@toStringTag`)。
pub fn iterator_to_string_tag_setter<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult { pub fn iterator_to_string_tag_setter<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
iterator_setter_ignore_proto_props(vm, args, make_well_known_symbol_key(9)) iterator_setter_ignore_proto_props(vm, args, make_well_known_symbol_key(9))
} }
@@ -164,8 +166,8 @@ pub fn iterator_dispose<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
// ── 终端方法共享工具(forEach/every/some/find/reduce/toArray 共用)── // ── 终端方法共享工具(forEach/every/some/find/reduce/toArray 共用)──
/// 终端方法的统一前置校验:`this` 非对象 → TypeError;回调不可调用 → 关底层后抛 /// 终端方法的统一前置校验:`this` 非对象 → TypeError;回调不可调用 → 先关闭底层
/// TypeError(2024 规范更新:参数校验失败也执行 IteratorClose,且此时不读 next)。 /// 迭代器(此路径不读取 next)后抛 TypeError。
/// ///
/// # 步骤 /// # 步骤
/// 1. `this` 非对象 → TypeError(原始值直接抛,不读 next)。 /// 1. `this` 非对象 → TypeError(原始值直接抛,不读 next)。
@@ -190,7 +192,7 @@ pub(crate) fn validate_terminal_and_get_direct<H: VmHost>(
get_iterator_direct(vm, this_val) get_iterator_direct(vm, this_val)
} }
/// GetIteratorDirect:读 `next` 一次并缓存,返回 `(iterated, next)` 对。 /// 读 `next` 一次并缓存,返回 `(iterated, next)` 对(对应规范 GetIteratorDirect)。
/// ///
/// # 边界与前提 /// # 边界与前提
/// - `this_val` 必须是对象(调用方已校验)。 /// - `this_val` 必须是对象(调用方已校验)。
@@ -202,7 +204,7 @@ pub(crate) fn get_iterator_direct<H: VmHost>(vm: &mut H, this_val: JsValue) -> R
Ok((this_val, next)) Ok((this_val, next))
} }
/// IteratorStepValue:调缓存 next 取一步,读结果对象 `done`/`value`。 /// 调用缓存的 next 取一步,读结果对象的 `done`/`value`(对应规范 IteratorStepValue)。
/// ///
/// # 返回值 /// # 返回值
/// - `Ok(Some(value))`:有元素产出; /// - `Ok(Some(value))`:有元素产出;
@@ -346,16 +348,16 @@ fn read_counter<H: VmHost>(vm: &mut H, obj: &JsObject, si: u32) -> i64 {
} }
} }
/// ToIntegerOrInfinity 近似:ToNumber 后向零截断,保留 ±∞;NaN 判定由调用方 /// ToIntegerOrInfinity 近似:输入值经 ToNumber 后向零截断,保留 ±∞;NaN 判定由
/// 在截断前语义等价地做(`trunc(NaN)` 仍为 NaN)。ToNumber 抛错透传原异常值。 /// 调用方在截断前语义等价地做(`trunc(NaN)` 仍为 NaN)。ToNumber 抛错透传原异常值。
fn to_integer_or_infinity<H: VmHost>(vm: &mut H, value: JsValue) -> Result<f64, JsValue> { fn to_integer_or_infinity<H: VmHost>(vm: &mut H, value: JsValue) -> Result<f64, JsValue> {
let num = vm.coerce_number_bounded(value).map_err(|e| engine_error(vm, &e))?; let num = vm.coerce_number_bounded(value).map_err(|e| engine_error(vm, &e))?;
Ok(num.trunc()) Ok(num.trunc())
} }
/// take/drop 的共享前置:`this` 非对象 → TypeError;limit 经 ToIntegerOrInfinity /// take/drop 的共享前置:`this` 非对象 → TypeError;limit 经 ToIntegerOrInfinity
/// 校验(NaN/负值 → RangeError,ToNumber 抛错透传),校验失败均先关底层 /// 校验(NaN/负值 → RangeError,ToNumber 抛错透传),校验失败均先关闭底层迭代器
/// (2024 规范更新:参数校验失败也执行 IteratorClose,且不读 next)。 /// (此路径不读取 next)再抛错。
/// ///
/// # 返回 /// # 返回
/// - `Ok((iterated, next, int_limit))`:GetIteratorDirect 结果 + 截断后的 limit /// - `Ok((iterated, next, int_limit))`:GetIteratorDirect 结果 + 截断后的 limit
@@ -381,8 +383,8 @@ fn validate_limit_and_get_direct<H: VmHost>(
get_iterator_direct(vm, this_val).map(|(iterated, next)| (iterated, next, int_limit)) get_iterator_direct(vm, this_val).map(|(iterated, next)| (iterated, next, int_limit))
} }
/// GetIteratorFlattenable(reject-primitives):把 flatMap 的 mapper 返回值解析为 /// 把 flatMap 的 mapper 返回值解析为内层迭代器记录(对象 + 缓存 next);原始值
/// 内层迭代器记录(对象 + 缓存 next)。 /// 一律拒绝(对应规范 GetIteratorFlattenable)。
/// ///
/// 不能复用 [`get_iterator`]:后者对 Array 等内建集合直接返回原值、不走 /// 不能复用 [`get_iterator`]:后者对 Array 等内建集合直接返回原值、不走
/// `@@iterator`,而 flattenable 要求数组经 `@@iterator` 产出内层迭代器。 /// `@@iterator`,而 flattenable 要求数组经 `@@iterator` 产出内层迭代器。
@@ -701,7 +703,7 @@ pub fn iterator_to_array<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
} }
} }
/// CreateArrayFromList:按元素列表构造普通数组(Array.prototype 为原型)。 /// 按元素列表构造普通数组,以 Array.prototype 为原型(对应规范 CreateArrayFromList)。
fn make_array_from_list<H: VmHost>(vm: &mut H, items: &[JsValue]) -> JsValue { fn make_array_from_list<H: VmHost>(vm: &mut H, items: &[JsValue]) -> JsValue {
let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject; let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
let arr = vm.alloc_object(JsObject::new_array( let arr = vm.alloc_object(JsObject::new_array(
@@ -1774,6 +1776,8 @@ pub fn make_iter_result<H: VmHost>(vm: &mut H, value: JsValue, done: bool) -> Js
JsValue::from_js_object(obj) JsValue::from_js_object(obj)
} }
/// 构造 native 函数对象并返回:设置函数标记、native 函数项、参数个数与 `name`
/// 属性。供迭代器包装器把自己的 next/return 方法装到包装对象上,不经绑定层注册。
pub(crate) fn make_native_function<H: VmHost>(vm: &mut H, name: &str, native_fn: *const (), arg_count: u8) -> JsValue { pub(crate) fn make_native_function<H: VmHost>(vm: &mut H, name: &str, native_fn: *const (), arg_count: u8) -> JsValue {
let function_proto = vm.session().builtin_world().function_proto.as_ptr() as *mut JsObject; let function_proto = vm.session().builtin_world().function_proto.as_ptr() as *mut JsObject;
let mut func = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(function_proto)); let mut func = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(function_proto));