cranelift_wasm::wasmparser

Struct BinaryReader

source
pub struct BinaryReader<'a> { /* private fields */ }
Expand description

A binary reader of the WebAssembly structures and types.

Implementations§

source§

impl<'a> BinaryReader<'a>

source

pub fn new( data: &[u8], original_offset: usize, features: WasmFeatures, ) -> BinaryReader<'_>

Creates a new binary reader which will parse the data provided.

The original_offset provided is used for byte offsets in errors that are generated. That offset is added to the current position in data. This can be helpful when data is just a window of a view into a larger wasm binary perhaps not even entirely stored locally.

The features argument provided controls which WebAssembly features are active when parsing this data. Wasm features typically don’t affect parsing too too much and are generally more applicable during validation, but features and proposals will often reinterpret previously-invalid constructs as now-valid things meaning something slightly different. This means that invalid bytes before a feature may now be interpreted differently after a feature is implemented. This means that the set of activated features can affect what errors are generated and when they are generated.

In general it’s safe to pass WasmFeatures::all() here. There’s no downside to enabling all features while parsing and only enabling a subset of features during validation.

Note that the activated set of features does not guarantee that BinaryReader will return an error for disabled features. For example if SIMD is disabled then SIMD instructions will still be parsed via BinaryReader::visit_operator. Validation must still be performed to provide a strict guarantee that if a feature is disabled that a binary doesn’t leverage the feature. The activated set of features here instead only affects locations where preexisting bytes are reinterpreted in different ways with future proposals, such as the memarg moving from a 32-bit offset to a 64-bit offset with the memory64 proposal.

source

pub fn original_position(&self) -> usize

Gets the original position of the binary reader.

source

pub fn features(&self) -> WasmFeatures

Returns the currently active set of wasm features that this reader is using while parsing.

For more information see BinaryReader::new.

source

pub fn set_features(&mut self, features: WasmFeatures)

Sets the wasm features active while parsing to the features specified.

For more information see BinaryReader::new.

source

pub fn range(&self) -> Range<usize>

Returns a range from the starting offset to the end of the buffer.

source

pub fn read<T>(&mut self) -> Result<T, BinaryReaderError>
where T: FromReader<'a>,

Reads a value of type T from this binary reader, advancing the internal position in this reader forward as data is read.

source

pub fn read_size( &mut self, limit: usize, desc: &str, ) -> Result<usize, BinaryReaderError>

Reads a variable-length 32-bit size from the byte stream while checking against a limit.

source

pub fn read_iter<'me, T>( &'me mut self, limit: usize, desc: &str, ) -> Result<BinaryReaderIter<'a, 'me, T>, BinaryReaderError>
where T: FromReader<'a>,

Reads a variable-length 32-bit size from the byte stream while checking against a limit.

Then reads that many values of type T and returns them as an iterator.

Note that regardless of how many items are read from the returned iterator the items will still be parsed from this reader.

source

pub fn eof(&self) -> bool

Returns whether the BinaryReader has reached the end of the file.

source

pub fn current_position(&self) -> usize

Returns the BinaryReader’s current position.

source

pub fn bytes_remaining(&self) -> usize

Returns the number of bytes remaining in the BinaryReader.

source

pub fn read_bytes(&mut self, size: usize) -> Result<&'a [u8], BinaryReaderError>

Advances the BinaryReader size bytes, and returns a slice from the current position of size length.

§Errors

If size exceeds the remaining length in BinaryReader.

source

pub fn read_reader( &mut self, err: &str, ) -> Result<BinaryReader<'a>, BinaryReaderError>

Reads a length-prefixed list of bytes from this reader and returns a new BinaryReader to read that list of bytes.

Advances the position of this reader by the number of bytes read.

source

pub fn read_u32(&mut self) -> Result<u32, BinaryReaderError>

Advances the BinaryReader four bytes and returns a u32.

§Errors

If BinaryReader has less than four bytes remaining.

source

pub fn read_u64(&mut self) -> Result<u64, BinaryReaderError>

Advances the BinaryReader eight bytes and returns a u64.

§Errors

If BinaryReader has less than eight bytes remaining.

source

pub fn read_u8(&mut self) -> Result<u8, BinaryReaderError>

Advances the BinaryReader a single byte.

§Errors

If BinaryReader has no bytes remaining.

source

pub fn read_var_u32(&mut self) -> Result<u32, BinaryReaderError>

Advances the BinaryReader up to four bytes to parse a variable length integer as a u32.

§Errors

If BinaryReader has less than one or up to four bytes remaining, or the integer is larger than 32 bits.

source

pub fn read_var_u64(&mut self) -> Result<u64, BinaryReaderError>

Advances the BinaryReader up to four bytes to parse a variable length integer as a u64.

§Errors

If BinaryReader has less than one or up to eight bytes remaining, or the integer is larger than 64 bits.

source

pub fn skip( &mut self, f: impl FnOnce(&mut BinaryReader<'a>) -> Result<(), BinaryReaderError>, ) -> Result<BinaryReader<'a>, BinaryReaderError>

Executes f to skip some data in this binary reader and then returns a reader which will read the skipped data.

source

pub fn skip_string(&mut self) -> Result<(), BinaryReaderError>

Advances the BinaryReader past a WebAssembly string. This method does not perform any utf-8 validation.

§Errors

If BinaryReader has less than four bytes, the string’s length exceeds the remaining bytes, or the string length exceeds limits::MAX_WASM_STRING_SIZE.

source

pub fn read_var_i32(&mut self) -> Result<i32, BinaryReaderError>

Advances the BinaryReader up to four bytes to parse a variable length integer as a i32.

§Errors

If BinaryReader has less than one or up to four bytes remaining, or the integer is larger than 32 bits.

source

pub fn read_var_s33(&mut self) -> Result<i64, BinaryReaderError>

Advances the BinaryReader up to four bytes to parse a variable length integer as a signed 33 bit integer, returned as a i64.

§Errors

If BinaryReader has less than one or up to five bytes remaining, or the integer is larger than 33 bits.

source

pub fn read_var_i64(&mut self) -> Result<i64, BinaryReaderError>

Advances the BinaryReader up to eight bytes to parse a variable length integer as a 64 bit integer, returned as a i64.

§Errors

If BinaryReader has less than one or up to eight bytes remaining, or the integer is larger than 64 bits.

source

pub fn read_f32(&mut self) -> Result<Ieee32, BinaryReaderError>

Advances the BinaryReader up to four bytes to parse a variable length integer as a 32 bit floating point integer, returned as Ieee32.

§Errors

If BinaryReader has less than one or up to four bytes remaining, or the integer is larger than 32 bits.

source

pub fn read_f64(&mut self) -> Result<Ieee64, BinaryReaderError>

Advances the BinaryReader up to four bytes to parse a variable length integer as a 32 bit floating point integer, returned as Ieee32.

§Errors

If BinaryReader has less than one or up to four bytes remaining, or the integer is larger than 32 bits.

source

pub fn read_string(&mut self) -> Result<&'a str, BinaryReaderError>

Reads a WebAssembly string from the module.

§Errors

If BinaryReader has less than up to four bytes remaining, the string’s length exceeds the remaining bytes, the string’s length exceeds limits::MAX_WASM_STRING_SIZE, or the string contains invalid utf-8.

source

pub fn visit_operator<T>( &mut self, visitor: &mut T, ) -> Result<<T as VisitOperator<'a>>::Output, BinaryReaderError>
where T: VisitOperator<'a>,

Visit the next available operator with the specified VisitOperator instance.

Note that this does not implicitly propagate any additional information such as instruction offsets. In order to do so, consider storing such data within the visitor before visiting.

§Errors

If BinaryReader has less bytes remaining than required to parse the Operator.

§Examples

Store an offset for use in diagnostics or any other purposes:


pub fn dump(mut reader: BinaryReader) -> Result<()> {
    let mut visitor = Dumper { offset: 0 };
    while !reader.eof() {
        visitor.offset = reader.original_position();
        reader.visit_operator(&mut visitor)?;
    }
    Ok(())
}

struct Dumper {
    offset: usize
}

macro_rules! define_visit_operator {
    ($(@$proposal:ident $op:ident $({ $($arg:ident: $argty:ty),* })? => $visit:ident)*) => {
        $(
            fn $visit(&mut self $($(,$arg: $argty)*)?) -> Self::Output {
                println!("{}: {}", self.offset, stringify!($visit));
            }
        )*
    }
}

impl<'a> VisitOperator<'a> for Dumper {
    type Output = ();
    for_each_operator!(define_visit_operator);
}
source

pub fn read_operator(&mut self) -> Result<Operator<'a>, BinaryReaderError>

Reads the next available Operator.

§Errors

If BinaryReader has less bytes remaining than required to parse the Operator.

source

pub fn is_end_then_eof(&self) -> bool

Returns whether there is an end opcode followed by eof remaining in this reader.

Trait Implementations§

source§

impl<'a> Clone for BinaryReader<'a>

source§

fn clone(&self) -> BinaryReader<'a>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'a> Debug for BinaryReader<'a>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'a> Hash for BinaryReader<'a>

source§

fn hash<__H>(&self, state: &mut __H)
where __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for BinaryReader<'a>

§

impl<'a> RefUnwindSafe for BinaryReader<'a>

§

impl<'a> Send for BinaryReader<'a>

§

impl<'a> Sync for BinaryReader<'a>

§

impl<'a> Unpin for BinaryReader<'a>

§

impl<'a> UnwindSafe for BinaryReader<'a>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.