From 741bbcfecda890daec226a6d953fb02308ab8fb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E7=89=B9=E6=AF=8F=E7=BE=8A=E9=98=9F?= Date: Sat, 6 Jun 2026 15:49:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E8=A1=A8=E7=B4=A2=E5=BC=95=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_compiler/src/compiler.rs | 7 +++++++ crates/oxide_compiler/src/emitter.rs | 22 +++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/crates/oxide_compiler/src/compiler.rs b/crates/oxide_compiler/src/compiler.rs index 4b834a6..09dfad1 100644 --- a/crates/oxide_compiler/src/compiler.rs +++ b/crates/oxide_compiler/src/compiler.rs @@ -93,6 +93,13 @@ impl CompileCtx { idx as u16 } + pub(crate) fn resolve_label(&self, label: Label) -> Result { + self.label_map + .get(&label) + .copied() + .ok_or_else(|| format!("Label {:?} not found in bytecode map", label)) + } + pub(crate) fn push_scope(&mut self) { self.symbols.push_scope(); } diff --git a/crates/oxide_compiler/src/emitter.rs b/crates/oxide_compiler/src/emitter.rs index f27a1f0..e454ac9 100644 --- a/crates/oxide_compiler/src/emitter.rs +++ b/crates/oxide_compiler/src/emitter.rs @@ -75,7 +75,7 @@ impl Compiler { let test_reg = self.emit_expression(&ifs.test, ctx)?; - let else_pos = ctx.label_map[&else_label]; + let else_pos = ctx.resolve_label(else_label)?; let offset = (else_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp_if_false(test_reg, offset as i16)); @@ -95,7 +95,7 @@ impl Compiler { let has_alt = ifs.alternate.is_some(); if has_alt { - let end_pos = ctx.label_map[&end_label]; + let end_pos = ctx.resolve_label(end_label)?; let offset = (end_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp(offset as i16)); } @@ -126,13 +126,13 @@ impl Compiler { let test_reg = self.emit_expression(&wh.test, ctx)?; - let end_pos = ctx.label_map[&end_label]; + let end_pos = ctx.resolve_label(end_label)?; let offset = (end_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp_if_false(test_reg, offset as i16)); self.emit_statement(&wh.body, ctx)?; - let start_pos = ctx.label_map[&start_label]; + let start_pos = ctx.resolve_label(start_label)?; let offset = (start_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp(offset as i16)); @@ -171,7 +171,7 @@ impl Compiler { if let Some(test) = &fr.test { let test_reg = self.emit_expression(test, ctx)?; - let end_pos = ctx.label_map[&end_label]; + let end_pos = ctx.resolve_label(end_label)?; let offset = (end_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp_if_false(test_reg, offset as i16)); } @@ -182,7 +182,7 @@ impl Compiler { self.emit_expression(update, ctx)?; } - let start_pos = ctx.label_map[&start_label]; + let start_pos = ctx.resolve_label(start_label)?; let offset = (start_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp(offset as i16)); @@ -193,7 +193,7 @@ impl Compiler { Statement::BreakStatement(_) => { let (break_label, _) = ctx.current_loop().ok_or("break outside loop".to_string())?; - let break_pos = ctx.label_map[break_label]; + let break_pos = ctx.resolve_label(*break_label)?; let offset = (break_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp(offset as i16)); Ok(None) @@ -202,7 +202,7 @@ impl Compiler { let (_, continue_label) = ctx .current_loop() .ok_or("continue outside loop".to_string())?; - let continue_pos = ctx.label_map[continue_label]; + let continue_pos = ctx.resolve_label(*continue_label)?; let offset = (continue_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp(offset as i16)); Ok(None) @@ -319,8 +319,8 @@ impl Compiler { let end_label = Label::TernaryEnd(id); let test_reg = self.emit_expression(&cond.test, ctx)?; - let else_pos = ctx.label_map[&else_label]; - let end_pos = ctx.label_map[&end_label]; + let else_pos = ctx.resolve_label(else_label)?; + let end_pos = ctx.resolve_label(end_label)?; let offset = (else_pos as isize) - (ctx.bytecode.len() as isize); ctx.emit(opcode::encode_jmp_if_false(test_reg, offset as i16)); @@ -362,7 +362,7 @@ impl Compiler { return Err("nullish coalescing not supported".into()); } }; - let skip_pos = ctx.label_map[&skip_label]; + let skip_pos = ctx.resolve_label(skip_label)?; let dup_reg = ctx.alloc_reg(); ctx.emit(opcode::encode(OpCode::LOAD_VAR, dup_reg, left_reg, 0));