From 4734d7d3d511b831f77a5429261a476a7ee5e6ae Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 7 Aug 2026 20:10:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B5=8B=E5=80=BC=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E4=B8=8E=E5=AF=B9=E8=B1=A1=E5=B1=9E=E6=80=A7=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=90=8D=E6=8E=A8=E6=96=AD=EF=BC=88function/class/arr?= =?UTF-8?q?ow=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_emit/src/expr/assignment.rs | 13 +++++++++++++ crates/oxide_emit/src/expr/object/object_literal.rs | 7 ++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/crates/oxide_emit/src/expr/assignment.rs b/crates/oxide_emit/src/expr/assignment.rs index a634735f..4435f167 100644 --- a/crates/oxide_emit/src/expr/assignment.rs +++ b/crates/oxide_emit/src/expr/assignment.rs @@ -193,6 +193,19 @@ impl Emitter { } else { let val_reg = self.emit_expression(&assign.right, ctx)?; let name = id_ref.name.as_str(); + // 赋值函数/箭头/class 表达式 → 推断 name。 + if matches!( + &assign.right, + oxide_parser::Expression::ArrowFunctionExpression(_) + | oxide_parser::Expression::FunctionExpression(_) + | oxide_parser::Expression::ClassExpression(_) + ) { + if let Some(sub_mod) = ctx.nested.last_mut() { + if sub_mod.function_name.is_none() { + sub_mod.function_name = Some(name.to_string()); + } + } + } // 目标若是 upvalue 引用,走 STORE_UPVALUE if let Some(uv_idx) = ctx.current_upvalue_captures.iter().position(|u| u.name == name) { ctx.inst(Inst::new( diff --git a/crates/oxide_emit/src/expr/object/object_literal.rs b/crates/oxide_emit/src/expr/object/object_literal.rs index 01047d4e..677162a3 100644 --- a/crates/oxide_emit/src/expr/object/object_literal.rs +++ b/crates/oxide_emit/src/expr/object/object_literal.rs @@ -56,7 +56,12 @@ impl Emitter { reg }; let val_reg = self.emit_expression(&p.value, ctx)?; - if matches!(&p.value, Expression::ArrowFunctionExpression(_)) { + if matches!( + &p.value, + Expression::ArrowFunctionExpression(_) + | Expression::FunctionExpression(_) + | Expression::ClassExpression(_) + ) { if let Some(sub_mod) = ctx.nested.last_mut() { sub_mod.function_name = Some(prop_name.to_string()); }