aclement 14 роки тому
джерело
коміт
600b449498

+ 4
- 4
bcel-builder/src/org/aspectj/apache/bcel/Constants.java Переглянути файл

@@ -59,7 +59,7 @@ import org.aspectj.apache.bcel.generic.Type;
/**
* Constants for the project, mostly defined in the JVM specification.
*
* @version $Id: Constants.java,v 1.5 2008/08/27 23:58:58 aclement Exp $
* @version $Id: Constants.java,v 1.6 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
public interface Constants {
@@ -470,7 +470,7 @@ public interface Constants {
public static final Type[] types = new Type[256];
public static final long[] instFlags = new long[256];

public static final Class[][] instExcs = new Class[256][];
public static final Class<Throwable>[][] instExcs = new Class[256][];

static final Clinit _unused = new Clinit();

@@ -696,8 +696,8 @@ public interface Constants {
instExcs[INSTANCEOF] = ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION;
instFlags[MULTIANEWARRAY] = CP_INST | LOADCLASS_INST | EXCEPTION_THROWER | INDEXED;
instExcs[MULTIANEWARRAY] = ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION_ANEWARRAY; // fixme i think this is a
// stackproducer, old
// bcel says no...
// stackproducer, old
// bcel says no...

instFlags[GETFIELD] = EXCEPTION_THROWER | CP_INST | LOADCLASS_INST | INDEXED;
instExcs[GETFIELD] = ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION_GETFIELD_PUTFIELD;

+ 86
- 97
bcel-builder/src/org/aspectj/apache/bcel/ExceptionConstants.java Переглянути файл

@@ -56,104 +56,93 @@ package org.aspectj.apache.bcel;

/**
* Exception constants.
*
* @version $Id: ExceptionConstants.java,v 1.4 2009/09/09 19:56:20 aclement Exp $
* @author <A HREF="http://www.inf.fu-berlin.de/~ehaase">E. Haase</A>
*
* @version $Id: ExceptionConstants.java,v 1.5 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="http://www.inf.fu-berlin.de/~ehaase">E. Haase</A>
*/
public interface ExceptionConstants {
/** The mother of all exceptions
*/
public static final Class<Throwable> THROWABLE = Throwable.class;

/** Super class of any run-time exception
*/
public static final Class<RuntimeException> RUNTIME_EXCEPTION = RuntimeException.class;

/** Super class of any linking exception (aka Linkage Error)
*/
public static final Class<LinkageError> LINKING_EXCEPTION = LinkageError.class;

/** Linking Exceptions
*/
public static final Class<ClassCircularityError> CLASS_CIRCULARITY_ERROR = ClassCircularityError.class;
public static final Class<ClassFormatError> CLASS_FORMAT_ERROR = ClassFormatError.class;
public static final Class<ExceptionInInitializerError> EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class;
public static final Class<IncompatibleClassChangeError> INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class;
public static final Class<AbstractMethodError> ABSTRACT_METHOD_ERROR = AbstractMethodError.class;
public static final Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class;
public static final Class<InstantiationError> INSTANTIATION_ERROR = InstantiationError.class;
public static final Class<NoSuchFieldError> NO_SUCH_FIELD_ERROR = NoSuchFieldError.class;
public static final Class<NoSuchMethodError> NO_SUCH_METHOD_ERROR = NoSuchMethodError.class;
public static final Class<NoClassDefFoundError> NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class;
public static final Class<UnsatisfiedLinkError> UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class;
public static final Class<VerifyError> VERIFY_ERROR = VerifyError.class;

/* UnsupportedClassVersionError is new in JDK 1.2 */
//public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class;

/** Run-Time Exceptions
*/
public static final Class<NullPointerException> NULL_POINTER_EXCEPTION = NullPointerException.class;
public static final Class<ArrayIndexOutOfBoundsException> ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class;
public static final Class<ArithmeticException> ARITHMETIC_EXCEPTION = ArithmeticException.class;
public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class;
public static final Class<ClassCastException> CLASS_CAST_EXCEPTION = ClassCastException.class;
public static final Class<IllegalMonitorStateException> ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class;

/** Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual
* Machine Specification
*/
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = {
NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR,
EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR
}; // Chapter 5.1
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION_MULTIANEWARRAY = {
NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR,
EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR,NEGATIVE_ARRAY_SIZE_EXCEPTION,ILLEGAL_ACCESS_ERROR
};
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION_ANEWARRAY = {
NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR,
EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR,NEGATIVE_ARRAY_SIZE_EXCEPTION
}; // Chapter 5.1
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION_CHECKCAST = {
NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR,
EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR,CLASS_CAST_EXCEPTION
}; // Chapter 5.1
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION_FOR_ALLOCATIONS= {
NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR,
EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR, INSTANTIATION_ERROR,ILLEGAL_ACCESS_ERROR
};

public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = {
NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR
}; // Chapter 5.2

public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION_GETFIELD_PUTFIELD = {
NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR,INCOMPATIBLE_CLASS_CHANGE_ERROR,NULL_POINTER_EXCEPTION
};
public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION_GETSTATIC_PUTSTATIC = {
NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR,INCOMPATIBLE_CLASS_CHANGE_ERROR
};

public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION_INVOKEINTERFACE = {
INCOMPATIBLE_CLASS_CHANGE_ERROR,ILLEGAL_ACCESS_ERROR,ABSTRACT_METHOD_ERROR,UNSATISFIED_LINK_ERROR
};
public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION_INVOKESPECIAL_INVOKEVIRTUAL = {
INCOMPATIBLE_CLASS_CHANGE_ERROR,NULL_POINTER_EXCEPTION,ABSTRACT_METHOD_ERROR,UNSATISFIED_LINK_ERROR
};

public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION_INVOKESTATIC = {
INCOMPATIBLE_CLASS_CHANGE_ERROR,UNSATISFIED_LINK_ERROR
};


public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below)
public static final Class[] EXCS_STRING_RESOLUTION = new Class[0];
// Chapter 5.4 (no errors but the ones that _always_ could happen! How stupid.)

public static final Class[] EXCS_ARRAY_EXCEPTION = {
NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION
};
/**
* The mother of all exceptions
*/
public static final Class<Throwable> THROWABLE = Throwable.class;

/**
* Super class of any run-time exception
*/
public static final Class<RuntimeException> RUNTIME_EXCEPTION = RuntimeException.class;

/**
* Super class of any linking exception (aka Linkage Error)
*/
public static final Class<LinkageError> LINKING_EXCEPTION = LinkageError.class;

/**
* Linking Exceptions
*/
public static final Class<ClassCircularityError> CLASS_CIRCULARITY_ERROR = ClassCircularityError.class;
public static final Class<ClassFormatError> CLASS_FORMAT_ERROR = ClassFormatError.class;
public static final Class<ExceptionInInitializerError> EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class;
public static final Class<IncompatibleClassChangeError> INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class;
public static final Class<AbstractMethodError> ABSTRACT_METHOD_ERROR = AbstractMethodError.class;
public static final Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class;
public static final Class<InstantiationError> INSTANTIATION_ERROR = InstantiationError.class;
public static final Class<NoSuchFieldError> NO_SUCH_FIELD_ERROR = NoSuchFieldError.class;
public static final Class<NoSuchMethodError> NO_SUCH_METHOD_ERROR = NoSuchMethodError.class;
public static final Class<NoClassDefFoundError> NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class;
public static final Class<UnsatisfiedLinkError> UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class;
public static final Class<VerifyError> VERIFY_ERROR = VerifyError.class;

/* UnsupportedClassVersionError is new in JDK 1.2 */
// public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class;
/**
* Run-Time Exceptions
*/
public static final Class<NullPointerException> NULL_POINTER_EXCEPTION = NullPointerException.class;
public static final Class<ArrayIndexOutOfBoundsException> ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class;
public static final Class<ArithmeticException> ARITHMETIC_EXCEPTION = ArithmeticException.class;
public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class;
public static final Class<ClassCastException> CLASS_CAST_EXCEPTION = ClassCastException.class;
public static final Class<IllegalMonitorStateException> ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class;

/**
* Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual Machine Specification
*/
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR,
ABSTRACT_METHOD_ERROR, EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR }; // Chapter 5.1
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION_MULTIANEWARRAY = { NO_CLASS_DEF_FOUND_ERROR,
CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR, EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR,
NEGATIVE_ARRAY_SIZE_EXCEPTION, ILLEGAL_ACCESS_ERROR };
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION_ANEWARRAY = { NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR,
VERIFY_ERROR, ABSTRACT_METHOD_ERROR, EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR,
NEGATIVE_ARRAY_SIZE_EXCEPTION }; // Chapter 5.1
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION_CHECKCAST = { NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR,
VERIFY_ERROR, ABSTRACT_METHOD_ERROR, EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR, CLASS_CAST_EXCEPTION }; // Chapter
// 5.1
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION_FOR_ALLOCATIONS = { NO_CLASS_DEF_FOUND_ERROR,
CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR, EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR,
INSTANTIATION_ERROR, ILLEGAL_ACCESS_ERROR };

public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR,
NO_SUCH_METHOD_ERROR }; // Chapter 5.2

public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION_GETFIELD_PUTFIELD = { NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR,
NO_SUCH_METHOD_ERROR, INCOMPATIBLE_CLASS_CHANGE_ERROR, NULL_POINTER_EXCEPTION };

public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION_GETSTATIC_PUTSTATIC = { NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR,
NO_SUCH_METHOD_ERROR, INCOMPATIBLE_CLASS_CHANGE_ERROR };

public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION_INVOKEINTERFACE = { INCOMPATIBLE_CLASS_CHANGE_ERROR,
ILLEGAL_ACCESS_ERROR, ABSTRACT_METHOD_ERROR, UNSATISFIED_LINK_ERROR };
public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION_INVOKESPECIAL_INVOKEVIRTUAL = { INCOMPATIBLE_CLASS_CHANGE_ERROR,
NULL_POINTER_EXCEPTION, ABSTRACT_METHOD_ERROR, UNSATISFIED_LINK_ERROR };

public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION_INVOKESTATIC = { INCOMPATIBLE_CLASS_CHANGE_ERROR,
UNSATISFIED_LINK_ERROR };

public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below)
public static final Class[] EXCS_STRING_RESOLUTION = new Class[0];
// Chapter 5.4 (no errors but the ones that _always_ could happen! How stupid.)

public static final Class[] EXCS_ARRAY_EXCEPTION = { NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION };

}

+ 4
- 0
bcel-builder/src/org/aspectj/apache/bcel/classfile/ConstantPool.java Переглянути файл

@@ -197,6 +197,10 @@ public class ConstantPool implements Node {
return constantToString(c);
}

public String constantToString(int index) {
return constantToString(getConstant(index));
}

public void accept(ClassVisitor v) {
v.visitConstantPool(this);
}

+ 2
- 2
bcel-builder/src/org/aspectj/apache/bcel/classfile/JavaClass.java Переглянути файл

@@ -80,7 +80,7 @@ import org.aspectj.apache.bcel.util.SyntheticRepository;
* The intent of this class is to represent a parsed or otherwise existing class file. Those interested in programatically
* generating classes should see the <a href="../generic/ClassGen.html">ClassGen</a> class.
*
* @version $Id: JavaClass.java,v 1.18 2009/09/10 03:59:33 aclement Exp $
* @version $Id: JavaClass.java,v 1.19 2009/09/14 20:29:10 aclement Exp $
* @see org.aspectj.apache.bcel.generic.ClassGen
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
@@ -387,7 +387,7 @@ public class JavaClass extends Modifiers implements Cloneable, Node {
return null;
}

public Method getMethod(java.lang.reflect.Constructor c) {
public Method getMethod(java.lang.reflect.Constructor<?> c) {
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
if (method.getName().equals("<init>") && c.getModifiers() == method.getModifiers()

+ 14
- 25
bcel-builder/src/org/aspectj/apache/bcel/classfile/Utility.java Переглянути файл

@@ -59,7 +59,6 @@ import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.aspectj.apache.bcel.Constants;
@@ -76,7 +75,7 @@ import org.aspectj.apache.bcel.util.ByteSequence;
/**
* Utility functions that do not really belong to any class in particular.
*
* @version $Id: Utility.java,v 1.10 2009/09/10 03:59:33 aclement Exp $
* @version $Id: Utility.java,v 1.11 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*
* modified: Andy Clement 2-mar-05 Removed unnecessary static and optimized
@@ -615,10 +614,7 @@ public abstract class Utility {
* RuntimeInvisibleParameterAnnotations
*/
// OPTIMIZE looks heavyweight?
public static Attribute[] getParameterAnnotationAttributes(ConstantPool cp, List[] /*
* Array of lists, array size depends on
* #params
*/vec) {
public static Attribute[] getParameterAnnotationAttributes(ConstantPool cp, List<AnnotationGen>[] vec) {

int visCount[] = new int[vec.length];
int totalVisCount = 0;
@@ -627,10 +623,9 @@ public abstract class Utility {
try {

for (int i = 0; i < vec.length; i++) {
List l = vec[i];
List<AnnotationGen> l = vec[i];
if (l != null) {
for (Iterator iter = l.iterator(); iter.hasNext();) {
AnnotationGen element = (AnnotationGen) iter.next();
for (AnnotationGen element : l) {
if (element.isRuntimeVisible()) {
visCount[i]++;
totalVisCount++;
@@ -650,9 +645,8 @@ public abstract class Utility {
for (int i = 0; i < vec.length; i++) {
rvaDos.writeShort(visCount[i]);
if (visCount[i] > 0) {
List l = vec[i];
for (Iterator iter = l.iterator(); iter.hasNext();) {
AnnotationGen element = (AnnotationGen) iter.next();
List<AnnotationGen> l = vec[i];
for (AnnotationGen element : l) {
if (element.isRuntimeVisible())
element.dump(rvaDos);
}
@@ -668,9 +662,8 @@ public abstract class Utility {
for (int i = 0; i < vec.length; i++) {
riaDos.writeShort(invisCount[i]);
if (invisCount[i] > 0) {
List l = vec[i];
for (Iterator iter = l.iterator(); iter.hasNext();) {
AnnotationGen element = (AnnotationGen) iter.next();
List<AnnotationGen> l = vec[i];
for (AnnotationGen element : l) {
if (!element.isRuntimeVisible())
element.dump(riaDos);
}
@@ -963,8 +956,7 @@ public abstract class Utility {
buf.append("\t");
case Constants.INSTANCEOF:
index = bytes.readUnsignedShort();
buf.append("\t<" + constant_pool.constantToString(index, Constants.CONSTANT_Class) + ">"
+ (verbose ? " (" + index + ")" : ""));
buf.append("\t<" + constant_pool.constantToString(index) + ">" + (verbose ? " (" + index + ")" : ""));
break;

// Operands are references to methods in constant pool
@@ -972,15 +964,14 @@ public abstract class Utility {
case Constants.INVOKESTATIC:
case Constants.INVOKEVIRTUAL:
index = bytes.readUnsignedShort();
buf.append("\t" + constant_pool.constantToString(index, Constants.CONSTANT_Methodref)
+ (verbose ? " (" + index + ")" : ""));
buf.append("\t" + constant_pool.constantToString(index) + (verbose ? " (" + index + ")" : ""));
break;

case Constants.INVOKEINTERFACE:
index = bytes.readUnsignedShort();
int nargs = bytes.readUnsignedByte(); // historical, redundant
buf.append("\t" + constant_pool.constantToString(index, Constants.CONSTANT_InterfaceMethodref)
+ (verbose ? " (" + index + ")\t" : "") + nargs + "\t" + bytes.readUnsignedByte()); // Last byte is a reserved
buf.append("\t" + constant_pool.constantToString(index) + (verbose ? " (" + index + ")\t" : "") + nargs + "\t"
+ bytes.readUnsignedByte()); // Last byte is a reserved
// space
break;

@@ -988,14 +979,12 @@ public abstract class Utility {
case Constants.LDC_W:
case Constants.LDC2_W:
index = bytes.readUnsignedShort();
buf.append("\t\t" + constant_pool.constantToString(index, constant_pool.getConstant(index).getTag())
+ (verbose ? " (" + index + ")" : ""));
buf.append("\t\t" + constant_pool.constantToString(index) + (verbose ? " (" + index + ")" : ""));
break;

case Constants.LDC:
index = bytes.readUnsignedByte();
buf.append("\t\t" + constant_pool.constantToString(index, constant_pool.getConstant(index).getTag())
+ (verbose ? " (" + index + ")" : ""));
buf.append("\t\t" + constant_pool.constantToString(index) + (verbose ? " (" + index + ")" : ""));
break;

// Array of references

+ 12
- 29
bcel-builder/src/org/aspectj/apache/bcel/generic/FieldGen.java Переглянути файл

@@ -72,7 +72,7 @@ import org.aspectj.apache.bcel.classfile.annotation.RuntimeAnnotations;
* Template class for building up a field. The only extraordinary thing one can do is to add a constant value attribute to a field
* (which must of course be compatible with the declared type).
*
* @version $Id: FieldGen.java,v 1.7 2009/09/09 21:26:54 aclement Exp $
* @version $Id: FieldGen.java,v 1.8 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
* @see Field
*/
@@ -148,8 +148,8 @@ public class FieldGen extends FieldGenOrMethodGen {
*/
public Field getField() {
String signature = getSignature();
int name_index = cp.addUtf8(name);
int signature_index = cp.addUtf8(signature);
int nameIndex = cp.addUtf8(name);
int signatureIndex = cp.addUtf8(signature);

if (value != null) {
checkType(type);
@@ -159,7 +159,7 @@ public class FieldGen extends FieldGenOrMethodGen {

addAnnotationsAsAttribute(cp);

return new Field(modifiers, name_index, signature_index, getAttributesImmutable(), cp);
return new Field(modifiers, nameIndex, signatureIndex, getAttributesImmutable(), cp);
}

private int addConstant() {
@@ -194,44 +194,27 @@ public class FieldGen extends FieldGenOrMethodGen {
}

public String getInitialValue() {
if (value != null) {
return value.toString();
} else
return null;
return (value == null ? null : value.toString());
}

/**
* Return string representation close to declaration format, `public static final short MAX = 100', e.g..
*
* @return String representation of field
*/
@Override
public final String toString() {
String name, signature, access; // Short cuts to constant pool

access = Utility.accessToString(modifiers);
String access = Utility.accessToString(modifiers);
access = access.equals("") ? "" : (access + " ");
signature = type.toString();
name = getName();
String signature = type.toString();
String name = getName();

StringBuffer buf = new StringBuffer(access + signature + " " + name);
StringBuffer buf = new StringBuffer(access).append(signature).append(" ").append(name);
String value = getInitialValue();

if (value != null)
buf.append(" = " + value);
if (value != null) {
buf.append(" = ").append(value);
}
// TODO: Add attributes and annotations to the string

return buf.toString();
}

/**
* @return deep copy of this field
*/
public FieldGen copy(ConstantPool cp) {
FieldGen fg = (FieldGen) clone();

fg.setConstantPool(cp);
return fg;
}
}

+ 9
- 21
bcel-builder/src/org/aspectj/apache/bcel/generic/FieldGenOrMethodGen.java Переглянути файл

@@ -68,16 +68,16 @@ import org.aspectj.apache.bcel.classfile.annotation.RuntimeAnnotations;
/**
* Super class for FieldGen and MethodGen objects, since they have some methods in common!
*
* @version $Id: FieldGenOrMethodGen.java,v 1.6 2009/09/09 22:18:20 aclement Exp $
* @version $Id: FieldGenOrMethodGen.java,v 1.7 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
public abstract class FieldGenOrMethodGen extends Modifiers implements Cloneable {
public abstract class FieldGenOrMethodGen extends Modifiers {

protected String name;
protected Type type;
protected ConstantPool cp;
private ArrayList/* <Attribute> */<Attribute> attributeList = new ArrayList<Attribute>();
private ArrayList<AnnotationGen> annotationList = new ArrayList<AnnotationGen>();
private ArrayList<Attribute> attributeList = new ArrayList<Attribute>();
protected ArrayList<AnnotationGen> annotationList = new ArrayList<AnnotationGen>();

protected FieldGenOrMethodGen() {
}
@@ -118,6 +118,10 @@ public abstract class FieldGenOrMethodGen extends Modifiers implements Cloneable
attributeList.clear();
}

public List<AnnotationGen> getAnnotations() {
return annotationList;
}

public void addAnnotation(AnnotationGen ag) {
annotationList.add(ag);
}
@@ -130,7 +134,7 @@ public abstract class FieldGenOrMethodGen extends Modifiers implements Cloneable
annotationList.clear();
}

public List/* <Attribute> */<Attribute> getAttributes() {
public List<Attribute> getAttributes() {
return attributeList;
}

@@ -149,22 +153,6 @@ public abstract class FieldGenOrMethodGen extends Modifiers implements Cloneable
}
}

public AnnotationGen[] getAnnotations() {
AnnotationGen[] annotations = new AnnotationGen[annotationList.size()];
annotationList.toArray(annotations);
return annotations;
}

public abstract String getSignature();

// OPTIMIZE clone any use???
@Override
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
System.err.println(e);
return null;
}
}
}

+ 4
- 15
bcel-builder/src/org/aspectj/apache/bcel/generic/Instruction.java Переглянути файл

@@ -67,15 +67,12 @@ import com.sun.org.apache.bcel.internal.generic.BranchInstruction;
/**
* Abstract super class for all Java byte codes.
*
* @version $Id: Instruction.java,v 1.7 2008/08/28 00:06:23 aclement Exp $
* @version $Id: Instruction.java,v 1.8 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
public class Instruction implements Cloneable, Serializable, Constants {
public short opcode = -1;

private Instruction() {
}

public Instruction(short opcode) {
this.opcode = opcode;
}
@@ -270,6 +267,7 @@ public class Instruction implements Cloneable, Serializable, Constants {
void dispose() {
}

@Override
public boolean equals(Object that) {
if (!(that instanceof Instruction)) {
return false;
@@ -291,6 +289,7 @@ public class Instruction implements Cloneable, Serializable, Constants {
return false;
}

@Override
public int hashCode() {
int result = 17 + opcode * 37;
if (isConstantInstruction()) {
@@ -362,19 +361,10 @@ public class Instruction implements Cloneable, Serializable, Constants {
return false;
}

public java.lang.Class[] getExceptions() {
// fixme
return Constants.instExcs[opcode];
}

public boolean containsTarget(InstructionHandle ih) {
throw new IllegalStateException("Dont ask!!");
}

public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) {
throw new IllegalStateException("Dont ask!!");
}

public boolean isJsrInstruction() {
return (Constants.instFlags[opcode] & JSR_INSTRUCTION) != 0;
}
@@ -389,12 +379,10 @@ public class Instruction implements Cloneable, Serializable, Constants {

public boolean isStackProducer() {
return Constants.stackEntriesProduced[opcode] != 0;
// return ((Constants.instFlags[opcode]&STACK_PRODUCER)!=0);
}

public boolean isStackConsumer() {
return Constants.CONSUME_STACK[opcode] != 0;
// return ((Constants.instFlags[opcode]&STACK_CONSUMER)!=0);
}

public boolean isIndexedInstruction() {
@@ -442,6 +430,7 @@ public class Instruction implements Cloneable, Serializable, Constants {
}
}

@Override
public String toString() {
return toString(true);
}

+ 1
- 5
bcel-builder/src/org/aspectj/apache/bcel/generic/InstructionCP.java Переглянути файл

@@ -73,7 +73,7 @@ import com.sun.org.apache.bcel.internal.generic.LDC;
* @see LDC
* @see INVOKEVIRTUAL
*
* @version $Id: InstructionCP.java,v 1.4 2009/09/10 15:35:06 aclement Exp $
* @version $Id: InstructionCP.java,v 1.5 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
public class InstructionCP extends Instruction {
@@ -212,8 +212,4 @@ public class InstructionCP extends Instruction {
}
}

@Override
public Class[] getExceptions() {
return org.aspectj.apache.bcel.ExceptionConstants.EXCS_STRING_RESOLUTION;
}
}

+ 48
- 75
bcel-builder/src/org/aspectj/apache/bcel/generic/MethodGen.java Переглянути файл

@@ -84,7 +84,7 @@ import org.aspectj.apache.bcel.classfile.annotation.RuntimeParameterAnnotations;
* While generating code it may be necessary to insert NOP operations. You can use the `removeNOPs' method to get rid off them. The
* resulting method object can be obtained via the `getMethod()' method.
*
* @version $Id: MethodGen.java,v 1.13 2009/09/10 03:59:34 aclement Exp $
* @version $Id: MethodGen.java,v 1.14 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
* @author <A HREF="http://www.vmeng.com/beard">Patrick C. Beard</A> [setMaxStack()]
* @see InstructionList
@@ -106,9 +106,9 @@ public class MethodGen extends FieldGenOrMethodGen {
private ArrayList<LocalVariableGen> localVariablesList = new ArrayList<LocalVariableGen>();
private ArrayList<LineNumberGen> lineNumbersList = new ArrayList<LineNumberGen>();
private ArrayList<CodeExceptionGen> exceptionsList = new ArrayList<CodeExceptionGen>();
private ArrayList<String> throws_vec = new ArrayList<String>();
private ArrayList<String> exceptionsThrown = new ArrayList<String>();
private ArrayList<Attribute> codeAttributesList = new ArrayList<Attribute>();
private List[] param_annotations; // Array of lists containing AnnotationGen objects
private List<AnnotationGen>[] param_annotations; // Array of lists containing AnnotationGen objects
private boolean hasParameterAnnotations = false;
private boolean haveUnpackedParameterAnnotations = false;

@@ -216,25 +216,24 @@ public class MethodGen extends FieldGenOrMethodGen {
Attribute a = attributes[i];

if (a instanceof Code) {
Code c = (Code) a;
setMaxStack(c.getMaxStack());
setMaxLocals(c.getMaxLocals());
Code code = (Code) a;
setMaxStack(code.getMaxStack());
setMaxLocals(code.getMaxLocals());

CodeException[] ces = c.getExceptionTable();
CodeException[] ces = code.getExceptionTable();

InstructionHandle[] arrayOfInstructions = il.getInstructionsAsArray();

// process the exception table
// -
if (ces != null) {
for (int j = 0; j < ces.length; j++) {
CodeException ce = ces[j];
for (CodeException ce : ces) {
int type = ce.getCatchType();
ObjectType c_type = null;
ObjectType catchType = null;

if (type > 0) {
String cen = m.getConstantPool().getConstantString_CONSTANTClass(type);
c_type = new ObjectType(cen);
catchType = new ObjectType(cen);
}

int end_pc = ce.getEndPC();
@@ -250,11 +249,11 @@ public class MethodGen extends FieldGenOrMethodGen {
}

addExceptionHandler(il.findHandle(ce.getStartPC(), arrayOfInstructions), end, il.findHandle(ce
.getHandlerPC(), arrayOfInstructions), c_type);
.getHandlerPC(), arrayOfInstructions), catchType);
}
}

Attribute[] codeAttrs = c.getAttributes();
Attribute[] codeAttrs = code.getAttributes();
for (int j = 0; j < codeAttrs.length; j++) {
a = codeAttrs[j];

@@ -333,45 +332,30 @@ public class MethodGen extends FieldGenOrMethodGen {
} else if (a instanceof RuntimeAnnotations) {
RuntimeAnnotations runtimeAnnotations = (RuntimeAnnotations) a;
List<AnnotationGen> l = runtimeAnnotations.getAnnotations();
for (Iterator<AnnotationGen> it = l.iterator(); it.hasNext();) {
AnnotationGen element = it.next();
addAnnotation(new AnnotationGen(element, cp, false));
}
annotationList.addAll(l);
// for (Iterator<AnnotationGen> it = l.iterator(); it.hasNext();) {
// AnnotationGen element = it.next();
// addAnnotation(new AnnotationGen(element, cp, false));
// }
} else {
addAttribute(a);
}
}
}

/**
* Adds a local variable to this method.
*
* @param name variable name
* @param type variable type
* @param slot the index of the local variable, if type is long or double, the next available index is slot+2
* @param start from where the variable is valid
* @param end until where the variable is valid
* @return new local variable object
* @see LocalVariable
*/
public LocalVariableGen addLocalVariable(String name, Type type, int slot, InstructionHandle start, InstructionHandle end) {
// byte t = type.getType();
// if (t != Constants.T_ADDRESS) {
int size = type.getSize();
if (slot + size > maxLocals)
if (slot + size > maxLocals) {
maxLocals = slot + size;
}
LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end);
int i = localVariablesList.indexOf(l);
if (i >= 0)
if (i >= 0) {
localVariablesList.set(i, l); // Overwrite if necessary
else
} else {
localVariablesList.add(l);
}
return l;
// } else {
// throw new IllegalArgumentException("Can not use " + type +
// " as type for local variable");
//
// }
}

/**
@@ -587,29 +571,29 @@ public class MethodGen extends FieldGenOrMethodGen {
* @param class_name (fully qualified) name of exception
*/
public void addException(String class_name) {
throws_vec.add(class_name);
exceptionsThrown.add(class_name);
}

/**
* Remove an exception.
*/
public void removeException(String c) {
throws_vec.remove(c);
exceptionsThrown.remove(c);
}

/**
* Remove all exceptions.
*/
public void removeExceptions() {
throws_vec.clear();
exceptionsThrown.clear();
}

/*
* @return array of thrown exceptions
*/
public String[] getExceptions() {
String[] e = new String[throws_vec.size()];
throws_vec.toArray(e);
String[] e = new String[exceptionsThrown.size()];
exceptionsThrown.toArray(e);
return e;
}

@@ -617,12 +601,12 @@ public class MethodGen extends FieldGenOrMethodGen {
* @return `Exceptions' attribute of all the exceptions thrown by this method.
*/
private ExceptionTable getExceptionTable(ConstantPool cp) {
int size = throws_vec.size();
int size = exceptionsThrown.size();
int[] ex = new int[size];

try {
for (int i = 0; i < size; i++)
ex[i] = cp.addClass(throws_vec.get(i));
ex[i] = cp.addClass(exceptionsThrown.get(i));
} catch (ArrayIndexOutOfBoundsException e) {
}

@@ -742,7 +726,7 @@ public class MethodGen extends FieldGenOrMethodGen {

ExceptionTable et = null;

if (throws_vec.size() > 0)
if (exceptionsThrown.size() > 0)
addAttribute(et = getExceptionTable(cp)); // Add `Exceptions' if there are "throws" clauses

Method m = new Method(modifiers, name_index, signature_index, getAttributesImmutable(), cp);
@@ -824,7 +808,7 @@ public class MethodGen extends FieldGenOrMethodGen {

public String[] getArgumentNames() {
if (parameterNames != null)
return (String[]) parameterNames.clone();
return parameterNames.clone();
else
return new String[0];
}
@@ -845,6 +829,7 @@ public class MethodGen extends FieldGenOrMethodGen {
this.il = il;
}

@Override
public String getSignature() {
return Utility.toMethodSignature(type, parameterTypes);
}
@@ -1014,6 +999,7 @@ public class MethodGen extends FieldGenOrMethodGen {
*
* @return String representation of the method.
*/
@Override
public final String toString() {
String access = Utility.accessToString(modifiers);
String signature = Utility.toMethodSignature(type, parameterTypes);
@@ -1022,29 +1008,14 @@ public class MethodGen extends FieldGenOrMethodGen {

StringBuffer buf = new StringBuffer(signature);

if (throws_vec.size() > 0) {
for (Iterator<String> e = throws_vec.iterator(); e.hasNext();)
if (exceptionsThrown.size() > 0) {
for (Iterator<String> e = exceptionsThrown.iterator(); e.hasNext();)
buf.append("\n\t\tthrows " + e.next());
}

return buf.toString();
}

/**
* @return deep copy of this method
*/
public MethodGen copy(String class_name, ConstantPool cp) {
Method m = ((MethodGen) clone()).getMethod();
MethodGen mg = new MethodGen(m, class_name, this.cp);

if (this.cp != cp) {
mg.setConstantPool(cp);
mg.getInstructionList().replaceConstantPool(this.cp, cp);
}

return mg;
}

// J5TODO: Should param_annotations be an array of arrays? Rather than an array of lists, this
// is more likely to suggest to the caller it is readonly (which a List does not).
/**
@@ -1064,22 +1035,22 @@ public class MethodGen extends FieldGenOrMethodGen {
* object out of this MethodGen object).
*/
private void ensureExistingParameterAnnotationsUnpacked() {
if (haveUnpackedParameterAnnotations)
if (haveUnpackedParameterAnnotations) {
return;
}
// Find attributes that contain parameter annotation data
List<Attribute> attrs = getAttributes();
RuntimeParameterAnnotations paramAnnVisAttr = null;
RuntimeParameterAnnotations paramAnnInvisAttr = null;
List accumulatedAnnotations = new ArrayList();
for (int i = 0; i < attrs.size(); i++) {
Attribute attribute = attrs.get(i);

for (Attribute attribute : attrs) {
if (attribute instanceof RuntimeParameterAnnotations) {

// Initialize param_annotations
if (!hasParameterAnnotations) {
param_annotations = new List[parameterTypes.length];
for (int j = 0; j < parameterTypes.length; j++)
param_annotations[j] = new ArrayList();
for (int j = 0; j < parameterTypes.length; j++) {
param_annotations[j] = new ArrayList<AnnotationGen>();
}
}

hasParameterAnnotations = true;
@@ -1090,11 +1061,13 @@ public class MethodGen extends FieldGenOrMethodGen {
paramAnnInvisAttr = rpa;
for (int j = 0; j < parameterTypes.length; j++) {
// This returns Annotation[] ...
AnnotationGen[] immutableArray = rpa.getAnnotationsOnParameter(j);
AnnotationGen[] annos = rpa.getAnnotationsOnParameter(j);
// ... which needs transforming into an AnnotationGen[] ...
List<AnnotationGen> mutable = makeMutableVersion(immutableArray);
// List<AnnotationGen> mutable = makeMutableVersion(immutableArray);
// ... then add these to any we already know about
param_annotations[j].addAll(mutable);
for (AnnotationGen anAnnotation : annos) {
param_annotations[j].add(anAnnotation);
}
}
}
}
@@ -1105,7 +1078,7 @@ public class MethodGen extends FieldGenOrMethodGen {
haveUnpackedParameterAnnotations = true;
}

private List /* AnnotationGen */<AnnotationGen>makeMutableVersion(AnnotationGen[] mutableArray) {
private List /* AnnotationGen */<AnnotationGen> makeMutableVersion(AnnotationGen[] mutableArray) {
List<AnnotationGen> result = new ArrayList<AnnotationGen>();
for (int i = 0; i < mutableArray.length; i++) {
result.add(new AnnotationGen(mutableArray[i], getConstantPool(), false));

+ 15
- 4
bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/util/BCELFactory.java Переглянути файл

@@ -85,7 +85,7 @@ import org.aspectj.apache.bcel.verifier.InstructionWalker;
* Factory creates il.append() statements, and sets instruction targets. A helper class for BCELifier.
*
* @see BCELifier
* @version $Id: BCELFactory.java,v 1.5 2009/09/09 19:56:20 aclement Exp $
* @version $Id: BCELFactory.java,v 1.6 2009/09/14 20:29:10 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
@@ -99,7 +99,8 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
_out = out;
}

private final HashMap<Instruction, InstructionHandle> branch_map = new HashMap<Instruction, InstructionHandle>(); // Map<Instruction, InstructionHandle>
private final HashMap<Instruction, InstructionHandle> branch_map = new HashMap<Instruction, InstructionHandle>(); // Map<Instruction,
// InstructionHandle>

public void start() {
if (!_mg.isAbstract() && !_mg.isNative()) {
@@ -134,7 +135,7 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
short opcode = i.getOpcode();

if (InstructionConstants.INSTRUCTIONS[opcode] != null && !i.isConstantInstruction() && !i.isReturnInstruction()) { // Handled
// below
// below
_out.println("il.append(InstructionConstants." + i.getName().toUpperCase() + ");");
return true;
}
@@ -154,6 +155,7 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
}
}

@Override
public void visitArrayInstruction(Instruction i) {
short opcode = i.getOpcode();
Type type = i.getType(_cp);
@@ -173,6 +175,7 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
+ BCELifier.printType(type) + ", " + "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase() + "));");
}

@Override
public void visitInvokeInstruction(InvokeInstruction i) {
short opcode = i.getOpcode();
String class_name = i.getClassName(_cp);
@@ -185,6 +188,7 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
+ Constants.OPCODE_NAMES[opcode].toUpperCase() + "));");
}

@Override
public void visitAllocationInstruction(Instruction i) {
Type type;

@@ -204,7 +208,6 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {

case Constants.MULTIANEWARRAY:
dim = ((MULTIANEWARRAY) i).getDimensions();

case Constants.ANEWARRAY:
case Constants.NEWARRAY:
_out.println("il.append(_factory.createNewArray(" + BCELifier.printType(type) + ", (short) " + dim + "));");
@@ -227,30 +230,36 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
_out.println("il.append(new PUSH(_cp, " + embed + "));");
}

@Override
public void visitLDC(Instruction i) {
createConstant(i.getValue(_cp));
}

@Override
public void visitLDC2_W(Instruction i) {
createConstant(i.getValue(_cp));
}

@Override
public void visitConstantPushInstruction(Instruction i) {
createConstant(i.getValue());
}

@Override
public void visitINSTANCEOF(Instruction i) {
Type type = i.getType(_cp);

_out.println("il.append(new INSTANCEOF(_cp.addClass(" + BCELifier.printType(type) + ")));");
}

@Override
public void visitCHECKCAST(Instruction i) {
Type type = i.getType(_cp);

_out.println("il.append(_factory.createCheckCast(" + BCELifier.printType(type) + "));");
}

@Override
public void visitReturnInstruction(Instruction i) {
Type type = i.getType(_cp);

@@ -260,6 +269,7 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
// Memorize BranchInstructions that need an update
private final ArrayList<InstructionBranch> branches = new ArrayList<InstructionBranch>();

@Override
public void visitBranchInstruction(InstructionBranch bi) {
BranchHandle bh = (BranchHandle) branch_map.get(bi);
int pos = bh.getPosition();
@@ -315,6 +325,7 @@ class BCELFactory extends org.aspectj.apache.bcel.verifier.EmptyInstVisitor {
}
}

@Override
public void visitRET(RET i) {
_out.println("il.append(new RET(" + i.getIndex() + ")));");
}

Завантаження…
Відмінити
Зберегти