#![forbid(unsafe_code)]
#![deny(missing_docs)]
mod admission;
mod code;
mod driver;
mod frame;
mod managed;
mod shuffle;
mod slots;
mod stack;
pub use admission::{
AdmissionError, AdmissionLimits, AdmissionPolicy, MachineDescription, MachinePermit,
};
pub use driver::{
ContinuationEvidence, DriveError, DriveOutcome, DriveResult, Driver, InstructionDriverPolicy,
LocatedFault, MachineAbrupt, MachineCheckpoint, MachineFrame, MachineUnwind, PolicyStep,
SafepointDriveError, StepKind, StepOutcome, WorkReceipt,
};
pub use frame::{
CallTransfer, Frame, FrameStack, FrameStackError, ReturnTransfer, Transfer, TransferError,
};
pub use managed::{ManagedRootSource, RootScanError, RootSnapshot};
pub use shuffle::{ShuffleError, ShufflePlan};
pub use slots::{SlotError, SlotFile};
pub use stack::{StackError, UnitStack};
pub trait InstructionPolicy {
type Instruction;
type InstructionId: Copy + Eq + Ord;
fn instruction_id(instruction: &Self::Instruction) -> Self::InstructionId;
}
pub trait ValueWidthPolicy {
type Value;
fn width(value: &Self::Value) -> usize;
}
pub trait EffectPolicy<I> {
type Effect;
fn classify(instruction: &I) -> Self::Effect;
}
pub trait FramePolicy {
type Frame;
type CallableId: Copy + Eq + Ord;
fn callable(frame: &Self::Frame) -> Self::CallableId;
}
pub trait HandlerPolicy<I> {
type HandlerId: Copy + Eq + Ord;
type Abrupt;
fn handler_for(instruction: I, abrupt: &Self::Abrupt) -> Option<Self::HandlerId>;
}
pub trait RootPolicy<S> {
type Root;
fn visit_roots(state: &S, visit: impl FnMut(&Self::Root));
}
pub trait SafepointPolicy<I> {
fn is_safepoint(instruction: &I) -> bool;
}
pub trait ReceiptPolicy<E> {
type Receipt;
fn receipt(evidence: E) -> Self::Receipt;
}
pub use code::{
BranchTarget, CodeCursor, CodeError, CoverageMetadata, LocatedCode, LocatedInstruction,
ProtectedRegion, RegionSpec, SourceLocation, TargetLocation,
};