feat: 写路径四路加函数名不可写守卫,sloppy 静默 strict 抛 TypeError

This commit is contained in:
2026-10-09 22:20:20 +00:00
parent 4f6bd5d947
commit 6ba2043599
10 changed files with 150 additions and 30 deletions
@@ -391,8 +391,9 @@ fn cross_module_aliased_imports_read_live_value() {
}
/// 默认导出具名函数体的自引用重赋:函数名 `fn` 在函数作用域登记为不可写
/// 绑定(15.2.10.1 步 m),遮蔽模块级同名绑定;体内容器 `fn = 2` 落在函数
/// 作用域名绑定,模块级绑定不被改写,导入方读 default 仍得函数。
/// 绑定(15.2.10.1 步 m),遮蔽模块级同名绑定;模块恒为严格模式,体内容器
/// `fn = 2` 对不可写绑定抛 TypeError,模块级绑定不被改写,导入方读 default
/// 仍得函数。
#[test]
fn cross_module_default_export_reads_live_value() {
let cwd = std::env::current_dir().expect("cwd");
@@ -402,12 +403,16 @@ fn cross_module_default_export_reads_live_value() {
std::fs::write(
dir.join("main.mjs"),
"import val from './dep.mjs';\n \
const ret = val();\n \
globalThis.__ns = [ret, typeof val].join('|');",
let threw = false;\n \
try { val(); } catch (e) { threw = e instanceof TypeError; }\n \
globalThis.__ns = [threw, typeof val].join('|');",
)
.expect("write main");
let _cleanup = Cleanup(dir.clone());
let result = run_namespace_module(&dir);
assert_eq!(result, "1|function", "函数名不可写绑定遮蔽模块级绑定,自引用重赋静默失败");
assert_eq!(
result, "true|function",
"严格模块内函数名不可写绑定自引用重赋抛 TypeError,模块级绑定不被改写"
);
}
@@ -132,12 +132,13 @@ fn switch_case_function_captured_by_outer() {
#[test]
fn switch_case_function_binding_independent_of_outer_var() {
// 块绑定可变且与外层 var 独立:块内对 f 重新赋值不改写外层 var 绑定。
// 函数名不可写绑定(15.2.10.1 步 m):体内容器对 f 重新赋值静默失败(sloppy),
// 块内 f 仍为函数对象;外层 var 绑定独立,不被改写。
let src = "var r1, r2; (function(){ var initialBV, currentBV; \
switch(1){case 1: function f(){ initialBV=f; f=123; currentBV=f; return 'decl'; }} \
var varBinding=f; f(); r1 = initialBV() === 'decl'; \
r2 = currentBV === 123 && varBinding() === 'decl'; }()); r1 && r2";
assert!(eval(src).unwrap().as_bool(), "块绑定应独立于外层 var 绑定");
r2 = currentBV === f && varBinding() === 'decl'; }()); r1 && r2";
assert!(eval(src).unwrap().as_bool(), "函数名不可写绑定自引用重赋静默失败,外层 var 绑定独立");
}
#[test]