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]