From b043c0272bfd9b541dd2f6b21975da99b2b2ab99 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Wed, 5 Aug 2026 00:42:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=80=BB=E8=BE=91=E8=B5=8B?= =?UTF-8?q?=E5=80=BC=E8=B7=B3=E8=BD=AC=E6=94=B9=E7=BB=8F=20fixup=20?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_compiler/src/expr/assignment.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/oxide_compiler/src/expr/assignment.rs b/crates/oxide_compiler/src/expr/assignment.rs index a1193838..fe6d2ce6 100644 --- a/crates/oxide_compiler/src/expr/assignment.rs +++ b/crates/oxide_compiler/src/expr/assignment.rs @@ -138,12 +138,14 @@ impl Compiler { ctx.emit(0); ctx.emit(0); self.emit_logical_assign_test(logical_op, result_reg, store_label, end_label, ctx)?; + ctx.labels.label_map.insert(store_label, ctx.bytecode.len()); let val_reg = self.emit_expression(&assign.right, ctx)?; ctx.emit(opcode::encode(OpCode::IC_SET_PROP, obj_reg, val_reg, key_reg)); ctx.emit(0); ctx.emit(0); ctx.emit(0); ctx.emit(opcode::encode(OpCode::LOAD_VAR, result_reg, val_reg, 0)); + ctx.labels.label_map.insert(end_label, ctx.bytecode.len()); return Ok(result_reg); } let obj_reg = self.emit_expression(&member.object, ctx)?; @@ -184,9 +186,11 @@ impl Compiler { let result_reg = ctx.alloc_reg(); ctx.emit(opcode::encode(OpCode::GET_PROP_DYNAMIC, obj_reg, key_reg, result_reg)); self.emit_logical_assign_test(logical_op, result_reg, store_label, end_label, ctx)?; + ctx.labels.label_map.insert(store_label, ctx.bytecode.len()); let val_reg = self.emit_expression(&assign.right, ctx)?; ctx.emit(opcode::encode(OpCode::SET_PROP_DYNAMIC, obj_reg, key_reg, val_reg)); ctx.emit(opcode::encode(OpCode::LOAD_VAR, result_reg, val_reg, 0)); + ctx.labels.label_map.insert(end_label, ctx.bytecode.len()); return Ok(result_reg); } let obj_reg = self.emit_expression(&member.object, ctx)?; @@ -214,11 +218,13 @@ impl Compiler { let result_reg = ctx.alloc_reg(); ctx.emit(opcode::encode(OpCode::LOAD_VAR, result_reg, var_reg, 0)); self.emit_logical_assign_test(logical_op, result_reg, store_label, end_label, ctx)?; + ctx.labels.label_map.insert(store_label, ctx.bytecode.len()); let val_reg = self.emit_expression(&assign.right, ctx)?; let is_const = ctx.lookup_const_flag(name); let const_flag = if is_const { 1 } else { 0 }; ctx.emit(opcode::encode(OpCode::STORE_VAR, var_reg, val_reg, const_flag)); ctx.emit(opcode::encode(OpCode::LOAD_VAR, result_reg, val_reg, 0)); + ctx.labels.label_map.insert(end_label, ctx.bytecode.len()); Ok(result_reg) } else if assign.operator == AssignmentOperator::Addition || assign.operator == AssignmentOperator::Subtraction