From 3bbdc3f562370de3613bde5bef76b6e81b9814b1 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Wed, 5 Aug 2026 00:38:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=8F=AF=E9=80=89=E9=93=BE?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E6=94=B9=E7=BB=8F=20fixup=20=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E5=8F=91=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_compiler/src/expr/member/mod.rs | 7 ++--- crates/oxide_compiler/src/shared/chain.rs | 29 ++++---------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/crates/oxide_compiler/src/expr/member/mod.rs b/crates/oxide_compiler/src/expr/member/mod.rs index b9d92bfc..c41f7791 100644 --- a/crates/oxide_compiler/src/expr/member/mod.rs +++ b/crates/oxide_compiler/src/expr/member/mod.rs @@ -124,12 +124,11 @@ impl Compiler { let value_reg = self.emit_chain_element(&chain.expression, Some(short_label), ctx)?; let result_reg = ctx.alloc_reg(); ctx.emit(opcode::encode(OpCode::LOAD_VAR, result_reg, value_reg, 0)); - let end_pos = ctx.resolve_label(end_label)?; - let offset = (end_pos as isize) - (ctx.bytecode.len() as isize); - let offset = ctx.checked_jump_offset(offset); - ctx.emit(opcode::encode_jmp(offset)); + ctx.emit_jmp_labeled(end_label); + ctx.labels.label_map.insert(short_label, ctx.bytecode.len()); let undefined_idx = ctx.add_constant(Constant::Undefined); ctx.emit_load_const(result_reg, undefined_idx); + ctx.labels.label_map.insert(end_label, ctx.bytecode.len()); Ok(result_reg) } diff --git a/crates/oxide_compiler/src/shared/chain.rs b/crates/oxide_compiler/src/shared/chain.rs index a0dfd172..437c82da 100644 --- a/crates/oxide_compiler/src/shared/chain.rs +++ b/crates/oxide_compiler/src/shared/chain.rs @@ -171,12 +171,9 @@ impl Compiler { impl Compiler { fn emit_optional_guard(&self, reg: u8, short_label: Label, ctx: &mut CompileCtx) -> Result<(), String> { - let short_pos = ctx.resolve_label(short_label)?; let dup_reg = ctx.alloc_reg(); ctx.emit(opcode::encode(OpCode::LOAD_VAR, dup_reg, reg, 0)); - let offset = (short_pos as isize) - (ctx.bytecode.len() as isize); - let offset = ctx.checked_jump_offset(offset); - ctx.emit(opcode::encode_jmp_if_nullish(dup_reg, offset)); + ctx.emit_jmp_if_nullish_labeled(dup_reg, short_label); Ok(()) } @@ -344,27 +341,11 @@ impl Compiler { &self, op: LogicalOperator, test_reg: u8, store_label: Label, end_label: Label, ctx: &mut CompileCtx, ) -> Result<(), String> { match op { - LogicalOperator::And => { - let end_pos = ctx.resolve_label(end_label)?; - let offset = (end_pos as isize) - (ctx.bytecode.len() as isize); - let offset = ctx.checked_jump_offset(offset); - ctx.emit(opcode::encode_jmp_if_false(test_reg, offset)); - } - LogicalOperator::Or => { - let end_pos = ctx.resolve_label(end_label)?; - let offset = (end_pos as isize) - (ctx.bytecode.len() as isize); - let offset = ctx.checked_jump_offset(offset); - ctx.emit(opcode::encode_jmp_if_true(test_reg, offset)); - } + LogicalOperator::And => ctx.emit_jmp_if_false_labeled(test_reg, end_label), + LogicalOperator::Or => ctx.emit_jmp_if_true_labeled(test_reg, end_label), LogicalOperator::Coalesce => { - let store_pos = ctx.resolve_label(store_label)?; - let offset = (store_pos as isize) - (ctx.bytecode.len() as isize); - let offset = ctx.checked_jump_offset(offset); - ctx.emit(opcode::encode_jmp_if_nullish(test_reg, offset)); - let end_pos = ctx.resolve_label(end_label)?; - let offset = (end_pos as isize) - (ctx.bytecode.len() as isize); - let offset = ctx.checked_jump_offset(offset); - ctx.emit(opcode::encode_jmp(offset)); + ctx.emit_jmp_if_nullish_labeled(test_reg, store_label); + ctx.emit_jmp_labeled(end_label); } } Ok(())