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)?;