mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 03:01:12 +08:00
fix: arguments 自动绑定判定限定直接子级声明
This commit is contained in:
@@ -14,6 +14,11 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
|
||||
vm.run(&Arc::new(module))
|
||||
}
|
||||
|
||||
fn eval_str(vm: &mut Vm, source: &str) -> String {
|
||||
let result = eval(vm, source).unwrap_or_else(|e| panic!("{source} -> {e}"));
|
||||
vm.lookup_str(result).unwrap_or_else(|| panic!("{source} -> 非字符串结果"))
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arguments_length_counts_actual_args() {
|
||||
let mut vm = Vm::new();
|
||||
@@ -112,3 +117,66 @@ fn new_expression_target_gets_arguments() {
|
||||
let result = eval(&mut vm, "function Ctor(){this.n=arguments.length} var c=new Ctor(1,2,3); c.n").unwrap();
|
||||
assert_eq!(result.as_int(), 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_block_fn_named_arguments_keeps_object_before_decl() {
|
||||
// 嵌套块内函数声明名 arguments 不抑制自动对象:块求值前读为 Arguments 对象,
|
||||
// 块求值后 web-compat 写回同槽成函数(与 node 一致)。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval_str(
|
||||
&mut vm,
|
||||
"function f(){var r=typeof arguments;{function arguments(){}}return r+',' +typeof arguments} f()",
|
||||
);
|
||||
assert_eq!(result, "object,function");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_block_lexical_named_arguments_keeps_object_before_decl() {
|
||||
// 嵌套块 let arguments 是块作用域绑定,不进入函数顶层 lexicalNames。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval_str(&mut vm, "function f(){var r=typeof arguments;{let arguments=1;}return r} f()");
|
||||
assert_eq!(result, "object");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn var_named_arguments_keeps_object() {
|
||||
// var arguments 不在规范抑制面内,入口仍建对象。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval_str(&mut vm, "function f(){var r=typeof arguments;var arguments;return r} f()");
|
||||
assert_eq!(result, "object");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn top_level_lexical_named_arguments_suppresses_object() {
|
||||
// 函数体顶层 let arguments 与自动绑定同作用域冲突,词法绑定胜出。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval_str(&mut vm, "function f(){ let arguments='L'; return typeof arguments } f()");
|
||||
assert_eq!(result, "string");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn destructured_param_leaf_named_arguments_suppresses_object() {
|
||||
// 解构形参叶名 arguments 是规范 paramNames 成员,自动对象被抑制。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "function f({arguments}){return typeof arguments} f({arguments:5})").unwrap();
|
||||
assert_eq!(vm.lookup_str(result).as_deref(), Some("number"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn default_param_reads_arguments_when_body_has_arguments_fn() {
|
||||
// 含参数默认值时顶层函数声明不抑制对象:默认参数内可读到 Arguments 对象。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval_str(
|
||||
&mut vm,
|
||||
"var args; function f(x = args = arguments) { function arguments() {} } f(); typeof args+',' +args.length",
|
||||
);
|
||||
assert_eq!(result, "object,0");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn top_level_fn_named_arguments_suppresses_object() {
|
||||
// 无参数默认值时函数体顶层函数声明 arguments 抑制自动对象,body 见函数对象。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval_str(&mut vm, "function f(){return typeof arguments; function arguments(){}} f()");
|
||||
assert_eq!(result, "function");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user