src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Frame.java

Print this page

        

@@ -71,14 +71,15 @@
 import jdk.internal.org.objectweb.asm.tree.VarInsnNode;
 
 /**
  * A symbolic execution stack frame. A stack frame contains a set of local
  * variable slots, and an operand stack. Warning: long and double values are
- * represented by <i>two</i> slots in local variables, and by <i>one</i> slot
- * in the operand stack.
+ * represented by <i>two</i> slots in local variables, and by <i>one</i> slot in
+ * the operand stack.
  *
- * @param <V> type of the Value used for the analysis.
+ * @param <V>
+ *            type of the Value used for the analysis.
  *
  * @author Eric Bruneton
  */
 public class Frame<V extends Value> {
 

@@ -104,32 +105,36 @@
     private int top;
 
     /**
      * Constructs a new frame with the given size.
      *
-     * @param nLocals the maximum number of local variables of the frame.
-     * @param nStack the maximum stack size of the frame.
+     * @param nLocals
+     *            the maximum number of local variables of the frame.
+     * @param nStack
+     *            the maximum stack size of the frame.
      */
     public Frame(final int nLocals, final int nStack) {
         this.values = (V[]) new Value[nLocals + nStack];
         this.locals = nLocals;
     }
 
     /**
      * Constructs a new frame that is identical to the given frame.
      *
-     * @param src a frame.
+     * @param src
+     *            a frame.
      */
     public Frame(final Frame<? extends V> src) {
         this(src.locals, src.values.length - src.locals);
         init(src);
     }
 
     /**
      * Copies the state of the given frame into this frame.
      *
-     * @param src a frame.
+     * @param src
+     *            a frame.
      * @return this frame.
      */
     public Frame<V> init(final Frame<? extends V> src) {
         returnValue = src.returnValue;
         System.arraycopy(src.values, 0, values, 0, values.length);

@@ -138,11 +143,12 @@
     }
 
     /**
      * Sets the expected return type of the analyzed method.
      *
-     * @param v the expected return type of the analyzed method, or
+     * @param v
+     *            the expected return type of the analyzed method, or
      *        <tt>null</tt> if the method returns void.
      */
     public void setReturn(final V v) {
         returnValue = v;
     }

@@ -157,33 +163,39 @@
     }
 
     /**
      * Returns the value of the given local variable.
      *
-     * @param i a local variable index.
+     * @param i
+     *            a local variable index.
      * @return the value of the given local variable.
-     * @throws IndexOutOfBoundsException if the variable does not exist.
+     * @throws IndexOutOfBoundsException
+     *             if the variable does not exist.
      */
     public V getLocal(final int i) throws IndexOutOfBoundsException {
         if (i >= locals) {
-            throw new IndexOutOfBoundsException("Trying to access an inexistant local variable");
+            throw new IndexOutOfBoundsException(
+                    "Trying to access an inexistant local variable");
         }
         return values[i];
     }
 
     /**
      * Sets the value of the given local variable.
      *
-     * @param i a local variable index.
-     * @param value the new value of this local variable.
-     * @throws IndexOutOfBoundsException if the variable does not exist.
+     * @param i
+     *            a local variable index.
+     * @param value
+     *            the new value of this local variable.
+     * @throws IndexOutOfBoundsException
+     *             if the variable does not exist.
      */
     public void setLocal(final int i, final V value)
-            throws IndexOutOfBoundsException
-    {
+            throws IndexOutOfBoundsException {
         if (i >= locals) {
-            throw new IndexOutOfBoundsException("Trying to access an inexistant local variable "+i);
+            throw new IndexOutOfBoundsException(
+                    "Trying to access an inexistant local variable " + i);
         }
         values[i] = value;
     }
 
     /**

@@ -197,14 +209,15 @@
     }
 
     /**
      * Returns the value of the given operand stack slot.
      *
-     * @param i the index of an operand stack slot.
+     * @param i
+     *            the index of an operand stack slot.
      * @return the value of the given operand stack slot.
-     * @throws IndexOutOfBoundsException if the operand stack slot does not
-     *         exist.
+     * @throws IndexOutOfBoundsException
+     *             if the operand stack slot does not exist.
      */
     public V getStack(final int i) throws IndexOutOfBoundsException {
         return values[i + locals];
     }
 

@@ -217,36 +230,39 @@
 
     /**
      * Pops a value from the operand stack of this frame.
      *
      * @return the value that has been popped from the stack.
-     * @throws IndexOutOfBoundsException if the operand stack is empty.
+     * @throws IndexOutOfBoundsException
+     *             if the operand stack is empty.
      */
     public V pop() throws IndexOutOfBoundsException {
         if (top == 0) {
-            throw new IndexOutOfBoundsException("Cannot pop operand off an empty stack.");
+            throw new IndexOutOfBoundsException(
+                    "Cannot pop operand off an empty stack.");
         }
         return values[--top + locals];
     }
 
     /**
      * Pushes a value into the operand stack of this frame.
      *
-     * @param value the value that must be pushed into the stack.
-     * @throws IndexOutOfBoundsException if the operand stack is full.
+     * @param value
+     *            the value that must be pushed into the stack.
+     * @throws IndexOutOfBoundsException
+     *             if the operand stack is full.
      */
     public void push(final V value) throws IndexOutOfBoundsException {
         if (top + locals >= values.length) {
-            throw new IndexOutOfBoundsException("Insufficient maximum stack size.");
+            throw new IndexOutOfBoundsException(
+                    "Insufficient maximum stack size.");
         }
         values[top++ + locals] = value;
     }
 
-    public void execute(
-        final AbstractInsnNode insn,
-        final Interpreter<V> interpreter) throws AnalyzerException
-    {
+    public void execute(final AbstractInsnNode insn,
+            final Interpreter<V> interpreter) throws AnalyzerException {
         V value1, value2, value3, value4;
         List<V> values;
         int var;
 
         switch (insn.getOpcode()) {

@@ -666,46 +682,50 @@
             case Opcodes.IFNULL:
             case Opcodes.IFNONNULL:
                 interpreter.unaryOperation(insn, pop());
                 break;
             default:
-                throw new RuntimeException("Illegal opcode "+insn.getOpcode());
+            throw new RuntimeException("Illegal opcode " + insn.getOpcode());
         }
     }
 
     /**
      * Merges this frame with the given frame.
      *
-     * @param frame a frame.
-     * @param interpreter the interpreter used to merge values.
+     * @param frame
+     *            a frame.
+     * @param interpreter
+     *            the interpreter used to merge values.
      * @return <tt>true</tt> if this frame has been changed as a result of the
      *         merge operation, or <tt>false</tt> otherwise.
-     * @throws AnalyzerException if the frames have incompatible sizes.
+     * @throws AnalyzerException
+     *             if the frames have incompatible sizes.
      */
-    public boolean merge(final Frame<? extends V> frame, final Interpreter<V> interpreter)
-            throws AnalyzerException
-    {
+    public boolean merge(final Frame<? extends V> frame,
+            final Interpreter<V> interpreter) throws AnalyzerException {
         if (top != frame.top) {
             throw new AnalyzerException(null, "Incompatible stack heights");
         }
         boolean changes = false;
         for (int i = 0; i < locals + top; ++i) {
             V v = interpreter.merge(values[i], frame.values[i]);
-            if (v != values[i]) {
+            if (!v.equals(values[i])) {
                 values[i] = v;
-                changes |= true;
+                changes = true;
             }
         }
         return changes;
     }
 
     /**
      * Merges this frame with the given frame (case of a RET instruction).
      *
-     * @param frame a frame
-     * @param access the local variables that have been accessed by the
-     *        subroutine to which the RET instruction corresponds.
+     * @param frame
+     *            a frame
+     * @param access
+     *            the local variables that have been accessed by the subroutine
+     *            to which the RET instruction corresponds.
      * @return <tt>true</tt> if this frame has been changed as a result of the
      *         merge operation, or <tt>false</tt> otherwise.
      */
     public boolean merge(final Frame<? extends V> frame, final boolean[] access) {
         boolean changes = false;