use fix_error::Error; use fix_runtime::*; use gc_arena::Mutation; use crate::{BytecodeReader, Step, VmRuntimeCtx}; #[inline(always)] pub(crate) fn op_jump_if_false<'gc, M: Machine<'gc>>( m: &mut M, reader: &mut BytecodeReader<'_>, mc: &gc_arena::Mutation<'gc>, ) -> Step { let offset = reader.read_i32(); let cond = m.force_and_retry::(reader, mc)?; if cond.downcast::() == Some(false) { reader.set_pc(((reader.pc() as isize) + (offset as isize)) as usize); } Step::Continue(()) } #[inline(always)] pub(crate) fn op_jump_if_true<'gc, M: Machine<'gc>>( m: &mut M, reader: &mut BytecodeReader<'_>, mc: &Mutation<'gc>, ) -> Step { let offset = reader.read_i32(); let cond = m.force_and_retry::(reader, mc)?; if cond.downcast::() == Some(true) { reader.set_pc(((reader.pc() as isize) + (offset as isize)) as usize); } Step::Continue(()) } #[inline(always)] pub(crate) fn op_jump<'gc, M: Machine<'gc>>(_m: &mut M, reader: &mut BytecodeReader<'_>) -> Step { let offset = reader.read_i32(); reader.set_pc(((reader.pc() as isize) + (offset as isize)) as usize); Step::Continue(()) } #[inline(always)] pub(crate) fn op_assert<'gc, M: Machine<'gc>>( m: &mut M, ctx: &mut impl VmRuntimeCtx, reader: &mut BytecodeReader<'_>, mc: &Mutation<'gc>, ) -> Step { let raw_id = reader.read_string_id(); let raw = ctx.resolve_string(raw_id); let _span_id = reader.read_u32(); let assertion = m.force_and_retry::(reader, mc)?; if !assertion { // FIXME: use catchable error return m.finish_err(Error::eval_error(format!("assertion '{raw}' failed"))); } Step::Continue(()) }