On 12 August 2015 at 07:32, <c...@apache.org> wrote: > Author: chas > Date: Wed Aug 12 06:32:41 2015 > New Revision: 1695425 > > URL: http://svn.apache.org/r1695425 > Log: > BCEL-236: remove deprecated FieldOrMethod.getClassType(ConConstantPoolGen)
I think this needs to be reverted or amended. The new method FieldOrMethod.getLoadClassType(ConstantPoolGen cpg) can throw a ClassCastException. See below. > Modified: > > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java > > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java > > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java > > Modified: > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java > URL: > http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java?rev=1695425&r1=1695424&r2=1695425&view=diff > ============================================================================== > --- > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java > (original) > +++ > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java > Wed Aug 12 06:32:41 2015 > @@ -95,17 +95,6 @@ public abstract class FieldOrMethod exte > } > > > - /** @return type of the referenced class/interface > - * @deprecated If the instruction references an array class, > - * the ObjectType returned will be invalid. Use > - * getReferenceType() instead. > - */ > - @Deprecated > - public ObjectType getClassType( ConstantPoolGen cpg ) { > - return ObjectType.getInstance(getClassName(cpg)); > - } > - > - > /** > * Return the reference type representing the class, interface, > * or array class referenced by the instruction. > @@ -131,6 +120,6 @@ public abstract class FieldOrMethod exte > /** @return type of the referenced class/interface > */ > public ObjectType getLoadClassType( ConstantPoolGen cpg ) { > - return getClassType(cpg); > + return (ObjectType)getReferenceType(cpg); ObjectType is not a subclass of ArrayType It does not seem right to hide the original reason for the deprecation this way. The code should at least check the object type and throw a better exception than CCE And the Javadoc should make the pre-condition clear > } > } > > Modified: > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java > URL: > http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java?rev=1695425&r1=1695424&r2=1695425&view=diff > ============================================================================== > --- > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java > (original) > +++ > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java > Wed Aug 12 06:32:41 2015 > @@ -85,6 +85,7 @@ import org.apache.commons.bcel6.generic. > import org.apache.commons.bcel6.generic.ObjectType; > import org.apache.commons.bcel6.generic.PUTSTATIC; > import org.apache.commons.bcel6.generic.RET; > +import org.apache.commons.bcel6.generic.ReferenceType; > import org.apache.commons.bcel6.generic.ReturnInstruction; > import org.apache.commons.bcel6.generic.TABLESWITCH; > import org.apache.commons.bcel6.generic.Type; > @@ -543,6 +544,15 @@ public final class Pass3aVerifier extend > } > } > > + private ObjectType getObjectType(FieldInstruction o) { > + ReferenceType rt = o.getReferenceType(cpg); > + if(rt instanceof ObjectType) { > + return (ObjectType)rt; > + } > + constraintViolated(o, "expecting ObjectType but got "+rt); > + return null; > + } Here we see that the code checks the return class, which is fine. > /** Checks if the constraints of operands of the said instruction(s) > are satisfied. */ > //getfield, putfield, getstatic, putstatic > @Override > @@ -555,8 +565,8 @@ public final class Pass3aVerifier extend > } > > String field_name = o.getFieldName(cpg); > - > - JavaClass jc = > Repository.lookupClass(o.getClassType(cpg).getClassName()); > + > + JavaClass jc = > Repository.lookupClass(getObjectType(o).getClassName()); > Field[] fields = jc.getFields(); > Field f = null; > for (Field field : fields) { > @@ -997,7 +1007,7 @@ public final class Pass3aVerifier extend > public void visitPUTSTATIC(PUTSTATIC o){ > try { > String field_name = o.getFieldName(cpg); > - JavaClass jc = > Repository.lookupClass(o.getClassType(cpg).getClassName()); > + JavaClass jc = > Repository.lookupClass(getObjectType(o).getClassName()); > Field[] fields = jc.getFields(); > Field f = null; > for (Field field : fields) { > @@ -1011,8 +1021,9 @@ public final class Pass3aVerifier extend > } > > if (f.isFinal()){ > - if > (!(myOwner.getClassName().equals(o.getClassType(cpg).getClassName()))){ > - constraintViolated(o, "Referenced field '"+f+"' is final > and must therefore be declared in the current class > '"+myOwner.getClassName()+"' which is not the case: it is declared in > '"+o.getClassType(cpg).getClassName()+"'."); > + if > (!(myOwner.getClassName().equals(getObjectType(o).getClassName()))){ > + constraintViolated(o, "Referenced field '"+f+"' is final > and must therefore be declared in the current class '"+myOwner.getClassName() > + +"' which is not the case: it is declared in > '"+o.getReferenceType(cpg)+"'."); > } > } > > @@ -1037,7 +1048,7 @@ public final class Pass3aVerifier extend > public void visitGETSTATIC(GETSTATIC o){ > try { > String field_name = o.getFieldName(cpg); > - JavaClass jc = > Repository.lookupClass(o.getClassType(cpg).getClassName()); > + JavaClass jc = > Repository.lookupClass(getObjectType(o).getClassName()); > Field[] fields = jc.getFields(); > Field f = null; > for (Field field : fields) { > > Modified: > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java > URL: > http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java?rev=1695425&r1=1695424&r2=1695425&view=diff > ============================================================================== > --- > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java > (original) > +++ > commons/proper/bcel/trunk/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java > Wed Aug 12 06:32:41 2015 > @@ -1208,6 +1208,15 @@ public class InstConstraintVisitor exten > } > } > > + private ObjectType getObjectType(FieldInstruction o) { > + ReferenceType rt = o.getReferenceType(cpg); > + if(rt instanceof ObjectType) { > + return (ObjectType)rt; > + } > + constraintViolated(o, "expecting ObjectType but got "+rt); > + return null; > + } > + > /** > * Ensures the specific preconditions of the said instruction. > */ > @@ -1221,7 +1230,7 @@ public class InstConstraintVisitor exten > > String field_name = o.getFieldName(cpg); > > - JavaClass jc = > Repository.lookupClass(o.getClassType(cpg).getClassName()); > + JavaClass jc = > Repository.lookupClass(getObjectType(o).getClassName()); > Field[] fields = jc.getFields(); > Field f = null; > for (Field field : fields) { > @@ -1263,7 +1272,7 @@ public class InstConstraintVisitor exten > } > > if (f.isProtected()){ > - ObjectType classtype = o.getClassType(cpg); > + ObjectType classtype = getObjectType(o); > ObjectType curr = ObjectType.getInstance(mg.getClassName()); > > if ( classtype.equals(curr) || > @@ -2632,7 +2641,7 @@ public class InstConstraintVisitor exten > > String field_name = o.getFieldName(cpg); > > - JavaClass jc = > Repository.lookupClass(o.getClassType(cpg).getClassName()); > + JavaClass jc = > Repository.lookupClass(getObjectType(o).getClassName()); > Field[] fields = jc.getFields(); > Field f = null; > for (Field field : fields) { > @@ -2684,7 +2693,7 @@ public class InstConstraintVisitor exten > } > > if (f.isProtected()){ > - ObjectType classtype = o.getClassType(cpg); > + ObjectType classtype = getObjectType(o); > ObjectType curr = ObjectType.getInstance(mg.getClassName()); > > if ( classtype.equals(curr) || > @@ -2722,7 +2731,7 @@ public class InstConstraintVisitor exten > public void visitPUTSTATIC(PUTSTATIC o){ > try { > String field_name = o.getFieldName(cpg); > - JavaClass jc = > Repository.lookupClass(o.getClassType(cpg).getClassName()); > + JavaClass jc = > Repository.lookupClass(getObjectType(o).getClassName()); > Field[] fields = jc.getFields(); > Field f = null; > for (Field field : fields) { > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org