fix: transferToImmutable 显式 undefined 长度参数回落源字节长

This commit is contained in:
2026-09-23 22:25:16 +00:00
parent b892c59a75
commit 9a161290f3
2 changed files with 18 additions and 2 deletions
+5 -2
View File
@@ -935,8 +935,8 @@ enum TransferKeep {
///
/// # 步骤
/// 1. this 品牌校验(非对象/非 ArrayBuffer → TypeError)。
/// 2. newLength 缺省 → 源当前字节长;在场 → ToIndex 传播式(强转副作用
/// 先于一切守卫观测)。
/// 2. newLength 缺省(含显式 undefined)→ 源当前字节长;其余在场 → ToIndex
/// 传播式(强转副作用先于一切守卫观测)。
/// 3. 重取源载荷指针(求值可已晋升/detach/改 immutable),重检状态位:
/// detached → TypeError;immutable → TypeError。
/// 4. 界校验:仅保持性原样臂——resizable 源且 newByteLength > 真实上限
@@ -957,7 +957,10 @@ fn array_buffer_copy_and_detach<H: VmHost>(
// 只读当前字节长,借用即结束,不跨 JS 调用点。
let cur_len = unsafe { &*payload_ptr }.data.as_ref().map_or(0, |d| d.len());
let new_len = match new_length {
// undefined 缺省臂(含显式 undefined)先于 ToIndex:显式 undefined 与
// 缺省同义,直接取源当前字节长。
None => cur_len,
Some(v) if v.is_undefined() => cur_len,
Some(v) => native_try!(to_index(vm, v)),
};
// 求值可已把本缓冲区晋升进 session、detach 或置 immutable:接收者寄存器
@@ -72,6 +72,19 @@ fn array_buffer_negative_length_throws_range_error() {
assert!(result.as_bool());
}
// newLength 缺省(含显式 undefined)保持源当前字节长:两臂同钉。
#[test]
fn array_buffer_transfer_to_immutable_default_keeps_byte_length() {
let mut vm = Vm::new();
let result = eval(
&mut vm,
"var a = new ArrayBuffer(8); var b = new ArrayBuffer(8); \
a.transferToImmutable(undefined).byteLength === 8 && b.transferToImmutable().byteLength === 8",
)
.unwrap();
assert!(result.as_bool());
}
#[test]
fn array_buffer_to_string_is_identifiable() {
let mut vm = Vm::new();