Skip to content

Commit 9de605b

Browse files
committed
avoid repeating signatures in EvalContext extension traits
1 parent 4f61314 commit 9de605b

File tree

6 files changed

+352
-412
lines changed

6 files changed

+352
-412
lines changed

src/fn_call.rs

Lines changed: 160 additions & 177 deletions
Large diffs are not rendered by default.

src/helpers.rs

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,43 +30,31 @@ impl<Tag> ScalarExt for ScalarMaybeUndef<Tag> {
3030
}
3131
}
3232

33-
pub trait EvalContextExt<'tcx> {
34-
fn resolve_path(&self, path: &[&str]) -> EvalResult<'tcx, ty::Instance<'tcx>>;
35-
36-
/// Visit the memory covered by `place`, sensitive to freezing: The 3rd parameter
37-
/// will be true if this is frozen, false if this is in an `UnsafeCell`.
38-
fn visit_freeze_sensitive(
39-
&self,
40-
place: MPlaceTy<'tcx, Borrow>,
41-
size: Size,
42-
action: impl FnMut(Pointer<Borrow>, Size, bool) -> EvalResult<'tcx>,
43-
) -> EvalResult<'tcx>;
44-
}
45-
46-
47-
impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for EvalContext<'a, 'mir, 'tcx, super::Evaluator<'tcx>> {
33+
impl<'a, 'mir, 'tcx> EvalContextExt<'a, 'mir, 'tcx> for crate::MiriEvalContext<'a, 'mir, 'tcx> {}
34+
pub trait EvalContextExt<'a, 'mir, 'tcx: 'a+'mir>: crate::MiriEvalContextExt<'a, 'mir, 'tcx> {
4835
/// Get an instance for a path.
4936
fn resolve_path(&self, path: &[&str]) -> EvalResult<'tcx, ty::Instance<'tcx>> {
50-
self.tcx
37+
let this = self.eval_context_ref();
38+
this.tcx
5139
.crates()
5240
.iter()
53-
.find(|&&krate| self.tcx.original_crate_name(krate) == path[0])
41+
.find(|&&krate| this.tcx.original_crate_name(krate) == path[0])
5442
.and_then(|krate| {
5543
let krate = DefId {
5644
krate: *krate,
5745
index: CRATE_DEF_INDEX,
5846
};
59-
let mut items = self.tcx.item_children(krate);
47+
let mut items = this.tcx.item_children(krate);
6048
let mut path_it = path.iter().skip(1).peekable();
6149

6250
while let Some(segment) = path_it.next() {
6351
for item in mem::replace(&mut items, Default::default()).iter() {
6452
if item.ident.name == *segment {
6553
if path_it.peek().is_none() {
66-
return Some(ty::Instance::mono(self.tcx.tcx, item.def.def_id()));
54+
return Some(ty::Instance::mono(this.tcx.tcx, item.def.def_id()));
6755
}
6856

69-
items = self.tcx.item_children(item.def.def_id());
57+
items = this.tcx.item_children(item.def.def_id());
7058
break;
7159
}
7260
}
@@ -79,15 +67,18 @@ impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for EvalContext<'a, 'mir, 'tcx, super:
7967
})
8068
}
8169

70+
/// Visit the memory covered by `place`, sensitive to freezing: The 3rd parameter
71+
/// will be true if this is frozen, false if this is in an `UnsafeCell`.
8272
fn visit_freeze_sensitive(
8373
&self,
8474
place: MPlaceTy<'tcx, Borrow>,
8575
size: Size,
8676
mut action: impl FnMut(Pointer<Borrow>, Size, bool) -> EvalResult<'tcx>,
8777
) -> EvalResult<'tcx> {
78+
let this = self.eval_context_ref();
8879
trace!("visit_frozen(place={:?}, size={:?})", *place, size);
8980
debug_assert_eq!(size,
90-
self.size_and_align_of_mplace(place)?
81+
this.size_and_align_of_mplace(place)?
9182
.map(|(size, _)| size)
9283
.unwrap_or_else(|| place.layout.size)
9384
);
@@ -106,8 +97,8 @@ impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for EvalContext<'a, 'mir, 'tcx, super:
10697
}
10798
// We assume that we are given the fields in increasing offset order,
10899
// and nothing else changes.
109-
let unsafe_cell_offset = unsafe_cell_ptr.get_ptr_offset(self);
110-
let end_offset = end_ptr.get_ptr_offset(self);
100+
let unsafe_cell_offset = unsafe_cell_ptr.get_ptr_offset(this);
101+
let end_offset = end_ptr.get_ptr_offset(this);
111102
assert!(unsafe_cell_offset >= end_offset);
112103
let frozen_size = unsafe_cell_offset - end_offset;
113104
// Everything between the end_ptr and this `UnsafeCell` is frozen.
@@ -119,18 +110,18 @@ impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for EvalContext<'a, 'mir, 'tcx, super:
119110
action(unsafe_cell_ptr.to_ptr()?, unsafe_cell_size, /*frozen*/false)?;
120111
}
121112
// Update end end_ptr.
122-
end_ptr = unsafe_cell_ptr.ptr_wrapping_offset(unsafe_cell_size, self);
113+
end_ptr = unsafe_cell_ptr.ptr_wrapping_offset(unsafe_cell_size, this);
123114
// Done
124115
Ok(())
125116
};
126117
// Run a visitor
127118
{
128119
let mut visitor = UnsafeCellVisitor {
129-
ecx: self,
120+
ecx: this,
130121
unsafe_cell_action: |place| {
131122
trace!("unsafe_cell_action on {:?}", place.ptr);
132123
// We need a size to go on.
133-
let unsafe_cell_size = self.size_and_align_of_mplace(place)?
124+
let unsafe_cell_size = this.size_and_align_of_mplace(place)?
134125
.map(|(size, _)| size)
135126
// for extern types, just cover what we can
136127
.unwrap_or_else(|| place.layout.size);
@@ -146,7 +137,7 @@ impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for EvalContext<'a, 'mir, 'tcx, super:
146137
}
147138
// The part between the end_ptr and the end of the place is also frozen.
148139
// So pretend there is a 0-sized `UnsafeCell` at the end.
149-
unsafe_cell_action(place.ptr.ptr_wrapping_offset(size, self), Size::ZERO)?;
140+
unsafe_cell_action(place.ptr.ptr_wrapping_offset(size, this), Size::ZERO)?;
150141
// Done!
151142
return Ok(());
152143

0 commit comments

Comments
 (0)