< prev index next >

src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/PUSH.java

Print this page

        

@@ -1,8 +1,7 @@
 /*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
  */
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.

@@ -19,144 +18,178 @@
  * limitations under the License.
  */
 
 package com.sun.org.apache.bcel.internal.generic;
 
-import com.sun.org.apache.bcel.internal.Constants;
-import java.io.*;
+import com.sun.org.apache.bcel.internal.Const;
 
 /**
  * Wrapper class for push operations, which are implemented either as BIPUSH,
  * LDC or xCONST_n instructions.
  *
- * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
+ * @version $Id: PUSH.java 1749598 2016-06-21 20:36:33Z ggregory $
  */
-public final class PUSH
-  implements CompoundInstruction, VariableLengthInstruction, InstructionConstants
-{
+public final class PUSH implements CompoundInstruction, VariableLengthInstruction {
+
   private Instruction instruction;
 
+
   /**
    * This constructor also applies for values of type short, char, byte
    *
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, int value) {
-    if((value >= -1) && (value <= 5)) // Use ICONST_n
-      instruction = INSTRUCTIONS[Constants.ICONST_0 + value];
-    else if((value >= -128) && (value <= 127)) // Use BIPUSH
-      instruction = new BIPUSH((byte)value);
-    else if((value >= -32768) && (value <= 32767)) // Use SIPUSH
-      instruction = new SIPUSH((short)value);
-    else // If everything fails create a Constant pool entry
+    public PUSH(final ConstantPoolGen cp, final int value) {
+        if ((value >= -1) && (value <= 5)) {
+            instruction = InstructionConst.getInstruction(Const.ICONST_0 + value);
+        } else if (Instruction.isValidByte(value)) {
+            instruction = new BIPUSH((byte) value);
+        } else if (Instruction.isValidShort(value)) {
+            instruction = new SIPUSH((short) value);
+        } else {
       instruction = new LDC(cp.addInteger(value));
   }
+    }
+
 
   /**
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, boolean value) {
-    instruction = INSTRUCTIONS[Constants.ICONST_0 + (value? 1 : 0)];
+    public PUSH(final ConstantPoolGen cp, final boolean value) {
+        instruction = InstructionConst.getInstruction(Const.ICONST_0 + (value ? 1 : 0));
   }
 
+
   /**
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, float value) {
-    if(value == 0.0)
-      instruction = FCONST_0;
-    else if(value == 1.0)
-      instruction = FCONST_1;
-    else if(value == 2.0)
-      instruction = FCONST_2;
-    else // Create a Constant pool entry
+    public PUSH(final ConstantPoolGen cp, final float value) {
+        if (value == 0.0) {
+            instruction = InstructionConst.FCONST_0;
+        } else if (value == 1.0) {
+            instruction = InstructionConst.FCONST_1;
+        } else if (value == 2.0) {
+            instruction = InstructionConst.FCONST_2;
+        } else {
       instruction = new LDC(cp.addFloat(value));
   }
+    }
+
 
   /**
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, long value) {
-    if(value == 0)
-      instruction = LCONST_0;
-    else if(value == 1)
-      instruction = LCONST_1;
-    else // Create a Constant pool entry
+    public PUSH(final ConstantPoolGen cp, final long value) {
+        if (value == 0) {
+            instruction = InstructionConst.LCONST_0;
+        } else if (value == 1) {
+            instruction = InstructionConst.LCONST_1;
+        } else {
       instruction = new LDC2_W(cp.addLong(value));
   }
+    }
+
 
   /**
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, double value) {
-    if(value == 0.0)
-      instruction = DCONST_0;
-    else if(value == 1.0)
-      instruction = DCONST_1;
-    else // Create a Constant pool entry
+    public PUSH(final ConstantPoolGen cp, final double value) {
+        if (value == 0.0) {
+            instruction = InstructionConst.DCONST_0;
+        } else if (value == 1.0) {
+            instruction = InstructionConst.DCONST_1;
+        } else {
       instruction = new LDC2_W(cp.addDouble(value));
   }
+    }
+
 
   /**
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, String value) {
-    if(value == null)
-      instruction = ACONST_NULL;
-    else // Create a Constant pool entry
+    public PUSH(final ConstantPoolGen cp, final String value) {
+        if (value == null) {
+            instruction = InstructionConst.ACONST_NULL;
+        } else {
       instruction = new LDC(cp.addString(value));
   }
+    }
+
+    /**
+     *
+     * @param cp
+     * @param value
+     * @since 6.0
+     */
+    public PUSH(final ConstantPoolGen cp, final ObjectType value) {
+        if (value == null) {
+            instruction = InstructionConst.ACONST_NULL;
+        } else {
+            instruction = new LDC(cp.addClass(value));
+        }
+    }
 
   /**
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, Number value) {
-    if((value instanceof Integer) || (value instanceof Short) || (value instanceof Byte))
+    public PUSH(final ConstantPoolGen cp, final Number value) {
+        if ((value instanceof Integer) || (value instanceof Short) || (value instanceof Byte)) {
       instruction = new PUSH(cp, value.intValue()).instruction;
-    else if(value instanceof Double)
+        } else if (value instanceof Double) {
       instruction = new PUSH(cp, value.doubleValue()).instruction;
-    else if(value instanceof Float)
+        } else if (value instanceof Float) {
       instruction = new PUSH(cp, value.floatValue()).instruction;
-    else if(value instanceof Long)
+        } else if (value instanceof Long) {
       instruction = new PUSH(cp, value.longValue()).instruction;
-    else
+        } else {
       throw new ClassGenException("What's this: " + value);
   }
+    }
+
 
   /**
+     * creates a push object from a Character value. Warning: Make sure not to attempt to allow
+     * autoboxing to create this value parameter, as an alternative constructor will be called
+     *
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, Character value) {
-    this(cp, (int)value.charValue());
+    public PUSH(final ConstantPoolGen cp, final Character value) {
+        this(cp, value.charValue());
   }
 
+
   /**
    * @param cp Constant pool
    * @param value to be pushed
    */
-  public PUSH(ConstantPoolGen cp, Boolean value) {
+    public PUSH(final ConstantPoolGen cp, final Boolean value) {
     this(cp, value.booleanValue());
   }
 
+
+    @Override
   public final InstructionList getInstructionList() {
     return new InstructionList(instruction);
   }
 
+
   public final Instruction getInstruction() {
     return instruction;
   }
 
+
   /**
    * @return mnemonic for instruction
    */
+    @Override
   public String toString() {
-    return instruction.toString() + " (PUSH)";
+        return instruction + " (PUSH)";
   }
 }
< prev index next >