Remove NO_INST and the Default+Ord impls for Inst.

Clean up comments.

Add an assertion to check that PackedOption is working as designed.
This commit is contained in:
Jakob Stoklund Olesen
2017-01-19 16:07:16 -08:00
parent 4aa5c313ea
commit 1221d94272

View File

@@ -13,15 +13,14 @@
//! The `entities` module defines public types for the entity references along with constants //! The `entities` module defines public types for the entity references along with constants
//! representing an invalid reference. We prefer to use `Option<EntityRef>` whenever possible, but //! representing an invalid reference. We prefer to use `Option<EntityRef>` whenever possible, but
//! unfortunately that type is twice as large as the 32-bit index type on its own. Thus, compact //! unfortunately that type is twice as large as the 32-bit index type on its own. Thus, compact
//! data structures use the sentinen constant, while function arguments and return values prefer //! data structures use the `PackedOption<EntityRef>` representation, while function arguments and
//! the more Rust-like `Option<EntityRef>` variant. //! return values prefer the more Rust-like `Option<EntityRef>` variant.
//! //!
//! The entity references all implement the `Display` trait in a way that matches the textual IL //! The entity references all implement the `Display` trait in a way that matches the textual IL
//! format. //! format.
use entity_map::EntityRef; use entity_map::EntityRef;
use packed_option::ReservedValue; use packed_option::ReservedValue;
use std::default::Default;
use std::fmt::{self, Display, Formatter}; use std::fmt::{self, Display, Formatter};
use std::u32; use std::u32;
@@ -67,26 +66,13 @@ entity_impl!(Ebb, "ebb");
impl Ebb { impl Ebb {
/// Create a new EBB reference from its number. This corresponds to the ebbNN representation. /// Create a new EBB reference from its number. This corresponds to the ebbNN representation.
///
/// This method is for use by the parser.
pub fn with_number(n: u32) -> Option<Ebb> { pub fn with_number(n: u32) -> Option<Ebb> {
if n < u32::MAX { Some(Ebb(n)) } else { None } if n < u32::MAX { Some(Ebb(n)) } else { None }
} }
} }
/// An opaque reference to an instruction in a function.
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)]
pub struct Inst(u32);
entity_impl!(Inst, "inst");
/// A guaranteed invalid instruction reference.
pub const NO_INST: Inst = Inst(u32::MAX);
impl Default for Inst {
fn default() -> Inst {
NO_INST
}
}
/// An opaque reference to an SSA value. /// An opaque reference to an SSA value.
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
pub struct Value(u32); pub struct Value(u32);
@@ -105,6 +91,8 @@ pub enum ExpandedValue {
impl Value { impl Value {
/// Create a `Direct` value from its number representation. /// Create a `Direct` value from its number representation.
/// This is the number in the vNN notation. /// This is the number in the vNN notation.
///
/// This method is for use by the parser.
pub fn direct_with_number(n: u32) -> Option<Value> { pub fn direct_with_number(n: u32) -> Option<Value> {
if n < u32::MAX / 2 { if n < u32::MAX / 2 {
let encoding = n * 2; let encoding = n * 2;
@@ -117,6 +105,8 @@ impl Value {
/// Create a `Table` value from its number representation. /// Create a `Table` value from its number representation.
/// This is the number in the vxNN notation. /// This is the number in the vxNN notation.
///
/// This method is for use by the parser.
pub fn table_with_number(n: u32) -> Option<Value> { pub fn table_with_number(n: u32) -> Option<Value> {
if n < u32::MAX / 2 { if n < u32::MAX / 2 {
let encoding = n * 2 + 1; let encoding = n * 2 + 1;
@@ -179,6 +169,11 @@ impl Display for Value {
} }
} }
/// An opaque reference to an instruction in a function.
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
pub struct Inst(u32);
entity_impl!(Inst, "inst");
/// An opaque reference to a stack slot. /// An opaque reference to a stack slot.
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
pub struct StackSlot(u32); pub struct StackSlot(u32);
@@ -304,4 +299,13 @@ mod tests {
}, },
u32::MAX / 2 - 1); u32::MAX / 2 - 1);
} }
#[test]
fn memory() {
use std::mem;
use packed_option::PackedOption;
// This is the whole point of `PackedOption`.
assert_eq!(mem::size_of::<Value>(),
mem::size_of::<PackedOption<Value>>());
}
} }