-trait EvalContextExt<'tcx> {
- fn finish(&mut self) -> EvalResult<'tcx>;
-}
-
-impl<'a, 'tcx> EvalContextExt<'tcx> for EvalContext<'a, 'tcx, Evaluator> {
- fn finish(&mut self) -> EvalResult<'tcx> {
- let mut dtor = self.memory.fetch_tls_dtor(None)?;
- // FIXME: replace loop by some structure that works with stepping
- while let Some((instance, ptr, key)) = dtor {
- trace!("Running TLS dtor {:?} on {:?}", instance, ptr);
- // TODO: Potentially, this has to support all the other possible instances?
- // See eval_fn_call in interpret/terminator/mod.rs
- let mir = self.load_mir(instance.def)?;
- self.push_stack_frame(
- instance,
- mir.span,
- mir,
- Lvalue::undef(),
- StackPopCleanup::None,
- )?;
- let arg_local = self.frame().mir.args_iter().next().ok_or(EvalError::AbiViolation("TLS dtor does not take enough arguments.".to_owned()))?;
- let dest = self.eval_lvalue(&mir::Lvalue::Local(arg_local))?;
- let ty = self.tcx.mk_mut_ptr(self.tcx.types.u8);
- self.write_ptr(dest, ptr, ty)?;
-
- // step until out of stackframes
- while self.step()? {}
-
- dtor = match self.memory.fetch_tls_dtor(Some(key))? {
- dtor @ Some(_) => dtor,
- None => self.memory.fetch_tls_dtor(None)?,
- };
- }
- Ok(())
- }
-}
-