pub struct Policy(/* private fields */);Expand description
The complete OPS policy set, packed into six bits: the modifier byte of
every dynamic arithmetic instruction (dadd, dshl, dpow, …).
Layout: bits 0–1 overflow, bit 2 div_zero, bits 3–4 shift (the
value 3 is reserved), bit 5 float_to_int; bits 6–7 are zero. An
instruction carries the whole set even when only part of it can apply (a
dadd never shifts), so a code generator stamps one policy per language
onto every instruction and the semantics pick the part they need. The
default is all-error, the OPS default. (Typed integer instructions carry
an IntOp, which has room for every part but float_to_int; the
float-to-integer conversions carry a FloatConv.)
§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(0b1_1000), None); // shift code 3 is reserved
assert_eq!(Policy::from_bits(0b100_0000), None); // bit 6 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);
assert_eq!(Policy::new().with_shift(Shift::Saturate).shift(), Shift::Saturate);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 (6–7) is set or the
shift field holds the reserved code 3. 48 of the 64 six-bit values
name a policy.
§Examples
use bytecode_lang::Policy;
assert!(Policy::from_bits(0b11_0111).is_some());
assert!(Policy::from_bits(0b01_1000).is_none());
assert!(Policy::from_bits(0b100_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 / shsat (shift),
sat (float-to-int). 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 / shsat (shift),
sat (float-to-int). The default policy prints as the empty string.