message: Avoid loops and add minor diagnostics
diff: @@ -674,13 +674,14 @@ pub enum Inst {
  impl Inst {
  /// Evaluate the current instruction against the stack.
  async fn eval(self, vm: &mut Vm, functions: &Functions, unit: &Unit) -> Result<(), VmError> {
  - loop {
  + let mut update_ip = true;
  +
  match self {
  Self::Call { hash, args } => {
  match unit.lookup(hash) {
  Some(loc) => {
  vm.push_frame(loc, args)?;
  - break;
  + update_ip = false;
  }
  None => {
  let handler = functions
  @@ -709,7 +710,7 @@ impl Inst {
  match unit.lookup(hash) {
  Some(loc) => {
  vm.push_frame(loc, args)?;
  - break;
  + update_ip = false;
  }
  None => {
  let handler = functions
  @@ -812,21 +813,18 @@ impl Inst {
  }
  Self::Jump { offset } => {
  vm.modify_ip(offset)?;
  - // NB: avoid modifying ip.
  - break;
  + update_ip = false;
  }
  Self::JumpIf { offset } => {
  if pop!(vm, Bool) {
  vm.modify_ip(offset)?;
  - // NB: avoid modifying ip.
  - break;
  + update_ip = false;
  }
  }
  Self::JumpIfNot { offset } => {
  if !pop!(vm, Bool) {
  vm.modify_ip(offset)?;
  - // NB: avoid modifying ip.
  - break;
  + update_ip = false;
  }
  }
  Self::Unit => {
  @@ -867,8 +865,8 @@ impl Inst {
  }
  }
  + if update_ip {
  vm.ip += 1;
  - break;
  }
  vm.reap()?;
  @@ -1659,17 +1657,10 @@ impl Vm {
  .pop()
  .ok_or_else(|| StackError::StackFramesEmpty)?;
  - let mut args = frame.args;
  -
  // Pop all values associated with the call frame.
  while self.stack.len() > self.frame_top {
  let popped = self.managed_pop()?;
  -
  - if args == 0 {
  - log::warn!("popped value as part of stack frame: {:?}", popped);
  - } else {
  - args -= 1;
  - }
  + log::trace!("popped local: {:?}", popped);
  }
  self.frame_top = frame.old_frame_top;
  