leo_passes

Struct ConstPropagator

Source
pub struct ConstPropagator<'a> {
    pub(crate) symbol_table: &'a mut SymbolTable,
    pub(crate) type_table: &'a TypeTable,
    pub(crate) node_builder: &'a NodeBuilder,
    pub(crate) handler: &'a Handler,
    pub(crate) program: Symbol,
    pub(crate) changed: bool,
    pub(crate) const_not_evaluated: Option<Span>,
    pub(crate) array_index_not_evaluated: Option<Span>,
}
Expand description

A pass to perform const propagation and folding.

This pass should be used in conjunction with the Unroller so that loop bounds and consts in loop bodies can be evaluated.

Any of these expressions:

  1. unary operation,
  2. binary operation,
  3. core function other than cheat codes, mapping ops, or rand functions,

whose arguments are consts or literals will be subject to constant folding. The ternary conditional operator will also be folded if its condition is a constant or literal.

Fields§

§symbol_table: &'a mut SymbolTable

The symbol table associated with the program.

§type_table: &'a TypeTable

A mapping between node IDs and their types.

§node_builder: &'a NodeBuilder

A counter used to generate unique node IDs.

§handler: &'a Handler

The error handler.

§program: Symbol

The program name.

§changed: bool

Have we actually modified the progam at all?

§const_not_evaluated: Option<Span>

The RHS of a const declaration we were not able to evaluate.

§array_index_not_evaluated: Option<Span>

An array index which was not able to be evaluated.

Implementations§

Source§

impl<'a> ConstPropagator<'a>

Source

pub(crate) fn new( handler: &'a Handler, symbol_table: &'a mut SymbolTable, type_table: &'a TypeTable, node_builder: &'a NodeBuilder, ) -> Self

Source

pub(crate) fn in_scope<T>( &mut self, id: NodeID, func: impl FnOnce(&mut Self) -> T, ) -> T

Enter the symbol table’s scope id, execute func, and then return to the parent scope.

Source

pub(crate) fn emit_err(&self, err: StaticAnalyzerError)

Emit a StaticAnalyzerError.

Trait Implementations§

Source§

impl ExpressionReconstructor for ConstPropagator<'_>

Source§

type AdditionalOutput = Option<Value>

Source§

fn reconstruct_expression( &mut self, input: Expression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_struct_init( &mut self, input: StructExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_ternary( &mut self, input: TernaryExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_access( &mut self, input: AccessExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_array_access( &mut self, input: ArrayAccess, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_associated_constant( &mut self, input: AssociatedConstant, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_associated_function( &mut self, input: AssociatedFunction, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_member_access( &mut self, input: MemberAccess, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_tuple_access( &mut self, input: TupleAccess, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_array( &mut self, input: ArrayExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_binary( &mut self, input: BinaryExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_call( &mut self, input: CallExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_cast( &mut self, input: CastExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_err( &mut self, _input: ErrExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_identifier( &mut self, input: Identifier, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_literal( &mut self, input: Literal, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_locator( &mut self, input: LocatorExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_tuple( &mut self, input: TupleExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_unary( &mut self, input: UnaryExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_unit( &mut self, input: UnitExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

impl<'a> Pass for ConstPropagator<'a>

Source§

type Input = (Ast, &'a Handler, &'a mut SymbolTable, &'a TypeTable, &'a NodeBuilder)

Source§

type Output = Result<(Ast, ConstPropagatorOutput), LeoError>

Source§

fn do_pass( (ast, handler, symbol_table, type_table, node_builder): Self::Input, ) -> Self::Output

Runs the compiler pass.
Source§

impl ProgramReconstructor for ConstPropagator<'_>

Source§

impl StatementReconstructor for ConstPropagator<'_>

Auto Trait Implementations§

§

impl<'a> Freeze for ConstPropagator<'a>

§

impl<'a> !RefUnwindSafe for ConstPropagator<'a>

§

impl<'a> !Send for ConstPropagator<'a>

§

impl<'a> !Sync for ConstPropagator<'a>

§

impl<'a> Unpin for ConstPropagator<'a>

§

impl<'a> !UnwindSafe for ConstPropagator<'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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more