Author: dbrosius
Date: Tue Jul 20 00:28:11 2010
New Revision: 965692

URL: http://svn.apache.org/viewvc?rev=965692&view=rev
Log:
Bug 49615 - BCELifier produces incorrect code for methods containing loads of 
class literals from constant pool - supplied by Bug 49615 - supplied by Tassos 
Bassoukos

Modified:
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/LDC.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/PUSH.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/util/BCELFactory.java

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/LDC.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/LDC.java?rev=965692&r1=965691&r2=965692&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/LDC.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/LDC.java Tue Jul 
20 00:28:11 2010
@@ -19,6 +19,7 @@ package org.apache.bcel.generic;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
+
 import org.apache.bcel.util.ByteSequence;
 
 /** 
@@ -62,7 +63,8 @@ public class LDC extends CPInstruction i
      * Dump instruction as byte code to stream out.
      * @param out Output stream
      */
-    public void dump( DataOutputStream out ) throws IOException {
+    @Override
+       public void dump( DataOutputStream out ) throws IOException {
         out.writeByte(opcode);
         if (length == 2) {
             out.writeByte(index);
@@ -75,7 +77,8 @@ public class LDC extends CPInstruction i
     /**
      * Set the index to constant pool and adjust size.
      */
-    public final void setIndex( int index ) {
+    @Override
+       public final void setIndex( int index ) {
         super.setIndex(index);
         setSize();
     }
@@ -84,7 +87,8 @@ public class LDC extends CPInstruction i
     /**
      * Read needed data (e.g. index) from file.
      */
-    protected void initFromFile( ByteSequence bytes, boolean wide ) throws 
IOException {
+    @Override
+       protected void initFromFile( ByteSequence bytes, boolean wide ) throws 
IOException {
         length = 2;
         index = bytes.readUnsignedByte();
     }
@@ -102,14 +106,17 @@ public class LDC extends CPInstruction i
             case org.apache.bcel.Constants.CONSTANT_Integer:
                 return new 
Integer(((org.apache.bcel.classfile.ConstantInteger) c).getBytes());
             case org.apache.bcel.Constants.CONSTANT_Class:
-                return c;
+               int nameIndex = ((org.apache.bcel.classfile.ConstantClass) 
c).getNameIndex();
+               c = cpg.getConstantPool().getConstant(nameIndex);
+               return new ObjectType(((org.apache.bcel.classfile.ConstantUtf8) 
c).getBytes());
             default: // Never reached
                 throw new RuntimeException("Unknown or invalid constant type 
at " + index);
         }
     }
 
 
-    public Type getType( ConstantPoolGen cpg ) {
+    @Override
+       public Type getType( ConstantPoolGen cpg ) {
         switch (cpg.getConstantPool().getConstant(index).getTag()) {
             case org.apache.bcel.Constants.CONSTANT_String:
                 return Type.STRING;
@@ -138,7 +145,8 @@ public class LDC extends CPInstruction i
      *
      * @param v Visitor object
      */
-    public void accept( Visitor v ) {
+    @Override
+       public void accept( Visitor v ) {
         v.visitStackProducer(this);
         v.visitPushInstruction(this);
         v.visitExceptionThrower(this);

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/PUSH.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/PUSH.java?rev=965692&r1=965691&r2=965692&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/PUSH.java 
(original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/PUSH.java Tue Jul 
20 00:28:11 2010
@@ -119,7 +119,19 @@ public final class PUSH implements Compo
         }
     }
 
-
+    /**
+     * 
+     * @param cp
+     * @param value
+     */
+    public PUSH(ConstantPoolGen cp, ObjectType value) {
+        if (value == null) {
+            instruction = ACONST_NULL;
+        } else {
+            instruction = new LDC(cp.addClass(value));
+        }
+    }
+    
     /**
      * @param cp Constant pool
      * @param value to be pushed 
@@ -173,7 +185,8 @@ public final class PUSH implements Compo
     /**
      * @return mnemonic for instruction
      */
-    public String toString() {
+    @Override
+       public String toString() {
         return instruction.toString() + " (PUSH)";
     }
 }

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/util/BCELFactory.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/util/BCELFactory.java?rev=965692&r1=965691&r2=965692&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/util/BCELFactory.java 
(original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/util/BCELFactory.java Tue 
Jul 20 00:28:11 2010
@@ -67,9 +67,9 @@ import org.apache.bcel.generic.Type;
  */
 class BCELFactory extends EmptyVisitor {
 
-    private MethodGen _mg;
-    private PrintWriter _out;
-    private ConstantPoolGen _cp;
+    private final MethodGen _mg;
+    private final PrintWriter _out;
+    private final ConstantPoolGen _cp;
 
 
     BCELFactory(MethodGen mg, PrintWriter out) {
@@ -78,7 +78,7 @@ class BCELFactory extends EmptyVisitor {
         _out = out;
     }
 
-    private Map branch_map = new HashMap(); // Map<Instruction, 
InstructionHandle>
+    private final Map branch_map = new HashMap(); // Map<Instruction, 
InstructionHandle>
 
 
     public void start() {
@@ -120,7 +120,8 @@ class BCELFactory extends EmptyVisitor {
     }
 
 
-    public void visitLocalVariableInstruction( LocalVariableInstruction i ) {
+    @Override
+       public void visitLocalVariableInstruction( LocalVariableInstruction i ) 
{
         short opcode = i.getOpcode();
         Type type = i.getType(_cp);
         if (opcode == Constants.IINC) {
@@ -134,7 +135,8 @@ class BCELFactory extends EmptyVisitor {
     }
 
 
-    public void visitArrayInstruction( ArrayInstruction i ) {
+    @Override
+       public void visitArrayInstruction( ArrayInstruction i ) {
         short opcode = i.getOpcode();
         Type type = i.getType(_cp);
         String kind = (opcode < Constants.IASTORE) ? "Load" : "Store";
@@ -143,7 +145,8 @@ class BCELFactory extends EmptyVisitor {
     }
 
 
-    public void visitFieldInstruction( FieldInstruction i ) {
+    @Override
+       public void visitFieldInstruction( FieldInstruction i ) {
         short opcode = i.getOpcode();
         String class_name = i.getClassName(_cp);
         String field_name = i.getFieldName(_cp);
@@ -154,7 +157,8 @@ class BCELFactory extends EmptyVisitor {
     }
 
 
-    public void visitInvokeInstruction( InvokeInstruction i ) {
+    @Override
+       public void visitInvokeInstruction( InvokeInstruction i ) {
         short opcode = i.getOpcode();
         String class_name = i.getClassName(_cp);
         String method_name = i.getMethodName(_cp);
@@ -167,7 +171,8 @@ class BCELFactory extends EmptyVisitor {
     }
 
 
-    public void visitAllocationInstruction( AllocationInstruction i ) {
+    @Override
+       public void visitAllocationInstruction( AllocationInstruction i ) {
         Type type;
         if (i instanceof CPInstruction) {
             type = ((CPInstruction) i).getType(_cp);
@@ -208,48 +213,59 @@ class BCELFactory extends EmptyVisitor {
             embed += "f";
         } else if (value instanceof Long) {
             embed += "L";
+        } else if (value instanceof ObjectType){
+            ObjectType ot = (ObjectType) value;
+            embed = "new ObjectType(\""+ot.getClassName()+"\")";
         }
+
         _out.println("il.append(new PUSH(_cp, " + embed + "));");
     }
 
 
-    public void visitLDC( LDC i ) {
+    @Override
+       public void visitLDC( LDC i ) {
         createConstant(i.getValue(_cp));
     }
 
 
-    public void visitLDC2_W( LDC2_W i ) {
+    @Override
+       public void visitLDC2_W( LDC2_W i ) {
         createConstant(i.getValue(_cp));
     }
 
 
-    public void visitConstantPushInstruction( ConstantPushInstruction i ) {
+    @Override
+       public void visitConstantPushInstruction( ConstantPushInstruction i ) {
         createConstant(i.getValue());
     }
 
 
-    public void visitINSTANCEOF( INSTANCEOF i ) {
+    @Override
+       public void visitINSTANCEOF( INSTANCEOF i ) {
         Type type = i.getType(_cp);
         _out.println("il.append(new INSTANCEOF(_cp.addClass(" + 
BCELifier.printType(type) + ")));");
     }
 
 
-    public void visitCHECKCAST( CHECKCAST i ) {
+    @Override
+       public void visitCHECKCAST( CHECKCAST i ) {
         Type type = i.getType(_cp);
         _out.println("il.append(_factory.createCheckCast(" + 
BCELifier.printType(type) + "));");
     }
 
 
-    public void visitReturnInstruction( ReturnInstruction i ) {
+    @Override
+       public void visitReturnInstruction( ReturnInstruction i ) {
         Type type = i.getType(_cp);
         _out.println("il.append(_factory.createReturn(" + 
BCELifier.printType(type) + "));");
     }
 
     // Memorize BranchInstructions that need an update
-    private List branches = new ArrayList();
+    private final List branches = new ArrayList();
 
 
-    public void visitBranchInstruction( BranchInstruction bi ) {
+    @Override
+       public void visitBranchInstruction( BranchInstruction bi ) {
         BranchHandle bh = (BranchHandle) branch_map.get(bi);
         int pos = bh.getPosition();
         String name = bi.getName() + "_" + pos;
@@ -295,7 +311,8 @@ class BCELFactory extends EmptyVisitor {
     }
 
 
-    public void visitRET( RET i ) {
+    @Override
+       public void visitRET( RET i ) {
         _out.println("il.append(new RET(" + i.getIndex() + ")));");
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to