mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-27 04:01:11 +08:00
fix: transferToImmutable 显式 undefined 长度参数回落源字节长
This commit is contained in:
@@ -935,8 +935,8 @@ enum TransferKeep {
|
|||||||
///
|
///
|
||||||
/// # 步骤
|
/// # 步骤
|
||||||
/// 1. this 品牌校验(非对象/非 ArrayBuffer → TypeError)。
|
/// 1. this 品牌校验(非对象/非 ArrayBuffer → TypeError)。
|
||||||
/// 2. newLength 缺省 → 源当前字节长;在场 → ToIndex 传播式(强转副作用
|
/// 2. newLength 缺省(含显式 undefined)→ 源当前字节长;其余在场 → ToIndex
|
||||||
/// 先于一切守卫观测)。
|
/// 传播式(强转副作用先于一切守卫观测)。
|
||||||
/// 3. 重取源载荷指针(求值可已晋升/detach/改 immutable),重检状态位:
|
/// 3. 重取源载荷指针(求值可已晋升/detach/改 immutable),重检状态位:
|
||||||
/// detached → TypeError;immutable → TypeError。
|
/// detached → TypeError;immutable → TypeError。
|
||||||
/// 4. 界校验:仅保持性原样臂——resizable 源且 newByteLength > 真实上限
|
/// 4. 界校验:仅保持性原样臂——resizable 源且 newByteLength > 真实上限
|
||||||
@@ -957,7 +957,10 @@ fn array_buffer_copy_and_detach<H: VmHost>(
|
|||||||
// 只读当前字节长,借用即结束,不跨 JS 调用点。
|
// 只读当前字节长,借用即结束,不跨 JS 调用点。
|
||||||
let cur_len = unsafe { &*payload_ptr }.data.as_ref().map_or(0, |d| d.len());
|
let cur_len = unsafe { &*payload_ptr }.data.as_ref().map_or(0, |d| d.len());
|
||||||
let new_len = match new_length {
|
let new_len = match new_length {
|
||||||
|
// undefined 缺省臂(含显式 undefined)先于 ToIndex:显式 undefined 与
|
||||||
|
// 缺省同义,直接取源当前字节长。
|
||||||
None => cur_len,
|
None => cur_len,
|
||||||
|
Some(v) if v.is_undefined() => cur_len,
|
||||||
Some(v) => native_try!(to_index(vm, v)),
|
Some(v) => native_try!(to_index(vm, v)),
|
||||||
};
|
};
|
||||||
// 求值可已把本缓冲区晋升进 session、detach 或置 immutable:接收者寄存器
|
// 求值可已把本缓冲区晋升进 session、detach 或置 immutable:接收者寄存器
|
||||||
|
|||||||
@@ -72,6 +72,19 @@ fn array_buffer_negative_length_throws_range_error() {
|
|||||||
assert!(result.as_bool());
|
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]
|
#[test]
|
||||||
fn array_buffer_to_string_is_identifiable() {
|
fn array_buffer_to_string_is_identifiable() {
|
||||||
let mut vm = Vm::new();
|
let mut vm = Vm::new();
|
||||||
|
|||||||
Reference in New Issue
Block a user