PING I am -1 on the commit as it stands; please revert or fix
On 28 August 2015 at 01:43, sebb <seb...@gmail.com> wrote: > 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