message: Make execution 33% faster by inlining the execution loop in the future
diff: @@ -1588,12 +1588,17 @@ impl Vm {
  }
  /// Evaluate a single instruction.
  - pub async fn eval(
  + pub async fn run_for(
  &mut self,
  - inst: &Inst,
  context: &Context,
  unit: &Unit,
  + mut limit: Option<usize>,
  ) -> Result<(), VmError> {
  + while !self.exited {
  + let inst = unit
  + .instruction_at(self.ip)
  + .ok_or_else(|| VmError::IpOutOfBounds)?;
  +
  let mut update_ip = true;
  match inst {
  @@ -1848,6 +1853,16 @@ impl Vm {
  }
  self.reap()?;
  +
  + if let Some(limit) = &mut limit {
  + if *limit <= 1 {
  + break;
  + }
  +
  + *limit -= 1;
  + }
  + }
  +
  Ok(())
  }
  }
  @@ -1896,12 +1911,7 @@ where
  /// Run the given task to completion.
  pub async fn run_to_completion(self) -> Result<T, VmError> {
  while !self.vm.exited {
  - let inst = self
  - .unit
  - .instruction_at(self.vm.ip())
  - .ok_or_else(|| VmError::IpOutOfBounds)?;
  -
  - self.vm.eval(inst, self.context, self.unit).await?;
  + self.vm.run_for(self.context, self.unit, None).await?;
  }
  let value = self.vm.pop_decode()?;
  @@ -1911,12 +1921,7 @@ where
  /// Step the given task until the return value is available.
  pub async fn step(&mut self) -> Result<Option<T>, VmError> {
  - let inst = self
  - .unit
  - .instruction_at(self.vm.ip())
  - .ok_or_else(|| VmError::IpOutOfBounds)?;
  -
  - self.vm.eval(inst, self.context, self.unit).await?;
  + self.vm.run_for(self.context, self.unit, Some(1)).await?;
  if self.vm.exited {
  let value = self.vm.pop_decode()?;
  