From 2b565a499668d058ff225b320b02b585ccca0e46 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 28 Sep 2026 19:12:13 +0000 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20lexical=20?= =?UTF-8?q?=E9=A2=84=E5=A3=B0=E6=98=8E=E5=87=BD=E6=95=B0=E7=9A=84=E6=AD=BB?= =?UTF-8?q?=E5=8F=82=E6=95=B0=20global=5Flexical?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_emit/src/function_body.rs | 2 +- crates/oxide_emit/src/module.rs | 2 +- crates/oxide_emit/src/prepass/declare.rs | 24 +++++++------------ crates/oxide_emit/src/program.rs | 8 ++----- crates/oxide_emit/src/stmt/block.rs | 2 +- .../src/stmt/exception/try_catch.rs | 6 ++--- crates/oxide_emit/src/stmt/switch.rs | 2 +- 7 files changed, 18 insertions(+), 28 deletions(-) diff --git a/crates/oxide_emit/src/function_body.rs b/crates/oxide_emit/src/function_body.rs index 45767cf6..c6dbfaf8 100644 --- a/crates/oxide_emit/src/function_body.rs +++ b/crates/oxide_emit/src/function_body.rs @@ -429,7 +429,7 @@ impl Emitter { // 预声明 body 级 `let`/`const`/`class`(未初始化 TDZ 占位), // 使声明点前读取可编译为运行时 ReferenceError。函数体 lexical 声明是 // 局部绑定,不做受限全局名检查;重复声明错在 emit 期报。 - let _ = self.predeclare_lexical_declarations(body_stmts, &mut ctx, false); + let _ = self.predeclare_lexical_declarations(body_stmts, &mut ctx); // 块级函数名 web-compat 外层 var 绑定(sloppy):块内函数声明名在实例化 // 期于函数作用域建外层 var 绑定——无同名绑定则新建 var 槽;名在抑制集 diff --git a/crates/oxide_emit/src/module.rs b/crates/oxide_emit/src/module.rs index 91c290f3..e175f85f 100644 --- a/crates/oxide_emit/src/module.rs +++ b/crates/oxide_emit/src/module.rs @@ -445,7 +445,7 @@ impl Emitter { self.pre_register_builtin_references(body, &lexical_excluded, ctx); self.predeclare_var_declarations(body, ctx); // 模块 lexical 声明入模块环境(非全局对象),不做受限全局名检查。 - let _ = self.predeclare_lexical_declarations(body, ctx, false); + let _ = self.predeclare_lexical_declarations(body, ctx); // 闭包捕获分析(import 绑定名纳入 own_bindings,供嵌套函数 cell 捕获)。 ctx.own_bindings = collect_own_binding_names(&[], body); diff --git a/crates/oxide_emit/src/prepass/declare.rs b/crates/oxide_emit/src/prepass/declare.rs index e5b0736a..d4ce28f9 100644 --- a/crates/oxide_emit/src/prepass/declare.rs +++ b/crates/oxide_emit/src/prepass/declare.rs @@ -292,11 +292,8 @@ impl Emitter { /// 属 Declaration、非 Statement 子产生式,parser 按语法错误直接拒绝,这些 /// 形状不会进入 emit)。 /// - 跳过 for 头声明(循环作用域由 for 分支内联 declare)。 - /// - `global_lexical` 仅脚本顶层调用点传 `!is_eval_script`,其余调用点传 - /// false;当前只透传不消费(死参数,待后续清理),顶层与局部的 lexical - /// 声明均按合法遮蔽处理。 pub(crate) fn predeclare_lexical_declarations( - &self, statements: &[Statement], ctx: &mut CompileCtx, global_lexical: bool, + &self, statements: &[Statement], ctx: &mut CompileCtx, ) -> Result<(), String> { for statement in statements { match statement { @@ -306,7 +303,7 @@ impl Emitter { } let is_const = matches!(decl.kind, VariableDeclarationKind::Const); for d in &decl.declarations { - self.predeclare_lexical_pattern(&d.id, is_const, ctx, global_lexical)?; + self.predeclare_lexical_pattern(&d.id, is_const, ctx)?; } } Statement::ClassDeclaration(cd) => { @@ -324,7 +321,7 @@ impl Emitter { } let is_const = matches!(vd.kind, VariableDeclarationKind::Const); for d in &vd.declarations { - self.predeclare_lexical_pattern(&d.id, is_const, ctx, global_lexical)?; + self.predeclare_lexical_pattern(&d.id, is_const, ctx)?; } } Declaration::ClassDeclaration(cd) => { @@ -359,11 +356,8 @@ impl Emitter { } /// 递归预声明绑定 pattern 内的全部标识符(含数组/对象/默认值解构)。 - /// `global_lexical` 当前只透传不消费(死参数,待后续清理),递归调用 - /// 必须原样下传,故仅递归使用。 - #[allow(clippy::only_used_in_recursion)] fn predeclare_lexical_pattern( - &self, pattern: &BindingPattern, is_const: bool, ctx: &mut CompileCtx, global_lexical: bool, + &self, pattern: &BindingPattern, is_const: bool, ctx: &mut CompileCtx, ) -> Result<(), String> { match pattern { BindingPattern::BindingIdentifier(bi) => { @@ -381,22 +375,22 @@ impl Emitter { } BindingPattern::ArrayPattern(ap) => { for e in ap.elements.iter().flatten() { - self.predeclare_lexical_pattern(e, is_const, ctx, global_lexical)?; + self.predeclare_lexical_pattern(e, is_const, ctx)?; } if let Some(rest) = &ap.rest { - self.predeclare_lexical_pattern(&rest.argument, is_const, ctx, global_lexical)?; + self.predeclare_lexical_pattern(&rest.argument, is_const, ctx)?; } } BindingPattern::ObjectPattern(op) => { for prop in &op.properties { - self.predeclare_lexical_pattern(&prop.value, is_const, ctx, global_lexical)?; + self.predeclare_lexical_pattern(&prop.value, is_const, ctx)?; } if let Some(rest) = &op.rest { - self.predeclare_lexical_pattern(&rest.argument, is_const, ctx, global_lexical)?; + self.predeclare_lexical_pattern(&rest.argument, is_const, ctx)?; } } BindingPattern::AssignmentPattern(ap) => { - self.predeclare_lexical_pattern(&ap.left, is_const, ctx, global_lexical)?; + self.predeclare_lexical_pattern(&ap.left, is_const, ctx)?; } } Ok(()) diff --git a/crates/oxide_emit/src/program.rs b/crates/oxide_emit/src/program.rs index 44129efb..014a54c5 100644 --- a/crates/oxide_emit/src/program.rs +++ b/crates/oxide_emit/src/program.rs @@ -309,12 +309,8 @@ impl Emitter { // 预声明顶层 `var` 名,使首个 sub-pass 中提升的函数声明能解析外层 var。 self.predeclare_var_declarations(&program.body, &mut ctx); - // 预声明顶层 `let`/`const`/`class`(未初始化 TDZ 占位)。受限全局名检查 - // 仅对脚本代码启用:脚本声明实例化查全局对象受限自有属性名,eval 代码 - // 声明实例化不查——门控随 is_eval_script 而非作用域标志(嵌套块内 - // is_global_scope 仍为 true,不能作门控)。 - let global_lexical = !ctx.is_eval_script; - self.predeclare_lexical_declarations(&program.body, &mut ctx, global_lexical)?; + // 预声明顶层 `let`/`const`/`class`(未初始化 TDZ 占位)。 + self.predeclare_lexical_declarations(&program.body, &mut ctx)?; // 顶层块级函数名按 sloppy 模式下与浏览器/web 实现惯例兼容的行为处理 // (块级函数声明建外层 var 绑定并求值写回;sloppy eval 代码同走 diff --git a/crates/oxide_emit/src/stmt/block.rs b/crates/oxide_emit/src/stmt/block.rs index afa9bf73..5e097a4d 100644 --- a/crates/oxide_emit/src/stmt/block.rs +++ b/crates/oxide_emit/src/stmt/block.rs @@ -15,7 +15,7 @@ impl Emitter { // 命中已存在的函数绑定自然报重复声明错,不被静默覆盖破坏 TDZ。 self.predeclare_block_function_declarations(&block.body, ctx, false); // 块 lexical 声明是局部绑定:不做受限全局名检查(重复声明错在 emit 期报)。 - let _ = self.predeclare_lexical_declarations(&block.body, ctx, false); + let _ = self.predeclare_lexical_declarations(&block.body, ctx); // 块级函数声明的块入口初始化:直接子(含标签直接子体)闭包物化入预 // 声明块槽,声明语句前读命中函数对象(sloppy 与 strict 同形);声明 // 点不再重编闭包,只处理外层 var 写回(见 emit_function_declaration)。 diff --git a/crates/oxide_emit/src/stmt/exception/try_catch.rs b/crates/oxide_emit/src/stmt/exception/try_catch.rs index 530da2e5..d5614f1b 100644 --- a/crates/oxide_emit/src/stmt/exception/try_catch.rs +++ b/crates/oxide_emit/src/stmt/exception/try_catch.rs @@ -37,7 +37,7 @@ impl Emitter { // 函数预声明先于 lexical:同名 let 命中已有函数绑定报重复声明错。 self.predeclare_block_function_declarations(&ts.block.body, ctx, false); // try 块 lexical 声明是局部绑定:不做受限全局名检查(重复声明错在 emit 期报)。 - let _ = self.predeclare_lexical_declarations(&ts.block.body, ctx, false); + let _ = self.predeclare_lexical_declarations(&ts.block.body, ctx); // 块级函数声明的块入口初始化:声明点前读命中函数对象,声明点复用入口槽。 ctx.block_fn_entry_mats.push(HashMap::new()); for s in &ts.block.body { @@ -85,7 +85,7 @@ impl Emitter { // catch 块函数预声明先于 lexical,块入口物化与 try/普通块同口径。 self.predeclare_block_function_declarations(&catch.body.body, ctx, false); // catch 块 lexical 声明同为局部绑定:不做受限全局名检查。 - let _ = self.predeclare_lexical_declarations(&catch.body.body, ctx, false); + let _ = self.predeclare_lexical_declarations(&catch.body.body, ctx); ctx.block_fn_entry_mats.push(HashMap::new()); for s in &catch.body.body { self.emit_block_fn_entry_init_stmt(s, ctx)?; @@ -123,7 +123,7 @@ impl Emitter { // finally 块函数预声明先于 lexical,块入口物化与 try/普通块同口径。 self.predeclare_block_function_declarations(&ts.finalizer.as_ref().unwrap().body, ctx, false); // finally 块 lexical 声明同为局部绑定:不做受限全局名检查。 - let _ = self.predeclare_lexical_declarations(&ts.finalizer.as_ref().unwrap().body, ctx, false); + let _ = self.predeclare_lexical_declarations(&ts.finalizer.as_ref().unwrap().body, ctx); ctx.block_fn_entry_mats.push(HashMap::new()); for s in &ts.finalizer.as_ref().unwrap().body { self.emit_block_fn_entry_init_stmt(s, ctx)?; diff --git a/crates/oxide_emit/src/stmt/switch.rs b/crates/oxide_emit/src/stmt/switch.rs index b71bac26..cb24122f 100644 --- a/crates/oxide_emit/src/stmt/switch.rs +++ b/crates/oxide_emit/src/stmt/switch.rs @@ -34,7 +34,7 @@ impl Emitter { ctx.push_scope(); for case in cases.iter() { self.predeclare_block_function_declarations(&case.consequent, ctx, false); - self.predeclare_lexical_declarations(&case.consequent, ctx, false)?; + self.predeclare_lexical_declarations(&case.consequent, ctx)?; } // case 内函数声明的块入口初始化:同名重复声明按源序物化,末次声明成为 // 入口值;声明点复用块槽写回外层 var(见 emit_function_declaration)。