Enum Type
pub enum Type {
Show 22 variants
Unknown,
Never,
I1,
I8,
U8,
I16,
U16,
I32,
U32,
I64,
U64,
I128,
U128,
U256,
F64,
Felt,
Ptr(Arc<PointerType>),
Struct(Arc<StructType>),
Enum(Arc<EnumType>),
Array(Arc<ArrayType>),
List(Arc<Type>),
Function(Arc<FunctionType>),
}Expand description
Represents the type of a value in the HIR type system
Variants§
Unknown
This indicates a failure to type a value, or a value which is untypable
Never
This type is the bottom type, and represents divergence, akin to Rust’s Never/! type
I1
A 1-bit integer, i.e. a boolean value.
When the bit is 1, the value is true; 0 is false.
I8
An 8-bit signed integer.
U8
An 8-bit unsigned integer.
I16
A 16-bit signed integer.
U16
A 16-bit unsigned integer.
I32
A 32-bit signed integer.
U32
A 32-bit unsigned integer.
I64
A 64-bit signed integer.
U64
A 64-bit unsigned integer.
I128
A 128-bit signed integer.
U128
A 128-bit unsigned integer.
U256
A 256-bit unsigned integer.
F64
A 64-bit IEEE-754 floating-point value.
NOTE: These are currently unsupported in practice, but is reserved here for future use.
Felt
A field element corresponding to the native Miden field (currently the Goldilocks field)
Ptr(Arc<PointerType>)
A pointer to a value in a byte-addressable address space.
Pointers of this type are not equivalent to element addresses as referred to in the Miden Assembly documentation, but do have a straightforward conversion.
Struct(Arc<StructType>)
A compound type of fixed shape and size
Enum(Arc<EnumType>)
A tagged type enumeration with a fixed number of variants
Array(Arc<ArrayType>)
A vector of fixed size
List(Arc<Type>)
A dynamically sized list of values of the given type
NOTE: Currently this only exists to support the Wasm Canonical ABI, but it has no defined represenation yet, so in practice cannot be used in most places except during initial translation in the Wasm frontend.
Function(Arc<FunctionType>)
A reference to a function with the given type signature
Implementations§
§impl Type
impl Type
pub fn to_raw_parts(self) -> Option<SmallVec<[Type; 4]>>
pub fn to_raw_parts(self) -> Option<SmallVec<[Type; 4]>>
Convert this type into a vector of types corresponding to how this type will be represented in memory.
The largest “part” size is 32 bits, so types that fit in 32 bits remain unchanged. For types larger than 32 bits, they will be broken up into parts that do fit in 32 bits, preserving accurate types to the extent possible. For types smaller than 32 bits, they will be merged into packed structs no larger than 32 bits, to preserve the type information, and make it possible to reason about how to extract parts of the original type.
For an example, a struct of type { *ptr, u8, u8 } will be encoded on the
operand stack as [*ptr, {u8, u8}], where the first value is the 32-bit pointer
field, and the remaining fields are encoded as a 16-bit struct in the second value.
pub fn split(self, n: usize) -> (Type, Option<Type>)
pub fn split(self, n: usize) -> (Type, Option<Type>)
Split this type into two parts:
- The first part is no more than
nbytes in size, and may contain the type itself if it fits - The second part is None if the first part is smaller than or equal in size to the requested split size
- The second part is Some if there is data left in the original type after the split. This part will be a type that attempts to preserve, to the extent possible, the original type structure, but will fall back to an array of bytes if a larger type must be split down the middle somewhere.
pub fn min_alignment(&self) -> usize
pub fn min_alignment(&self) -> usize
Returns the minimum alignment, in bytes, of this type
pub fn size_in_bits(&self) -> usize
pub fn size_in_bits(&self) -> usize
Returns the size in bits of this type, without alignment padding.
pub fn size_in_bytes(&self) -> usize
pub fn size_in_bytes(&self) -> usize
Returns the minimum number of bytes required to store a value of this type
pub fn aligned_size_in_bytes(&self) -> usize
pub fn aligned_size_in_bytes(&self) -> usize
Same as size_in_bytes, but with sufficient padding to guarantee alignment of the value.
pub fn size_in_felts(&self) -> usize
pub fn size_in_felts(&self) -> usize
Returns the size in field elements of this type
pub fn size_in_words(&self) -> usize
pub fn size_in_words(&self) -> usize
Returns the size in words of this type
pub fn is_loadable(&self) -> bool
pub fn is_loadable(&self) -> bool
Returns true if this type can be loaded on to the operand stack
The rule for “loadability” is a bit arbitrary, but the purpose is to force users of the IR to either pass large values by reference, or calculate the addresses of the individual fields needed from a large structure or array, and issue loads/stores against those instead.
In effect, we reject loads of values that are larger than a single word, as that is the largest value which can be worked with on the operand stack of the Miden VM.
§impl Type
impl Type
pub fn is_zst(&self) -> bool
pub fn is_zst(&self) -> bool
Returns true if this type is a zero-sized type, which includes:
- Types with no size, e.g.
Never - Zero-sized arrays
- Arrays with a zero-sized element type
- Structs composed of nothing but zero-sized fields
pub fn is_numeric(&self) -> bool
pub fn is_numeric(&self) -> bool
Returns true if this type is any numeric type
pub fn is_integer(&self) -> bool
pub fn is_integer(&self) -> bool
Returns true if this type is any integral type
pub fn is_signed_integer(&self) -> bool
pub fn is_signed_integer(&self) -> bool
Returns true if this type is any signed integral type
pub fn is_unsigned_integer(&self) -> bool
pub fn is_unsigned_integer(&self) -> bool
Returns true if this type is any unsigned integral type
pub fn as_unsigned(&self) -> Type
pub fn as_unsigned(&self) -> Type
Get this type as its unsigned integral twin, e.g. i32 becomes u32.
This function will panic if the type is not an integer type, or has no unsigned representation
pub fn as_signed(&self) -> Type
pub fn as_signed(&self) -> Type
Get this type as its signed integral twin, e.g. u32 becomes i32.
This function will panic if the type is not an integer type, or has no signed representation
pub fn is_pointer(&self) -> bool
pub fn is_pointer(&self) -> bool
Returns true if this type is a pointer type
pub fn pointee(&self) -> Option<&Type>
pub fn pointee(&self) -> Option<&Type>
Returns the type of the pointee, if this type is a pointer type
pub fn is_function(&self) -> bool
pub fn is_function(&self) -> bool
Returns true if this type is a function reference type
Trait Implementations§
§impl Deserializable for Type
impl Deserializable for Type
§fn read_from<R>(source: &mut R) -> Result<Type, DeserializationError>where
R: ByteReader,
fn read_from<R>(source: &mut R) -> Result<Type, DeserializationError>where
R: ByteReader,
source, attempts to deserialize these bytes
into Self, and returns the result. Read more§fn min_serialized_size() -> usize
fn min_serialized_size() -> usize
§fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
§fn read_from_bytes_with_budget(
bytes: &[u8],
budget: usize,
) -> Result<Self, DeserializationError>
fn read_from_bytes_with_budget( bytes: &[u8], budget: usize, ) -> Result<Self, DeserializationError>
Self from bytes with a byte budget limit. Read more§impl<'de> Deserialize<'de> for Type
impl<'de> Deserialize<'de> for Type
§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Type, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Type, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
§impl From<Arc<FunctionType>> for Type
impl From<Arc<FunctionType>> for Type
§fn from(ty: Arc<FunctionType>) -> Type
fn from(ty: Arc<FunctionType>) -> Type
§impl From<Arc<PointerType>> for Type
impl From<Arc<PointerType>> for Type
§fn from(ty: Arc<PointerType>) -> Type
fn from(ty: Arc<PointerType>) -> Type
§impl From<Arc<StructType>> for Type
impl From<Arc<StructType>> for Type
§fn from(ty: Arc<StructType>) -> Type
fn from(ty: Arc<StructType>) -> Type
§impl From<Box<FunctionType>> for Type
impl From<Box<FunctionType>> for Type
§fn from(ty: Box<FunctionType>) -> Type
fn from(ty: Box<FunctionType>) -> Type
§impl From<Box<PointerType>> for Type
impl From<Box<PointerType>> for Type
§fn from(ty: Box<PointerType>) -> Type
fn from(ty: Box<PointerType>) -> Type
§impl From<Box<StructType>> for Type
impl From<Box<StructType>> for Type
§fn from(ty: Box<StructType>) -> Type
fn from(ty: Box<StructType>) -> Type
§impl From<FunctionType> for Type
impl From<FunctionType> for Type
§fn from(ty: FunctionType) -> Type
fn from(ty: FunctionType) -> Type
§impl From<PointerType> for Type
impl From<PointerType> for Type
§fn from(ty: PointerType) -> Type
fn from(ty: PointerType) -> Type
§impl From<StructType> for Type
impl From<StructType> for Type
§fn from(ty: StructType) -> Type
fn from(ty: StructType) -> Type
§impl From<Type> for NameAndType
impl From<Type> for NameAndType
§fn from(ty: Type) -> NameAndType
fn from(ty: Type) -> NameAndType
§impl PrettyPrint for Type
impl PrettyPrint for Type
§fn to_pretty_string(&self) -> String
fn to_pretty_string(&self) -> String
§fn pretty_print(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn pretty_print(&self, f: &mut Formatter<'_>) -> Result<(), Error>
§impl Serializable for Type
Provides Type serialization support via the miden-serde-utils serializer.
impl Serializable for Type
Provides Type serialization support via the miden-serde-utils serializer.
This is a temporary implementation to allow type information to be serialized with libraries,
but in a future release we’ll either rely on the serde serialization for these types, or
provide the serialization implementation in midenc-hir-type instead
§fn write_into<W>(&self, target: &mut W)where
W: ByteWriter,
fn write_into<W>(&self, target: &mut W)where
W: ByteWriter,
self into bytes and writes these bytes into the target.§fn get_size_hint(&self) -> usize
fn get_size_hint(&self) -> usize
§impl Serialize for Type
impl Serialize for Type
§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
§impl TryFrom<Type> for StructType
impl TryFrom<Type> for StructType
impl Eq for Type
impl StructuralPartialEq for Type
Auto Trait Implementations§
impl Freeze for Type
impl RefUnwindSafe for Type
impl Send for Type
impl Sync for Type
impl Unpin for Type
impl UnsafeUnpin for Type
impl UnwindSafe for Type
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<D> OwoColorize for D
impl<D> OwoColorize for D
§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg] or
a color-specific method, such as [OwoColorize::green], Read more§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg] or
a color-specific method, such as [OwoColorize::on_yellow], Read more