Class BlockBuilder



  • public class BlockBuilder
    extends Object
    Builder for BlockStatement.

    Has methods that help ensure that variable names are unique.

    • Field Detail

      • expressionForReuse

        final Map<Expression,DeclarationStatement> expressionForReuse
        Contains final-fine-to-reuse-declarations. An entry to this map is added when adding final declaration of a statement with optimize=true parameter.
      • optimizing

        private final boolean optimizing
      • OPTIMIZE_SHUTTLE

        private static final Shuttle OPTIMIZE_SHUTTLE
    • Constructor Detail

      • BlockBuilder

        public BlockBuilder​()
        Creates a non-optimizing BlockBuilder.
      • BlockBuilder

        public BlockBuilder​(boolean optimizing)
        Creates a BlockBuilder.
        Parameters:
        optimizing - Whether to eliminate common sub-expressions
      • BlockBuilder

        public BlockBuilder​(boolean optimizing,
                            BlockBuilder parent)
        Creates a BlockBuilder.
        Parameters:
        optimizing - Whether to eliminate common sub-expressions
    • Method Detail

      • clear

        public void clear​()
        Clears this BlockBuilder.
      • append

        public Expression append​(String name,
                                 BlockStatement block)
        Appends a block to a list of statements and returns an expression (possibly a variable) that represents the result of the newly added block.
      • append

        public Expression append​(String name,
                                 BlockStatement block,
                                 boolean optimize)
        Appends an expression to a list of statements, optionally optimizing it to a variable if it is used more than once.
        Parameters:
        name - Suggested variable name
        block - Expression
        optimize - Whether to try to optimize by assigning the expression to a variable. Do not do this if the expression has side-effects or a time-dependent value.
      • append

        public Expression append​(String name,
                                 Expression expression)
        Appends an expression to a list of statements, and returns an expression (possibly a variable) that represents the result of the newly added block.
      • appendIfNotNull

        public Expression appendIfNotNull​(String name,
                                          Expression expression)
        Appends an expression to a list of statements, if it is not null.
      • append

        public Expression append​(String name,
                                 Expression expression,
                                 boolean optimize)
        Appends an expression to a list of statements, optionally optimizing if the expression is used more than once.
      • isSimpleExpression

        protected boolean isSimpleExpression​(Expression expr)
        Checks if expression is simple enough to always inline at zero cost.
        Parameters:
        expr - expression to test
        Returns:
        true when given expression is safe to always inline
      • normalizeDeclaration

        private Expression normalizeDeclaration​(DeclarationStatement decl)
        Prepares declaration for inlining: adds cast
        Parameters:
        decl - inlining candidate
        Returns:
        normalized expression
      • getComputedExpression

        public DeclarationStatement getComputedExpression​(Expression expr)
        Returns the reference to ParameterExpression if given expression was already computed and stored to local variable
        Parameters:
        expr - expression to test
        Returns:
        existing ParameterExpression or null
      • add

        public void add​(Statement statement)
      • add

        public void add​(Expression expression)
      • toBlock

        public BlockStatement toBlock​()
        Returns a block consisting of the current list of statements.
      • optimize

        private boolean optimize​(Shuttle optimizer,
                                 boolean performInline)
        Optimizes the list of statements. If an expression is used only once, it is inlined.
        Returns:
        whether any optimizations were made
      • createOptimizeShuttle

        protected Shuttle createOptimizeShuttle​()
        Creates a shuttle that will be used during block optimization. Sub-classes might provide more specific optimizations (e.g. partial evaluation).
        Returns:
        shuttle used to optimize the statements when converting to block
      • createFinishingOptimizeShuttle

        protected Shuttle createFinishingOptimizeShuttle​()
        Creates a final optimization shuttle. Typically, the visitor will factor out constant expressions.
        Returns:
        shuttle that is used to finalize the optimization
      • newName

        private String newName​(String suggestion,
                               boolean optimize)
        Creates a name for a new variable, unique within this block, controlling whether the variable can be inlined later.
      • newName

        public String newName​(String suggestion)
        Creates a name for a new variable, unique within this block.
      • hasVariable

        public boolean hasVariable​(String name)