pub struct Policy(/* private fields */);Expand description
The complete OPS policy set, packed into five bits.
Layout: bits 0–1 overflow, bit 2 div_zero, bit 3 shift, bit 4
float_to_int; bits 5–7 are zero. An instruction carries the whole set
even when only part of it can apply (an iadd never divides), so a code
generator stamps one policy per language and type onto every instruction
and the semantics pick the part they need. The default is all-error,
the OPS default.
§Examples
use bytecode_lang::{Overflow, Policy, Shift};
let p = Policy::new().with_overflow(Overflow::Wrap).with_shift(Shift::Mask);
assert_eq!(p.overflow(), Overflow::Wrap);
assert_eq!(p.shift(), Shift::Mask);
assert_eq!(p.to_string(), "wrap.mask");
assert_eq!(Policy::from_bits(p.bits()), Some(p));
assert_eq!(Policy::from_bits(0b11).map(|p| p.overflow()), Some(Overflow::Promote));
assert_eq!(Policy::from_bits(0b10_0000), None); // bit 5 is reservedImplementations§
Source§impl Policy
impl Policy
Sourcepub const fn new() -> Self
pub const fn new() -> Self
The OPS defaults: every policy is error.
§Examples
use bytecode_lang::{Overflow, Policy};
assert_eq!(Policy::new().overflow(), Overflow::Error);Sourcepub const fn overflow(self) -> Overflow
pub const fn overflow(self) -> Overflow
The overflow policy.
§Examples
use bytecode_lang::{Overflow, Policy};
assert_eq!(Policy::new().with_overflow(Overflow::Trap).overflow(), Overflow::Trap);Sourcepub const fn div_zero(self) -> DivZero
pub const fn div_zero(self) -> DivZero
The div_zero policy.
§Examples
use bytecode_lang::{DivZero, Policy};
assert_eq!(Policy::new().with_div_zero(DivZero::Trap).div_zero(), DivZero::Trap);Sourcepub const fn shift(self) -> Shift
pub const fn shift(self) -> Shift
The shift policy.
§Examples
use bytecode_lang::{Policy, Shift};
assert_eq!(Policy::new().with_shift(Shift::Mask).shift(), Shift::Mask);Sourcepub const fn float_to_int(self) -> FloatToInt
pub const fn float_to_int(self) -> FloatToInt
The float_to_int policy.
§Examples
use bytecode_lang::{FloatToInt, Policy};
let p = Policy::new().with_float_to_int(FloatToInt::Saturate);
assert_eq!(p.float_to_int(), FloatToInt::Saturate);Sourcepub const fn with_overflow(self, overflow: Overflow) -> Self
pub const fn with_overflow(self, overflow: Overflow) -> Self
This policy with overflow replaced.
§Examples
use bytecode_lang::{Overflow, Policy};
assert_eq!(Policy::new().with_overflow(Overflow::Wrap).to_string(), "wrap");Sourcepub const fn with_div_zero(self, div_zero: DivZero) -> Self
pub const fn with_div_zero(self, div_zero: DivZero) -> Self
This policy with div_zero replaced.
§Examples
use bytecode_lang::{DivZero, Policy};
assert_eq!(Policy::new().with_div_zero(DivZero::Trap).to_string(), "divtrap");Sourcepub const fn with_shift(self, shift: Shift) -> Self
pub const fn with_shift(self, shift: Shift) -> Self
This policy with shift replaced.
§Examples
use bytecode_lang::{Policy, Shift};
assert_eq!(Policy::new().with_shift(Shift::Mask).to_string(), "mask");Sourcepub const fn with_float_to_int(self, float_to_int: FloatToInt) -> Self
pub const fn with_float_to_int(self, float_to_int: FloatToInt) -> Self
This policy with float_to_int replaced.
§Examples
use bytecode_lang::{FloatToInt, Policy};
let p = Policy::new().with_float_to_int(FloatToInt::Saturate);
assert_eq!(p.to_string(), "sat");Sourcepub const fn from_bits(bits: u8) -> Option<Self>
pub const fn from_bits(bits: u8) -> Option<Self>
Unpacks a policy, or None if a reserved bit (5–7) is set. Every
5-bit value names a policy.
§Examples
use bytecode_lang::Policy;
assert!(Policy::from_bits(0b1_1111).is_some());
assert!(Policy::from_bits(0b10_0000).is_none());Sourcepub const fn is_default(self) -> bool
pub const fn is_default(self) -> bool
Whether every policy is the OPS default (error).
§Examples
use bytecode_lang::{Overflow, Policy};
assert!(Policy::new().is_default());
assert!(!Policy::new().with_overflow(Overflow::Wrap).is_default());Trait Implementations§
impl Copy for Policy
Source§impl Display for Policy
Prints only the policies that differ from the default, joined by .:
wrap / trap / promote (overflow), divtrap, mask, sat. The default policy
prints as the empty string.
impl Display for Policy
Prints only the policies that differ from the default, joined by .:
wrap / trap / promote (overflow), divtrap, mask, sat. The default policy
prints as the empty string.