Skip to content

Commit 383d215

Browse files
committed
make some functions private to StackedBorrows
1 parent 9de605b commit 383d215

File tree

1 file changed

+76
-73
lines changed

1 file changed

+76
-73
lines changed

src/stacked_borrows.rs

Lines changed: 76 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,82 @@ impl<'tcx> Stacks {
516516
}
517517
}
518518

519+
impl<'a, 'mir, 'tcx> EvalContextPrivExt<'a, 'mir, 'tcx> for crate::MiriEvalContext<'a, 'mir, 'tcx> {}
520+
trait EvalContextPrivExt<'a, 'mir, 'tcx: 'a+'mir>: crate::MiriEvalContextExt<'a, 'mir, 'tcx> {
521+
fn reborrow(
522+
&mut self,
523+
place: MPlaceTy<'tcx, Borrow>,
524+
size: Size,
525+
fn_barrier: bool,
526+
new_bor: Borrow
527+
) -> EvalResult<'tcx> {
528+
let this = self.eval_context_mut();
529+
let ptr = place.ptr.to_ptr()?;
530+
let barrier = if fn_barrier { Some(this.frame().extra) } else { None };
531+
trace!("reborrow: Creating new reference for {:?} (pointee {}): {:?}",
532+
ptr, place.layout.ty, new_bor);
533+
534+
// Get the allocation. It might not be mutable, so we cannot use `get_mut`.
535+
let alloc = this.memory().get(ptr.alloc_id)?;
536+
alloc.check_bounds(this, ptr, size)?;
537+
// Update the stacks.
538+
if let Borrow::Shr(Some(_)) = new_bor {
539+
// Reference that cares about freezing. We need a frozen-sensitive reborrow.
540+
this.visit_freeze_sensitive(place, size, |cur_ptr, size, frozen| {
541+
let kind = if frozen { RefKind::Frozen } else { RefKind::Raw };
542+
alloc.extra.reborrow(cur_ptr, size, barrier, new_bor, kind)
543+
})?;
544+
} else {
545+
// Just treat this as one big chunk.
546+
let kind = if new_bor.is_unique() { RefKind::Unique } else { RefKind::Raw };
547+
alloc.extra.reborrow(ptr, size, barrier, new_bor, kind)?;
548+
}
549+
Ok(())
550+
}
551+
552+
/// Retag an indidual pointer, returning the retagged version.
553+
fn retag_reference(
554+
&mut self,
555+
val: ImmTy<'tcx, Borrow>,
556+
mutbl: Mutability,
557+
fn_barrier: bool,
558+
two_phase: bool,
559+
) -> EvalResult<'tcx, Immediate<Borrow>> {
560+
let this = self.eval_context_mut();
561+
// We want a place for where the ptr *points to*, so we get one.
562+
let place = this.ref_to_mplace(val)?;
563+
let size = this.size_and_align_of_mplace(place)?
564+
.map(|(size, _)| size)
565+
.unwrap_or_else(|| place.layout.size);
566+
if size == Size::ZERO {
567+
// Nothing to do for ZSTs.
568+
return Ok(*val);
569+
}
570+
571+
// Compute new borrow.
572+
let time = this.machine.stacked_borrows.increment_clock();
573+
let new_bor = match mutbl {
574+
MutMutable => Borrow::Uniq(time),
575+
MutImmutable => Borrow::Shr(Some(time)),
576+
};
577+
578+
// Reborrow.
579+
this.reborrow(place, size, fn_barrier, new_bor)?;
580+
let new_place = place.with_tag(new_bor);
581+
// Handle two-phase borrows.
582+
if two_phase {
583+
assert!(mutbl == MutMutable, "two-phase shared borrows make no sense");
584+
// We immediately share it, to allow read accesses
585+
let two_phase_time = this.machine.stacked_borrows.increment_clock();
586+
let two_phase_bor = Borrow::Shr(Some(two_phase_time));
587+
this.reborrow(new_place, size, /*fn_barrier*/false, two_phase_bor)?;
588+
}
589+
590+
// Return new ptr.
591+
Ok(new_place.to_ref())
592+
}
593+
}
594+
519595
impl<'a, 'mir, 'tcx> EvalContextExt<'a, 'mir, 'tcx> for crate::MiriEvalContext<'a, 'mir, 'tcx> {}
520596
pub trait EvalContextExt<'a, 'mir, 'tcx: 'a+'mir>: crate::MiriEvalContextExt<'a, 'mir, 'tcx> {
521597
fn tag_new_allocation(
@@ -601,79 +677,6 @@ pub trait EvalContextExt<'a, 'mir, 'tcx: 'a+'mir>: crate::MiriEvalContextExt<'a,
601677
Ok(())
602678
}
603679

604-
fn reborrow(
605-
&mut self,
606-
place: MPlaceTy<'tcx, Borrow>,
607-
size: Size,
608-
fn_barrier: bool,
609-
new_bor: Borrow
610-
) -> EvalResult<'tcx> {
611-
let this = self.eval_context_mut();
612-
let ptr = place.ptr.to_ptr()?;
613-
let barrier = if fn_barrier { Some(this.frame().extra) } else { None };
614-
trace!("reborrow: Creating new reference for {:?} (pointee {}): {:?}",
615-
ptr, place.layout.ty, new_bor);
616-
617-
// Get the allocation. It might not be mutable, so we cannot use `get_mut`.
618-
let alloc = this.memory().get(ptr.alloc_id)?;
619-
alloc.check_bounds(this, ptr, size)?;
620-
// Update the stacks.
621-
if let Borrow::Shr(Some(_)) = new_bor {
622-
// Reference that cares about freezing. We need a frozen-sensitive reborrow.
623-
this.visit_freeze_sensitive(place, size, |cur_ptr, size, frozen| {
624-
let kind = if frozen { RefKind::Frozen } else { RefKind::Raw };
625-
alloc.extra.reborrow(cur_ptr, size, barrier, new_bor, kind)
626-
})?;
627-
} else {
628-
// Just treat this as one big chunk.
629-
let kind = if new_bor.is_unique() { RefKind::Unique } else { RefKind::Raw };
630-
alloc.extra.reborrow(ptr, size, barrier, new_bor, kind)?;
631-
}
632-
Ok(())
633-
}
634-
635-
/// Retag an indidual pointer, returning the retagged version.
636-
fn retag_reference(
637-
&mut self,
638-
val: ImmTy<'tcx, Borrow>,
639-
mutbl: Mutability,
640-
fn_barrier: bool,
641-
two_phase: bool,
642-
) -> EvalResult<'tcx, Immediate<Borrow>> {
643-
let this = self.eval_context_mut();
644-
// We want a place for where the ptr *points to*, so we get one.
645-
let place = this.ref_to_mplace(val)?;
646-
let size = this.size_and_align_of_mplace(place)?
647-
.map(|(size, _)| size)
648-
.unwrap_or_else(|| place.layout.size);
649-
if size == Size::ZERO {
650-
// Nothing to do for ZSTs.
651-
return Ok(*val);
652-
}
653-
654-
// Compute new borrow.
655-
let time = this.machine.stacked_borrows.increment_clock();
656-
let new_bor = match mutbl {
657-
MutMutable => Borrow::Uniq(time),
658-
MutImmutable => Borrow::Shr(Some(time)),
659-
};
660-
661-
// Reborrow.
662-
this.reborrow(place, size, fn_barrier, new_bor)?;
663-
let new_place = place.with_tag(new_bor);
664-
// Handle two-phase borrows.
665-
if two_phase {
666-
assert!(mutbl == MutMutable, "two-phase shared borrows make no sense");
667-
// We immediately share it, to allow read accesses
668-
let two_phase_time = this.machine.stacked_borrows.increment_clock();
669-
let two_phase_bor = Borrow::Shr(Some(two_phase_time));
670-
this.reborrow(new_place, size, /*fn_barrier*/false, two_phase_bor)?;
671-
}
672-
673-
// Return new ptr.
674-
Ok(new_place.to_ref())
675-
}
676-
677680
fn retag(
678681
&mut self,
679682
fn_entry: bool,

0 commit comments

Comments
 (0)