1
Fork 0

Rename bloom to hashes

This commit is contained in:
Dylan MacKenzie 2018-06-24 12:51:49 -07:00
parent c6aea935cf
commit 10f217159b
2 changed files with 10 additions and 10 deletions

View file

@ -148,14 +148,14 @@ type EvalSnapshot<'a, 'mir, 'tcx, M>
pub(crate) struct InfiniteLoopDetector<'a, 'mir, 'tcx: 'a + 'mir, M: Machine<'mir, 'tcx>> { pub(crate) struct InfiniteLoopDetector<'a, 'mir, 'tcx: 'a + 'mir, M: Machine<'mir, 'tcx>> {
/// The set of all `EvalSnapshot` *hashes* observed by this detector. /// The set of all `EvalSnapshot` *hashes* observed by this detector.
/// ///
/// Not a proper bloom filter. /// When a collision occurs in this table, we store the full snapshot in `snapshots`.
bloom: FxHashSet<u64>, hashes: FxHashSet<u64>,
/// The set of all `EvalSnapshot`s observed by this detector. /// The set of all `EvalSnapshot`s observed by this detector.
/// ///
/// An `EvalSnapshot` will only be fully cloned once it has caused a collision /// An `EvalSnapshot` will only be fully cloned once it has caused a collision in `hashes`. As
/// in `bloom`. As a result, the detector must observe *two* full cycles of /// a result, the detector must observe at least *two* full cycles of an infinite loop before
/// an infinite loop before it triggers. /// it triggers.
snapshots: FxHashSet<EvalSnapshot<'a, 'mir, 'tcx, M>>, snapshots: FxHashSet<EvalSnapshot<'a, 'mir, 'tcx, M>>,
} }
@ -165,7 +165,7 @@ impl<'a, 'mir, 'tcx, M> Default for InfiniteLoopDetector<'a, 'mir, 'tcx, M>
{ {
fn default() -> Self { fn default() -> Self {
InfiniteLoopDetector { InfiniteLoopDetector {
bloom: FxHashSet::default(), hashes: FxHashSet::default(),
snapshots: FxHashSet::default(), snapshots: FxHashSet::default(),
} }
} }
@ -177,7 +177,7 @@ impl<'a, 'mir, 'tcx, M> InfiniteLoopDetector<'a, 'mir, 'tcx, M>
{ {
/// Returns `true` if the loop detector has not yet observed a snapshot. /// Returns `true` if the loop detector has not yet observed a snapshot.
pub fn is_empty(&self) -> bool { pub fn is_empty(&self) -> bool {
self.bloom.is_empty() self.hashes.is_empty()
} }
pub fn observe_and_analyze( pub fn observe_and_analyze(
@ -192,7 +192,7 @@ impl<'a, 'mir, 'tcx, M> InfiniteLoopDetector<'a, 'mir, 'tcx, M>
snapshot.hash(&mut fx); snapshot.hash(&mut fx);
let hash = fx.finish(); let hash = fx.finish();
if self.bloom.insert(hash) { if self.hashes.insert(hash) {
// No collision // No collision
return Ok(()) return Ok(())
} }

View file

@ -16,10 +16,10 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
pub fn is_loop_detector_scheduled(&self) -> bool { pub fn is_loop_detector_scheduled(&self) -> bool {
/// The number of steps between loop detector snapshots. /// The number of steps between loop detector snapshots.
/// Should be a power of two for performance reasons. /// Should be a power of two for performance reasons.
const LOOP_SNAPSHOT_PERIOD: isize = 1 << 8; const DETECTOR_SNAPSHOT_PERIOD: isize = 1 << 8;
let steps = self.steps_until_detector_enabled; let steps = self.steps_until_detector_enabled;
steps <= 0 && steps % LOOP_SNAPSHOT_PERIOD == 0 steps <= 0 && steps % DETECTOR_SNAPSHOT_PERIOD == 0
} }
pub fn inc_step_counter_and_detect_loops(&mut self, n: usize) -> EvalResult<'tcx, ()> { pub fn inc_step_counter_and_detect_loops(&mut self, n: usize) -> EvalResult<'tcx, ()> {