Auto merge of #2171 - RalfJung:less-dup, r=RalfJung
reduce some code duplication `@saethlin` this is what I meant. I had to fiddle a bit to make the lifetimes work, but now it passes rustc. :)
This commit is contained in:
commit
1c11fc64b1
@ -810,12 +810,12 @@ pub fn current_span(&self) -> CurrentSpan<'_, 'mir, 'tcx> {
|
|||||||
/// topmost frame which corresponds to a local crate, and returns the current span in that frame.
|
/// topmost frame which corresponds to a local crate, and returns the current span in that frame.
|
||||||
/// The result of that search is cached so that later calls are approximately free.
|
/// The result of that search is cached so that later calls are approximately free.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct CurrentSpan<'a, 'tcx, 'mir> {
|
pub struct CurrentSpan<'a, 'mir, 'tcx> {
|
||||||
span: Option<Span>,
|
span: Option<Span>,
|
||||||
machine: &'a Evaluator<'tcx, 'mir>,
|
machine: &'a Evaluator<'mir, 'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx, 'mir> CurrentSpan<'a, 'tcx, 'mir> {
|
impl<'a, 'mir, 'tcx> CurrentSpan<'a, 'mir, 'tcx> {
|
||||||
pub fn get(&mut self) -> Span {
|
pub fn get(&mut self) -> Span {
|
||||||
*self.span.get_or_insert_with(|| Self::current_span(&self.machine))
|
*self.span.get_or_insert_with(|| Self::current_span(&self.machine))
|
||||||
}
|
}
|
||||||
|
@ -705,6 +705,30 @@ fn reborrow(
|
|||||||
protect: bool,
|
protect: bool,
|
||||||
) -> InterpResult<'tcx> {
|
) -> InterpResult<'tcx> {
|
||||||
let this = self.eval_context_mut();
|
let this = self.eval_context_mut();
|
||||||
|
let current_span = &mut this.machine.current_span();
|
||||||
|
|
||||||
|
let log_creation = |this: &MiriEvalContext<'mir, 'tcx>,
|
||||||
|
current_span: &mut CurrentSpan<'_, 'mir, 'tcx>,
|
||||||
|
alloc_id,
|
||||||
|
base_offset,
|
||||||
|
orig_tag|
|
||||||
|
-> InterpResult<'tcx> {
|
||||||
|
let extra = this.get_alloc_extra(alloc_id)?;
|
||||||
|
let stacked_borrows =
|
||||||
|
extra.stacked_borrows.as_ref().expect("we should have Stacked Borrows data");
|
||||||
|
let mut alloc_history = stacked_borrows.history.borrow_mut();
|
||||||
|
alloc_history.log_creation(
|
||||||
|
Some(orig_tag),
|
||||||
|
new_tag,
|
||||||
|
alloc_range(base_offset, size),
|
||||||
|
current_span,
|
||||||
|
);
|
||||||
|
if protect {
|
||||||
|
alloc_history.log_protector(orig_tag, new_tag, current_span);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
};
|
||||||
|
|
||||||
if size == Size::ZERO {
|
if size == Size::ZERO {
|
||||||
// Don't update any stacks for a zero-sized access; borrow stacks are per-byte and this
|
// Don't update any stacks for a zero-sized access; borrow stacks are per-byte and this
|
||||||
// touches no bytes so there is no stack to put this tag in.
|
// touches no bytes so there is no stack to put this tag in.
|
||||||
@ -714,16 +738,7 @@ fn reborrow(
|
|||||||
// Dangling slices are a common case here; it's valid to get their length but with raw
|
// Dangling slices are a common case here; it's valid to get their length but with raw
|
||||||
// pointer tagging for example all calls to get_unchecked on them are invalid.
|
// pointer tagging for example all calls to get_unchecked on them are invalid.
|
||||||
if let Ok((alloc_id, base_offset, orig_tag)) = this.ptr_try_get_alloc_id(place.ptr) {
|
if let Ok((alloc_id, base_offset, orig_tag)) = this.ptr_try_get_alloc_id(place.ptr) {
|
||||||
let extra = this.get_alloc_extra(alloc_id)?;
|
log_creation(this, current_span, alloc_id, base_offset, orig_tag)?;
|
||||||
let stacked_borrows =
|
|
||||||
extra.stacked_borrows.as_ref().expect("we should have Stacked Borrows data");
|
|
||||||
let mut alloc_history = stacked_borrows.history.borrow_mut();
|
|
||||||
alloc_history.log_creation(
|
|
||||||
Some(orig_tag),
|
|
||||||
new_tag,
|
|
||||||
alloc_range(base_offset, Size::ZERO),
|
|
||||||
&mut this.machine.current_span(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trace!(
|
trace!(
|
||||||
@ -736,23 +751,7 @@ fn reborrow(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
let (alloc_id, base_offset, orig_tag) = this.ptr_get_alloc_id(place.ptr)?;
|
let (alloc_id, base_offset, orig_tag) = this.ptr_get_alloc_id(place.ptr)?;
|
||||||
|
log_creation(this, current_span, alloc_id, base_offset, orig_tag)?;
|
||||||
let mut current_span = this.machine.current_span();
|
|
||||||
{
|
|
||||||
let extra = this.get_alloc_extra(alloc_id)?;
|
|
||||||
let stacked_borrows =
|
|
||||||
extra.stacked_borrows.as_ref().expect("we should have Stacked Borrows data");
|
|
||||||
let mut alloc_history = stacked_borrows.history.borrow_mut();
|
|
||||||
alloc_history.log_creation(
|
|
||||||
Some(orig_tag),
|
|
||||||
new_tag,
|
|
||||||
alloc_range(base_offset, size),
|
|
||||||
&mut current_span,
|
|
||||||
);
|
|
||||||
if protect {
|
|
||||||
alloc_history.log_protector(orig_tag, new_tag, &mut current_span);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure we bail out if the pointer goes out-of-bounds (see miri#1050).
|
// Ensure we bail out if the pointer goes out-of-bounds (see miri#1050).
|
||||||
let (alloc_size, _) =
|
let (alloc_size, _) =
|
||||||
@ -819,7 +818,7 @@ fn reborrow(
|
|||||||
item,
|
item,
|
||||||
(alloc_id, range, offset),
|
(alloc_id, range, offset),
|
||||||
&mut *global,
|
&mut *global,
|
||||||
&mut current_span,
|
current_span,
|
||||||
history,
|
history,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -836,14 +835,14 @@ fn reborrow(
|
|||||||
let item = Item { perm, tag: new_tag, protector };
|
let item = Item { perm, tag: new_tag, protector };
|
||||||
let range = alloc_range(base_offset, size);
|
let range = alloc_range(base_offset, size);
|
||||||
let mut global = machine.stacked_borrows.as_ref().unwrap().borrow_mut();
|
let mut global = machine.stacked_borrows.as_ref().unwrap().borrow_mut();
|
||||||
let mut current_span = machine.current_span();
|
let current_span = &mut machine.current_span(); // `get_alloc_extra_mut` invalidated our old `current_span`
|
||||||
stacked_borrows.for_each_mut(range, |offset, stack, history| {
|
stacked_borrows.for_each_mut(range, |offset, stack, history| {
|
||||||
stack.grant(
|
stack.grant(
|
||||||
orig_tag,
|
orig_tag,
|
||||||
item,
|
item,
|
||||||
(alloc_id, range, offset),
|
(alloc_id, range, offset),
|
||||||
&mut global,
|
&mut global,
|
||||||
&mut current_span,
|
current_span,
|
||||||
history,
|
history,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
Loading…
Reference in New Issue
Block a user