#[inline(never)]
#[cold]
- fn report(&self, e: &EvalError) {
+ fn report(&self, e: EvalError) {
let stmt = self.frame().stmt;
let block = self.basic_block();
let span = if stmt < block.statements.len() {
err.emit();
}
- fn maybe_report<T>(&self, r: EvalResult<T>) -> EvalResult<T> {
- if let Err(ref e) = r {
- self.report(e);
- }
- r
- }
-
fn run(&mut self) -> EvalResult<()> {
let mut stepper = stepper::Stepper::new(self);
while stepper.step()? {}
gecx.memory.dump(return_ptr.alloc_id);
},
Ok(None) => warn!("diverging function returned"),
- Err(_e) => {
- // TODO(solson): Detect whether the error was already reported or not.
- // tcx.sess.err(&e.to_string());
- }
+ Err(e) => gecx.report(e),
}
}
}
fn statement(&mut self, stmt: &mir::Statement<'tcx>) -> EvalResult<()> {
trace!("{:?}", stmt);
let mir::StatementKind::Assign(ref lvalue, ref rvalue) = stmt.kind;
- let result = self.gecx.eval_assignment(lvalue, rvalue);
- self.gecx.maybe_report(result)?;
+ self.gecx.eval_assignment(lvalue, rvalue)?;
self.gecx.frame_mut().stmt += 1;
Ok(())
}
// after a terminator we go to a new block
self.gecx.frame_mut().stmt = 0;
trace!("{:?}", terminator.kind);
- let result = self.gecx.eval_terminator(terminator);
- self.gecx.maybe_report(result)?;
+ self.gecx.eval_terminator(terminator)?;
if !self.gecx.stack.is_empty() {
trace!("// {:?}", self.gecx.frame().next_block);
}