From b26715742f49061747b53ef0cd51f7731e943b9c Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 7 Aug 2026 12:04:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=95=E5=85=A5=20oxc=5Fsemantic=20?= =?UTF-8?q?=E6=97=A9=E6=9C=9F=E9=94=99=E8=AF=AF=E6=A3=80=E6=9F=A5=E4=B8=8E?= =?UTF-8?q?=20onlyStrict=20=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_emit/src/expr/operator/mod.rs | 7 ++++++- crates/oxide_parser/Cargo.toml | 1 + crates/oxide_parser/src/lib.rs | 10 +++++++++- crates/oxide_test262/src/main.rs | 10 +++++++++- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/crates/oxide_emit/src/expr/operator/mod.rs b/crates/oxide_emit/src/expr/operator/mod.rs index d62d754c..9dc87997 100644 --- a/crates/oxide_emit/src/expr/operator/mod.rs +++ b/crates/oxide_emit/src/expr/operator/mod.rs @@ -62,7 +62,12 @@ impl Emitter { if matches!(un.operator, UnaryOperator::Delete) { return match &un.argument { Expression::Identifier(_) => { - Err("SyntaxError: delete of an unqualified identifier in strict mode".into()) + // 严格模式的 delete 标识符由 oxc_semantic 提前拦截为早期错误; + // 非严格语义返回 false(标识符不可删除)。 + let idx = ctx.add_constant(Constant::Boolean(false)); + let reg = ctx.alloc_reg(); + ctx.inst(Inst::load_const(Operand::Reg(reg), idx)); + Ok(reg) } Expression::StaticMemberExpression(member) => { let obj_reg = self.emit_expression(&member.object, ctx)?; diff --git a/crates/oxide_parser/Cargo.toml b/crates/oxide_parser/Cargo.toml index 5173bf6c..339dce47 100644 --- a/crates/oxide_parser/Cargo.toml +++ b/crates/oxide_parser/Cargo.toml @@ -13,3 +13,4 @@ oxc_ast.workspace = true oxc_span.workspace = true oxc_diagnostics.workspace = true oxc_syntax.workspace = true +oxc_semantic = "0.134.0" diff --git a/crates/oxide_parser/src/lib.rs b/crates/oxide_parser/src/lib.rs index 4682fe6e..1a3e4772 100644 --- a/crates/oxide_parser/src/lib.rs +++ b/crates/oxide_parser/src/lib.rs @@ -20,7 +20,7 @@ pub fn parse<'a>(allocator: &'a Allocator, source: &'a str) -> Result(allocator: &'a Allocator, source: &'a str) -> Result Vec { - meta.includes.clone() + let mut key = meta.includes.clone(); + if meta.flags.iter().any(|f| f == "onlyStrict") { + key.push("__onlyStrict__".into()); + } + key } /// 按测试元数据拼接完整的 harness 前缀源码(prelude + sta/assert + 各 include)。 fn build_harness_source(meta: &TestMeta, harness: &HarnessSources) -> Result { let mut source = String::new(); + // onlyStrict 测试在严格模式下运行:指令必须位于脚本最前(harness 之前)。 + if meta.flags.iter().any(|f| f == "onlyStrict") { + append_source_chunk(&mut source, "use strict", "\"use strict\";"); + } append_source_chunk(&mut source, "Test262Error prelude", test262_error_prelude()); append_source_chunk( &mut source,