enver 2002/06/13 02:32:51
Modified: src/java/org/apache/bcel Repository.java
src/java/org/apache/bcel/util ClassLoader.java
src/java/org/apache/bcel/verifier VerificationResult.java
Verifier.java VerifierAppFrame.java
src/java/org/apache/bcel/verifier/exc
ClassConstraintException.java
InvalidMethodException.java LoadingException.java
src/java/org/apache/bcel/verifier/statics
LocalVariableInfo.java LocalVariablesInfo.java
Pass1Verifier.java Pass2Verifier.java
Pass3aVerifier.java
Log:
* Cleaned up the verifier (and some other) classes so that IntelliJ's
IDEA and also (I suppose) JTest will not complain any more.
Revision Changes Path
1.9 +5 -3 jakarta-bcel/src/java/org/apache/bcel/Repository.java
Index: Repository.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/Repository.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- Repository.java 6 Jun 2002 11:31:17 -0000 1.8
+++ Repository.java 13 Jun 2002 09:32:50 -0000 1.9
@@ -58,7 +58,7 @@
import org.apache.bcel.util.*;
import java.io.*;
-/**
+/**
* The repository maintains informations about class interdependencies, e.g.,
* whether a class is a sub-class of another. Delegates actual class loading
* to SyntheticRepository.
@@ -130,9 +130,11 @@
_repository.removeClass(clazz);
}
+ /*
private static final JavaClass getSuperClass(JavaClass clazz) {
return clazz.getSuperClass();
}
+ */
/**
* @return list of super classes of clazz in ascending order, i.e.,
@@ -183,7 +185,7 @@
public static boolean instanceOf(String clazz, String super_class) {
return instanceOf(lookupClass(clazz), lookupClass(super_class));
}
-
+
/**
* @return true, if clazz is an instance of super_class
*/
1.6 +1 -3 jakarta-bcel/src/java/org/apache/bcel/util/ClassLoader.java
Index: ClassLoader.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/util/ClassLoader.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ClassLoader.java 6 Jun 2002 11:33:20 -0000 1.5
+++ ClassLoader.java 13 Jun 2002 09:32:50 -0000 1.6
@@ -56,10 +56,8 @@
import java.util.Hashtable;
import java.io.*;
-import java.util.zip.*;
import org.apache.bcel.*;
import org.apache.bcel.classfile.*;
-import org.apache.bcel.generic.*;
/**
* <p>Drop in replacement for the standard class loader of the JVM. You can use it
1.2 +1 -4 jakarta-bcel/src/java/org/apache/bcel/verifier/VerificationResult.java
Index: VerificationResult.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/VerificationResult.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- VerificationResult.java 29 Oct 2001 20:00:31 -0000 1.1
+++ VerificationResult.java 13 Jun 2002 09:32:50 -0000 1.2
@@ -96,9 +96,6 @@
/** The detailed message. */
private String detailMessage;
- /** This class is not no-args instantiable. */
- private VerificationResult(){}
-
/** The usual constructor. */
public VerificationResult(int status, String message){
numeric = status;
1.5 +10 -20 jakarta-bcel/src/java/org/apache/bcel/verifier/Verifier.java
Index: Verifier.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/Verifier.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Verifier.java 8 May 2002 20:59:29 -0000 1.4
+++ Verifier.java 13 Jun 2002 09:32:50 -0000 1.5
@@ -56,12 +56,8 @@
import org.apache.bcel.*;
import org.apache.bcel.classfile.*;
-import org.apache.bcel.generic.*;
-import org.apache.bcel.util.*;
import org.apache.bcel.verifier.statics.*;
import org.apache.bcel.verifier.structurals.*;
-import org.apache.bcel.verifier.exc.*;
-import org.apache.bcel.verifier.exc.Utility; // Ambigous if not declared explicitely.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -76,7 +72,7 @@
*
* A Verifier creates PassVerifier instances to perform the actual verification.
* Verifier instances are usually generated by the VerifierFactory.
- *
+ *
* @version $Id$
* @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
* @see org.apache.bcel.verifier.VerifierFactory
@@ -112,7 +108,7 @@
}
return p2v.verify();
}
-
+
/** Returns the VerificationResult for the given pass. */
public VerificationResult doPass3a(int method_no){
String key = Integer.toString(method_no);
@@ -136,13 +132,7 @@
}
return p3bv.verify();
}
-
- /**
- * This class may not be no-args instantiated.
- */
- private Verifier(){
- classname = ""; // never executed anyway, make compiler happy.
- }// not noargs-instantiable
+
/**
* Instantiation is done by the VerifierFactory.
@@ -230,7 +220,7 @@
for (int i=0; i< messages.size(); i++){
ret[i] = (String) messages.get(i);
}
-
+
return ret;
}
@@ -252,14 +242,14 @@
int dotclasspos = args[k].lastIndexOf(".class");
if (dotclasspos != -1) args[k] = args[k].substring(0,dotclasspos);
}
-
+
args[k] = args[k].replace('/', '.');
-
+
System.out.println("Now verifiying: "+args[k]+"\n");
Verifier v = VerifierFactory.getVerifier(args[k]);
VerificationResult vr;
-
+
vr = v.doPass1();
System.out.println("Pass 1:\n"+vr);
@@ -277,7 +267,7 @@
System.out.println("Pass 3b, method number "+i+" ['"+jc.getMethods()[i]+"']:\n"+vr);
}
}
-
+
System.out.println("Warnings:");
String[] warnings = v.getMessages();
if (warnings.length == 0) System.out.println("<none>");
@@ -286,7 +276,7 @@
}
System.out.println("\n");
-
+
// avoid swapping.
v.flush();
org.apache.bcel.Repository.clearCache();
1.3 +3 -1 jakarta-bcel/src/java/org/apache/bcel/verifier/VerifierAppFrame.java
Index: VerifierAppFrame.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/VerifierAppFrame.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- VerifierAppFrame.java 7 Feb 2002 23:12:59 -0000 1.2
+++ VerifierAppFrame.java 13 Jun 2002 09:32:50 -0000 1.3
@@ -291,10 +291,12 @@
pass2TextPane.setBackground(Color.green);
JavaClass jc = Repository.lookupClass(current_class);
+ /*
boolean all3aok = true;
boolean all3bok = true;
String all3amsg = "";
String all3bmsg = "";
+ */
String[] methodnames = new String[jc.getMethods().length];
for (int i=0; i<jc.getMethods().length; i++){
1.2 +1 -5 jakarta-bcel/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java
Index: ClassConstraintException.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ClassConstraintException.java 29 Oct 2001 20:00:33 -0000 1.1
+++ ClassConstraintException.java 13 Jun 2002 09:32:50 -0000 1.2
@@ -63,9 +63,6 @@
* @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class ClassConstraintException extends VerificationException{
- /** The specified error message. */
- private String detailMessage;
-
/**
* Constructs a new ClassConstraintException with null as its error message string.
*/
@@ -78,6 +75,5 @@
*/
public ClassConstraintException(String message){
super (message);
- detailMessage = message;
}
}
1.2 +1 -3 jakarta-bcel/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java
Index: InvalidMethodException.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- InvalidMethodException.java 29 Oct 2001 20:00:33 -0000 1.1
+++ InvalidMethodException.java 13 Jun 2002 09:32:50 -0000 1.2
@@ -61,8 +61,6 @@
* @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class InvalidMethodException extends RuntimeException{
- /** Must not be no-args requested so there's always some error message. */
- private InvalidMethodException(){}
/** Constructs an InvalidMethodException with the specified detail message. */
public InvalidMethodException(String message){
1.2 +2 -5 jakarta-bcel/src/java/org/apache/bcel/verifier/exc/LoadingException.java
Index: LoadingException.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/exc/LoadingException.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LoadingException.java 29 Oct 2001 20:00:33 -0000 1.1
+++ LoadingException.java 13 Jun 2002 09:32:50 -0000 1.2
@@ -62,9 +62,7 @@
* @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class LoadingException extends VerifierConstraintViolatedException{
- /** The specified error message. */
- private String detailMessage;
-
+
/**
* Constructs a new LoadingException with null as its error message string.
*/
@@ -77,6 +75,5 @@
*/
public LoadingException(String message){
super (message);
- detailMessage = message;
}
}
1.2 +1 -2 jakarta-bcel/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java
Index: LocalVariableInfo.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LocalVariableInfo.java 29 Oct 2001 20:00:34 -0000 1.1
+++ LocalVariableInfo.java 13 Jun 2002 09:32:50 -0000 1.2
@@ -54,7 +54,6 @@
* <http://www.apache.org/>.
*/
-import org.apache.bcel.Constants;
import org.apache.bcel.generic.Type;
import org.apache.bcel.verifier.exc.*;
import java.util.Hashtable;
1.2 +1 -8 jakarta-bcel/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java
Index: LocalVariablesInfo.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LocalVariablesInfo.java 29 Oct 2001 20:00:34 -0000 1.1
+++ LocalVariablesInfo.java 13 Jun 2002 09:32:50 -0000 1.2
@@ -54,7 +54,6 @@
* <http://www.apache.org/>.
*/
-import org.apache.bcel.Constants;
import org.apache.bcel.generic.Type;
import org.apache.bcel.verifier.exc.*;
@@ -71,12 +70,6 @@
/** The information about the local variables is stored here. */
private LocalVariableInfo[] localVariableInfos;
- /**
- * The ints in the list represent code offsets where either instructions must start
- * or the offset is the length of the code array. This will be verified in Pass 3a.
- */
- private IntList instruction_offsets = new IntList();
-
/** The constructor. */
LocalVariablesInfo(int max_locals){
localVariableInfos = new LocalVariableInfo[max_locals];
1.2 +1 -2 jakarta-bcel/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java
Index: Pass1Verifier.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Pass1Verifier.java 29 Oct 2001 20:00:35 -0000 1.1
+++ Pass1Verifier.java 13 Jun 2002 09:32:50 -0000 1.2
@@ -59,7 +59,6 @@
import org.apache.bcel.verifier.*;
import org.apache.bcel.verifier.exc.*;
import org.apache.bcel.verifier.exc.Utility;
-import java.util.ArrayList;
/**
* This PassVerifier verifies a class file according to pass 1 as
1.2 +53 -52 jakarta-bcel/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java
Index: Pass2Verifier.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Pass2Verifier.java 29 Oct 2001 20:00:36 -0000 1.1
+++ Pass2Verifier.java 13 Jun 2002 09:32:50 -0000 1.2
@@ -227,7 +227,6 @@
while (supidx != 0){
supidx = jc.getSuperclassNameIndex();
- ConstantPoolGen cpg = new ConstantPoolGen(jc.getConstantPool());
Method[] methods = jc.getMethods();
for (int i=0; i<methods.length; i++){
String name_and_sig = (methods[i].getName()+methods[i].getSignature());
@@ -277,9 +276,11 @@
*/
private class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor implements Visitor{
private Class CONST_Class;
- private Class CONST_Fieldref;
+ /*
+ private Class CONST_Fieldref;
private Class CONST_Methodref;
private Class CONST_InterfaceMethodref;
+ */
private Class CONST_String;
private Class CONST_Integer;
private Class CONST_Float;
@@ -296,16 +297,18 @@
private HashSet field_names = new HashSet();
private HashSet field_names_and_desc = new HashSet();
private HashSet method_names_and_desc = new HashSet();
-
+
private CPESSC_Visitor(JavaClass _jc){
jc = _jc;
cp = _jc.getConstantPool();
cplen = cp.getLength();
-
+
CONST_Class = org.apache.bcel.classfile.ConstantClass.class;
- CONST_Fieldref = org.apache.bcel.classfile.ConstantFieldref.class;
+ /*
+ CONST_Fieldref = org.apache.bcel.classfile.ConstantFieldref.class;
CONST_Methodref = org.apache.bcel.classfile.ConstantMethodref.class;
CONST_InterfaceMethodref = org.apache.bcel.classfile.ConstantInterfaceMethodref.class;
+ */
CONST_String = org.apache.bcel.classfile.ConstantString.class;
CONST_Integer = org.apache.bcel.classfile.ConstantInteger.class;
CONST_Float = org.apache.bcel.classfile.ConstantFloat.class;
@@ -313,18 +316,18 @@
CONST_Double = org.apache.bcel.classfile.ConstantDouble.class;
CONST_NameAndType = org.apache.bcel.classfile.ConstantNameAndType.class;
CONST_Utf8 = org.apache.bcel.classfile.ConstantUtf8.class;
-
+
carrier = new DescendingVisitor(_jc, this);
carrier.visit();
}
-
+
private void checkIndex(Node referrer, int index, Class shouldbe){
if ((index < 0) || (index >= cplen)){
throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'.");
}
Constant c = cp.getConstant(index);
if (! shouldbe.isInstance(c)){
- String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "."
+ /* String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." */
throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'.");
}
}
@@ -335,11 +338,11 @@
Attribute[] atts = obj.getAttributes();
boolean foundSourceFile = false;
boolean foundInnerClasses = false;
-
+
// Is there an InnerClass referenced?
// This is a costly check; existing verifiers don't do it!
boolean hasInnerClass = new InnerClassDetector(jc).innerClassReferenced();
-
+
for (int i=0; i<atts.length; i++){
if ((! (atts[i] instanceof SourceFile)) &&
(! (atts[i] instanceof Deprecated)) &&
@@ -347,12 +350,12 @@
(! (atts[i] instanceof Synthetic))){
addMessage("Attribute '"+tostring(atts[i])+"' as an attribute of the ClassFile structure '"+tostring(obj)+"' is unknown and will therefore be ignored.");
}
-
+
if (atts[i] instanceof SourceFile){
if (foundSourceFile == false) foundSourceFile = true;
else throw new ClassConstraintException("A ClassFile structure (like '"+tostring(obj)+"') may have no more than one SourceFile attribute."); //vmspec2 4.7.7
}
-
+
if (atts[i] instanceof InnerClasses){
if (foundInnerClasses == false) foundInnerClasses = true;
else{
@@ -372,7 +375,7 @@
//don't check it and javac doesn't satisfy it when it comes to anonymous
//inner classes
addMessage("A Classfile structure (like '"+tostring(obj)+"') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). No InnerClasses attribute was found.");
- }
+ }
}
/////////////////////////////
// CONSTANTS (vmspec2 4.4) //
@@ -382,7 +385,7 @@
throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'.");
}
checkIndex(obj, obj.getNameIndex(), CONST_Utf8);
-
+
}
public void visitConstantFieldref(ConstantFieldref obj){
if (obj.getTag() != Constants.CONSTANT_Fieldref){
@@ -462,7 +465,7 @@
if (maxone > 1){
throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set.");
}
-
+
if (obj.isFinal() && obj.isVolatile()){
throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set.");
}
@@ -484,7 +487,7 @@
}
checkIndex(obj, obj.getNameIndex(), CONST_Utf8);
-
+
String name = obj.getName();
if (! validFieldName(name)){
throw new ClassConstraintException("Field '"+tostring(obj)+"' has illegal name '"+obj.getName()+"'.");
@@ -492,16 +495,16 @@
// A descriptor is often named signature in BCEL
checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8);
-
+
String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor)
try{
- Type t = Type.getType(sig);
+ Type.getType(sig); /* Don't need the return value */
}
catch (ClassFormatError cfe){ // sometimes BCEL is a little harsh describing exceptional situations.
throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.");
}
-
+
String nameanddesc = (name+sig);
if (field_names_and_desc.contains(nameanddesc)){
throw new ClassConstraintException("No two fields (like '"+tostring(obj)+"') are allowed have same names and descriptors!");
@@ -511,7 +514,7 @@
}
field_names_and_desc.add(nameanddesc);
field_names.add(name);
-
+
Attribute[] atts = obj.getAttributes();
for (int i=0; i<atts.length; i++){
if ((! (atts[i] instanceof ConstantValue)) &&
@@ -530,7 +533,7 @@
public void visitMethod(Method obj){
checkIndex(obj, obj.getNameIndex(), CONST_Utf8);
-
+
String name = obj.getName();
if (! validMethodName(name, true)){
throw new ClassConstraintException("Method '"+tostring(obj)+"' has illegal name '"+name+"'.");
@@ -540,7 +543,7 @@
checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8);
String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Method's signature(=descriptor)
-
+
Type t;
Type[] ts; // needed below the try block.
try{
@@ -562,7 +565,7 @@
throw new ClassConstraintException("Method '"+tostring(obj)+"' has a return type that does not pass verification pass 1: '"+vr+"'.");
}
}
-
+
for (int i=0; i<ts.length; i++){
act = ts[i];
if (act instanceof ArrayType) act = ((ArrayType) act).getBasicType();
@@ -588,7 +591,7 @@
if (maxone > 1){
throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set.");
}
-
+
if (obj.isAbstract()){
if (obj.isFinal()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set.");
if (obj.isNative()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set.");
@@ -681,14 +684,14 @@
// zero or one SourceFile attr per ClassFile: see visitJavaClass()
checkIndex(obj, obj.getNameIndex(), CONST_Utf8);
-
+
String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes();
if (! name.equals("SourceFile")){
throw new ClassConstraintException("The SourceFile attribute '"+tostring(obj)+"' is not correctly named 'SourceFile' but '"+name+"'.");
}
checkIndex(obj, obj.getSourceFileIndex(), CONST_Utf8);
-
+
String sourcefilename = ((ConstantUtf8) cp.getConstant(obj.getSourceFileIndex())).getBytes(); //==obj.getSourceFileName() ?
String sourcefilenamelc = sourcefilename.toLowerCase();
@@ -717,7 +720,7 @@
public void visitInnerClasses(InnerClasses obj){//vmspec2 4.7.5
// exactly one InnerClasses attr per ClassFile if some inner class is refernced: see visitJavaClass()
-
+
checkIndex(obj, obj.getNameIndex(), CONST_Utf8);
String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes();
@@ -726,7 +729,7 @@
}
InnerClass[] ics = obj.getInnerClasses();
-
+
for (int i=0; i<ics.length; i++){
checkIndex(obj, ics[i].getInnerClassIndex(), CONST_Class);
int outer_idx = ics[i].getOuterClassIndex();
@@ -770,7 +773,7 @@
throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(obj)+"'.");
}
Constant c = cp.getConstant(index);
-
+
if (CONST_Long.isInstance(c) && field_type.equals(Type.LONG)){
return;
}
@@ -786,7 +789,7 @@
if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)){
return;
}
-
+
throw new ClassConstraintException("Illegal type of ConstantValue '"+obj+"' embedding Constant '"+c+"'. It is referenced by field '"+tostring(f)+"' expecting a different type: '"+field_type+"'.");
}
}
@@ -805,7 +808,7 @@
if (! name.equals("Code")){
throw new ClassConstraintException("The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'.");
}
-
+
Method m = null; // satisfy compiler
if (!(carrier.predecessor() instanceof Method)){
addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+carrier.predecessor()+"'. Ignored.");
@@ -829,7 +832,7 @@
ConstantClass cc = (ConstantClass) (cp.getConstant(exc_index));
checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // cannot be sure this ConstantClass has already been visited (checked)!
String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.');
-
+
Verifier v = VerifierFactory.getVerifier(cname);
VerificationResult vr = v.doPass1();
@@ -858,7 +861,7 @@
}
}
}
-
+
// Create object for local variables information
// This is highly unelegant due to usage of the Visitor pattern.
// TODO: rework it.
@@ -874,7 +877,7 @@
throw new AssertionViolatedException("Could not find a known BCEL Method object in the corresponding BCEL JavaClass object.");
}
localVariablesInfos[method_number] = new LocalVariablesInfo(obj.getMaxLocals());
-
+
int num_of_lvt_attribs = 0;
// Now iterate through the attributes the Code attribute has.
Attribute[] atts = obj.getAttributes();
@@ -886,13 +889,13 @@
else{// LineNumberTable or LocalVariableTable
addMessage("Attribute '"+tostring(atts[a])+"' as an attribute of Code attribute '"+tostring(obj)+"' (method '"+m+"') will effectively be ignored and is only useful for debuggers and such.");
}
-
+
//LocalVariableTable check (partially delayed to Pass3a).
//Here because its easier to collect the information of the
//(possibly more than one) LocalVariableTables belonging to
//one certain Code attribute.
if (atts[a] instanceof LocalVariableTable){ // checks conforming to vmspec2 4.7.9
-
+
LocalVariableTable lvt = (LocalVariableTable) atts[a];
checkIndex(lvt, lvt.getNameIndex(), CONST_Utf8);
@@ -903,7 +906,6 @@
}
Code code = obj;
- int max_locals = code.getMaxLocals();
//In JustIce, the check for correct offsets into the code array is delayed to Pass 3a.
LocalVariable[] localvariables = lvt.getLocalVariableTable();
@@ -928,7 +930,7 @@
if ( ( (t==Type.LONG || t==Type.DOUBLE)? localindex+1:localindex) >= code.getMaxLocals()){
throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariables[i])+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'.");
}
-
+
try{
localVariablesInfos[method_number].add(localindex, localname, localvariables[i].getStartPC(), localvariables[i].getLength(), t);
}
@@ -936,7 +938,7 @@
throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage());
}
}// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END
-
+
num_of_lvt_attribs++;
if (num_of_lvt_attribs > obj.getMaxLocals()){
throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.').");
@@ -944,7 +946,7 @@
}// if atts[a] instanceof LocalVariableTable END
}// for all attributes atts[a] END
}// visitCode(Code) END
-
+
public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4
// incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4)
checkIndex(obj, obj.getNameIndex(), CONST_Utf8);
@@ -953,16 +955,16 @@
if (! name.equals("Exceptions")){
throw new ClassConstraintException("The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'.");
}
-
+
int[] exc_indices = obj.getExceptionIndexTable();
for (int i=0; i<exc_indices.length; i++){
checkIndex(obj, exc_indices[i], CONST_Class);
-
+
ConstantClass cc = (ConstantClass) (cp.getConstant(exc_indices[i]));
checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // cannot be sure this ConstantClass has already been visited (checked)!
String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.'); //convert internal notation on-the-fly to external notation
-
+
Verifier v = VerifierFactory.getVerifier(cname);
VerificationResult vr = v.doPass1();
@@ -1019,7 +1021,7 @@
public void visitUnknown(Unknown obj){//vmspec2 4.7.1
// Represents an unknown attribute.
checkIndex(obj, obj.getNameIndex(), CONST_Utf8);
-
+
// Maybe only misnamed? Give a (warning) message.
addMessage("Unknown attribute '"+tostring(obj)+"'. This attribute is not known in any context!");
}
@@ -1036,7 +1038,7 @@
// Code constraints are checked in Pass3 (3a and 3b).
// This does not represent an Attribute but is only
// related to internal BCEL data representation.
-
+
// see visitCode(Code)
}
public void visitConstantPool(ConstantPool obj){
@@ -1086,10 +1088,8 @@
* @see org.apache.bcel.classfile.ConstantCP
*/
private class FAMRAV_Visitor extends EmptyVisitor implements Visitor{
- private final JavaClass jc;
private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work.
private FAMRAV_Visitor(JavaClass _jc){
- jc = _jc;
cp = _jc.getConstantPool();
}
@@ -1114,7 +1114,7 @@
String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor)
try{
- Type t = Type.getType(sig);
+ Type.getType(sig); /* Don't need the return value */
}
catch (ClassFormatError cfe){
// Well, BCEL sometimes is a little harsh describing exceptional situations.
@@ -1144,7 +1144,6 @@
try{
Type t = Type.getReturnType(sig);
- Type[] ts = Type.getArgumentTypes(sig);
if ( name.equals(CONSTRUCTOR_NAME) && (t != Type.VOID) ){
throw new ClassConstraintException("Instance initialization method must have VOID return type.");
}
@@ -1177,7 +1176,6 @@
try{
Type t = Type.getReturnType(sig);
- Type[] ts = Type.getArgumentTypes(sig);
if ( name.equals(STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){
addMessage("Class or interface initialization method '"+STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition.");
}
@@ -1196,7 +1194,10 @@
* represents a valid Java class name.
*/
private static final boolean validClassName(String name){
- // Are there restrictions?
+ /*
+ * TODO: implement.
+ * Are there any restrictions?
+ */
return true;
}
/**
1.3 +1 -3 jakarta-bcel/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
Index: Pass3aVerifier.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Pass3aVerifier.java 26 Apr 2002 22:35:40 -0000 1.2
+++ Pass3aVerifier.java 13 Jun 2002 09:32:50 -0000 1.3
@@ -59,8 +59,6 @@
import org.apache.bcel.classfile.*;
import org.apache.bcel.verifier.*;
import org.apache.bcel.verifier.exc.*;
-import java.util.ArrayList;
-import java.util.HashMap;
/**
* This PassVerifier verifies a class file according to
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.