refactor(compiler): emit control jumps through fixups

This commit is contained in:
爱特每羊队
2026-08-05 00:24:12 +08:00
parent ac818b0821
commit ff400c47c2
5 changed files with 19 additions and 50 deletions
+6 -9
View File
@@ -50,25 +50,22 @@ impl Compiler {
let eq_reg = ctx.alloc_reg();
ctx.emit(opcode::encode(OpCode::EQ, eq_reg, disc_reg, test_reg));
let case_label = Label::SwitchCase(id, case_idx as u32);
let body_pos = ctx.resolve_label(case_label)?;
let offset = (body_pos as isize) - (ctx.bytecode.len() as isize);
let offset = ctx.checked_jump_offset(offset);
ctx.emit(opcode::encode_jmp_if_true(eq_reg, offset));
ctx.emit_jmp_if_true_labeled(eq_reg, case_label);
ctx.restore_reg_checkpoint(compare_reg_checkpoint);
}
}
let has_default = cases.iter().any(|c| c.test.is_none());
if !has_default {
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);
}
for case in cases.iter() {
for (case_idx, case) in cases.iter().enumerate() {
let case_label = Label::SwitchCase(id, case_idx as u32);
ctx.labels.label_map.insert(case_label, ctx.bytecode.len());
for s in &case.consequent {
self.emit_statement(s, ctx)?;
}
}
ctx.labels.label_map.insert(end_label, ctx.bytecode.len());
ctx.pop_switch();
Ok(None)
}