From ca5c27574ef855b001841868e8f2c50f083bced2 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 14 Sep 2026 21:07:10 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20directive=20=E5=BA=8F=E8=A8=80=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=8C=89=E6=BA=90=E5=BA=8F=E5=85=88=E5=8F=91?= =?UTF-8?q?=E5=B0=84=E4=B8=94=E5=AE=8C=E6=88=90=E5=80=BC=E5=8F=82=E4=B8=8E?= =?UTF-8?q?=E6=94=B6=E6=95=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_emit/src/emit.rs | 6 ++++++ crates/oxide_emit/src/expr/literal.rs | 2 +- crates/oxide_emit/src/module.rs | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/oxide_emit/src/emit.rs b/crates/oxide_emit/src/emit.rs index 07b4111d..c33f2d3b 100644 --- a/crates/oxide_emit/src/emit.rs +++ b/crates/oxide_emit/src/emit.rs @@ -1870,6 +1870,12 @@ impl Emitter { // 第二个 sub-pass:发其余所有语句。 let mut last_result: Option = None; + // directive 序言是 AST 独立字段(顶格字符串字面量,不在 body):作为语句 + // 序列的头前缀按源序先于 body 发射。完成值即字符串值本身,参与"最后非空 + // 完成值"收敛;严格模式标志由 has_use_strict_directive 独立处理,此处不涉。 + for dir in &program.directives { + last_result = Some(self.emit_string_literal_expression(&dir.expression, &mut ctx)?); + } for stmt in &program.body { if matches!(stmt, Statement::FunctionDeclaration(_)) { continue; // Already emitted above diff --git a/crates/oxide_emit/src/expr/literal.rs b/crates/oxide_emit/src/expr/literal.rs index 6d6898c0..bc0927de 100644 --- a/crates/oxide_emit/src/expr/literal.rs +++ b/crates/oxide_emit/src/expr/literal.rs @@ -49,7 +49,7 @@ impl Emitter { Ok(r) } - fn emit_string_literal_expression( + pub(crate) fn emit_string_literal_expression( &self, s: &oxide_parser::StringLiteral, ctx: &mut CompileCtx, ) -> Result { let idx = ctx diff --git a/crates/oxide_emit/src/module.rs b/crates/oxide_emit/src/module.rs index 80f8ed7a..f566f3a9 100644 --- a/crates/oxide_emit/src/module.rs +++ b/crates/oxide_emit/src/module.rs @@ -365,6 +365,11 @@ impl Emitter { } // —— body(函数声明 hoisting 先发,随后其余;import 已由 prelude 处理)—— + // directive 序言是 AST 独立字段(顶格字符串字面量,不在 body):纯字符串 + // 无副作用,按源序先于 body 发射,与脚本 emit_program 的发射口径一致。 + for dir in &program.directives { + self.emit_string_literal_expression(&dir.expression, ctx)?; + } for stmt in body { if is_hoisted_function_decl(stmt) { self.emit_statement(stmt, ctx)?;