use fix_error::Error; use gc_arena::Mutation; use crate::value::*; use crate::{BytecodeReader, Step, VmRuntimeCtx}; impl<'gc> crate::Vm<'gc> { #[inline(always)] pub(crate) fn op_jump_if_false( &mut self, reader: &mut BytecodeReader<'_>, mc: &gc_arena::Mutation<'gc>, ) -> Step { let offset = reader.read_i32(); let cond = self.force_and_retry::(reader, mc)?; if cond.as_inline::() == 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( &mut self, reader: &mut BytecodeReader<'_>, mc: &Mutation<'gc>, ) -> Step { let offset = reader.read_i32(); let cond = self.force_and_retry::(reader, mc)?; if cond.as_inline::() == Some(true) { reader.set_pc(((reader.pc() as isize) + (offset as isize)) as usize); } Step::Continue(()) } #[inline(always)] pub(crate) fn op_jump(&mut self, 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( &mut self, 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 = self.force_and_retry::(reader, mc)?; if !assertion { // FIXME: use catchable error return self.finish_err(Error::eval_error(format!("assertion '{raw}' failed"))); } Step::Continue(()) } }