Class PatternElement

  • Direct Known Subclasses:
    Invoke, MatchAny, Opcode, SingleInstruction, Wild

    public abstract class PatternElement
    extends java.lang.Object
    A PatternElement is an element of a ByteCodePattern. It potentially matches some number of bytecode instructions.
    • Constructor Summary

      Constructors 
      Constructor Description
      PatternElement()  
    • Method Summary

      All Methods Static Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      abstract boolean acceptBranch​(Edge edge, org.apache.bcel.generic.InstructionHandle source)
      Return whether or not it is acceptable to take the given branch.
      protected static BindingSet addOrCheckDefinition​(java.lang.String varName, Variable variable, BindingSet bindingSet)
      Add a variable definition to the given BindingSet, or if there is an existing definition, make sure it is consistent with the new definition.
      boolean allowTrailingEdges()
      Return whether or not this PatternElement may match trailing edges.
      PatternElement dominatedBy​(java.lang.String dominatedBy)
      Set the label of another pattern element whose first matched instruction must dominate the instruction(s) matched by this element.
      java.lang.String getDominatedBy()
      Get the label of the pattern element whose first matched instruction must dominate the instruction(s) matched by this element.
      java.lang.String getLabel()
      Get the label of this PatternElement.
      PatternElement getNext()
      Get the next PatternElement.
      PatternElement label​(java.lang.String label)
      Set a label for this PatternElement.
      static Variable lookup​(java.lang.String varName, BindingSet bindingSet)
      Look up a variable definition in given BindingSet.
      abstract MatchResult match​(org.apache.bcel.generic.InstructionHandle handle, org.apache.bcel.generic.ConstantPoolGen cpg, ValueNumberFrame before, ValueNumberFrame after, BindingSet bindingSet)
      Return whether or not this element matches the given instruction with the given Bindings in effect.
      abstract int maxOccur()
      Return the maximum number of instructions this PatternElement must match in the ByteCodePattern.
      abstract int minOccur()
      Return the minimum number of instructions this PatternElement must match in the ByteCodePattern.
      PatternElement setAllowTrailingEdges​(boolean allowTrailingEdges)
      Set whether or not this PatternElement allows trailing edges to be matched.
      void setIndex​(int index)
      Set the index.
      void setNext​(PatternElement patternElement)
      Set the next PatternElement.
      java.lang.String toString()  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Constructor Detail

      • PatternElement

        public PatternElement()
    • Method Detail

      • getNext

        public PatternElement getNext()
        Get the next PatternElement.
      • setNext

        public void setNext​(PatternElement patternElement)
        Set the next PatternElement.
      • label

        public PatternElement label​(java.lang.String label)
        Set a label for this PatternElement.
        Parameters:
        label - the label
        Returns:
        this object
      • getLabel

        public java.lang.String getLabel()
        Get the label of this PatternElement.
        Returns:
        the label, or null if the PatternElement is not labeled
      • dominatedBy

        public PatternElement dominatedBy​(java.lang.String dominatedBy)
        Set the label of another pattern element whose first matched instruction must dominate the instruction(s) matched by this element.
      • getDominatedBy

        public java.lang.String getDominatedBy()
        Get the label of the pattern element whose first matched instruction must dominate the instruction(s) matched by this element.
      • setIndex

        public void setIndex​(int index)
        Set the index. This is just for debugging.
      • setAllowTrailingEdges

        public PatternElement setAllowTrailingEdges​(boolean allowTrailingEdges)
        Set whether or not this PatternElement allows trailing edges to be matched. By default, trailing edges may be matched. When this value is set to false, it ensures that the successor instruction must be in the same basic block.
        Parameters:
        allowTrailingEdges - true if trailing edges may be matched, false if trailing edges will never be matched
      • allowTrailingEdges

        public boolean allowTrailingEdges()
        Return whether or not this PatternElement may match trailing edges.
      • lookup

        public static Variable lookup​(java.lang.String varName,
                                      BindingSet bindingSet)
        Look up a variable definition in given BindingSet.
        Parameters:
        varName - the name of the variable
        bindingSet - the BindingSet to look in
        Returns:
        the Variable, or null if no Variable is bound to the name
      • match

        @CheckForNull
        public abstract MatchResult match​(org.apache.bcel.generic.InstructionHandle handle,
                                          org.apache.bcel.generic.ConstantPoolGen cpg,
                                          ValueNumberFrame before,
                                          ValueNumberFrame after,
                                          BindingSet bindingSet)
                                   throws DataflowAnalysisException
        Return whether or not this element matches the given instruction with the given Bindings in effect.
        Parameters:
        handle - the instruction
        cpg - the ConstantPoolGen from the method
        before - the ValueNumberFrame representing values in the Java stack frame just before the execution of the instruction
        after - the ValueNumberFrame representing values in the Java stack frame just after the execution of the instruction
        bindingSet - the set of Bindings
        Returns:
        if the match is successful, returns a MatchResult with the PatternElement and BindingSet; if the match is not successful, returns null
        Throws:
        DataflowAnalysisException
      • acceptBranch

        public abstract boolean acceptBranch​(Edge edge,
                                             org.apache.bcel.generic.InstructionHandle source)
        Return whether or not it is acceptable to take the given branch.
        Parameters:
        edge - the Edge representing the branch
        source - the source instruction of the branch
        Returns:
        true if the Edge is acceptable, false if not
      • minOccur

        public abstract int minOccur()
        Return the minimum number of instructions this PatternElement must match in the ByteCodePattern.
      • maxOccur

        public abstract int maxOccur()
        Return the maximum number of instructions this PatternElement must match in the ByteCodePattern.
      • addOrCheckDefinition

        protected static BindingSet addOrCheckDefinition​(java.lang.String varName,
                                                         Variable variable,
                                                         BindingSet bindingSet)
        Add a variable definition to the given BindingSet, or if there is an existing definition, make sure it is consistent with the new definition.
        Parameters:
        varName - the name of the variable
        variable - the Variable which should be added or checked for consistency
        bindingSet - the existing set of bindings
        Returns:
        the updated BindingSet (if the variable is consistent with the previous bindings), or null if the new variable is inconsistent with the previous bindings
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object