diff --git a/Cargo.lock b/Cargo.lock index d6d3853e..bfe073e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.19.29" +version = "0.19.30" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.19.29" +version = "0.19.30" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.19.29" +version = "0.19.30" dependencies = [ "ansi_term", "bumpalo", @@ -1228,7 +1228,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.19.29" +version = "0.19.30" dependencies = [ "lru", "oxide_bytecode", @@ -1237,7 +1237,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1258,7 +1258,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1272,7 +1272,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.19.29" +version = "0.19.30" dependencies = [ "num-bigint", "oxc_allocator", @@ -1288,7 +1288,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1300,7 +1300,7 @@ dependencies = [ [[package]] name = "oxide_fold" -version = "0.19.29" +version = "0.19.30" dependencies = [ "num-bigint", "oxide_bytecode", @@ -1312,7 +1312,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1321,7 +1321,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.19.29" +version = "0.19.30" dependencies = [ "bumpalo", "dashmap", @@ -1335,7 +1335,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1347,7 +1347,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.19.29" +version = "0.19.30" dependencies = [ "tracing", "tracing-appender", @@ -1356,11 +1356,11 @@ dependencies = [ [[package]] name = "oxide_net" -version = "0.19.29" +version = "0.19.30" [[package]] name = "oxide_parser" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1375,7 +1375,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1391,7 +1391,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.19.29" +version = "0.19.30" dependencies = [ "num-bigint", "num-traits", @@ -1404,7 +1404,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.19.29" +version = "0.19.30" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1424,7 +1424,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.19.29" +version = "0.19.30" dependencies = [ "bumpalo", "dashmap", @@ -1437,7 +1437,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.19.29" +version = "0.19.30" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 6e396178..f3c47c42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ members = [ ] [workspace.package] -version = "0.19.29" +version = "0.19.30" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_vm/tests/arguments_tests.rs b/crates/oxide_vm/tests/arguments_tests.rs index 3e1f8410..c90a22f5 100644 --- a/crates/oxide_vm/tests/arguments_tests.rs +++ b/crates/oxide_vm/tests/arguments_tests.rs @@ -229,3 +229,42 @@ fn define_property_nested_call_updates_stored_value() { .unwrap(); assert_eq!(result.as_int(), 5); } + +#[test] +fn arguments_iterator_own_property_shares_array_values() { + // arguments 对象自身 Symbol.iterator 指向 Array.prototype[Symbol.iterator] + // 同一函数对象(可写、不可枚举、可配置),原型保持 Object.prototype。 + let mut vm = Vm::new(); + let result = eval( + &mut vm, + "function f(){var d=Object.getOwnPropertyDescriptor(arguments,Symbol.iterator); + return d.value === [][Symbol.iterator] && d.writable === true + && d.enumerable === false && d.configurable === true + && Object.getPrototypeOf(arguments) === Object.prototype} f(1)", + ) + .unwrap(); + assert_eq!(result, JsValue::bool(true)); +} + +#[test] +fn arguments_spread_iterates_values_in_order() { + // 展开 arguments 对象按序产出实参值。 + let mut vm = Vm::new(); + let result = eval(&mut vm, "function f(){return [...arguments].join(',')} f(1,2,3)").unwrap(); + assert_eq!(vm.lookup_str(result).as_deref(), Some("1,2,3")); +} + +#[test] +fn arguments_iterator_reads_length_live() { + // 迭代器每次步进活读 length:创建迭代器后抬高 length 并写入新索引, + // 后续步进产出新值。 + let mut vm = Vm::new(); + let result = eval( + &mut vm, + "function f(){var it=arguments[Symbol.iterator](); it.next(); it.next(); + arguments.length=4; arguments[3]=9; it.next(); return it.next().value} f(1,2,3)", + ) + .unwrap(); + assert_eq!(result.as_int(), 9); +} +