Author: dbrosius Date: Sun Jul 31 00:07:38 2005 New Revision: 226610 URL: http://svn.apache.org/viewcvs?rev=226610&view=rev Log: Fix 27855: If a GETFIELD is called and the field is not found in the class, look for public or protected members with the same name in a super class.
Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java?rev=226610&r1=226609&r2=226610&view=diff ============================================================================== --- jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java (original) +++ jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java Sun Jul 31 00:07:38 2005 @@ -562,8 +562,25 @@ } } if (f == null){ - /* TODO: also look up if the field is inherited! */ - constraintViolated(o, "Referenced field '"+field_name+"' does not exist in class '"+jc.getClassName()+"'."); + JavaClass[] superclasses = jc.getSuperClasses(); + outer: + for (int j=0; j<superclasses.length; j++){ + fields = superclasses[j].getFields(); + for (int i=0; i<fields.length; i++){ + if (fields[i].getName().equals(field_name)){ + Type f_type = Type.getType(fields[i].getSignature()); + Type o_type = o.getType(cpg); + if (f_type.equals(o_type)){ + f = fields[i]; + if ((f.getAccessFlags() & (Constants.ACC_PUBLIC | Constants.ACC_PROTECTED)) == 0) + f = null; + break outer; + } + } + } + } + if (f == null) + constraintViolated(o, "Referenced field '"+field_name+"' does not exist in class '"+jc.getClassName()+"'."); } else{ /* TODO: Check if assignment compatibility is sufficient. Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java?rev=226610&r1=226609&r2=226610&view=diff ============================================================================== --- jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java (original) +++ jakarta/bcel/trunk/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java Sun Jul 31 00:07:38 2005 @@ -1173,8 +1173,27 @@ } } } + if (f == null){ - throw new AssertionViolatedException("Field not found?!?"); + JavaClass[] superclasses = jc.getSuperClasses(); + outer: + for (int j=0; j<superclasses.length; j++){ + fields = superclasses[j].getFields(); + for (int i=0; i<fields.length; i++){ + if (fields[i].getName().equals(field_name)){ + Type f_type = Type.getType(fields[i].getSignature()); + Type o_type = o.getType(cpg); + if (f_type.equals(o_type)){ + f = fields[i]; + if ((f.getAccessFlags() & (Constants.ACC_PUBLIC | Constants.ACC_PROTECTED)) == 0) + f = null; + break outer; + } + } + } + } + if (f == null) + throw new AssertionViolatedException("Field '"+field_name+"' not found?!?"); } if (f.isProtected()){ --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]