This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-bcel.git
The following commit(s) were added to refs/heads/master by this push:
new 5306aa35 Field not found -> search field in both super class and
implemented interfaces (5x duplicated code to find field by name and type is
refactored to a new method and now supports package-private) #181
5306aa35 is described below
commit 5306aa357a41b92aa29c394f7a4d6ef5af9118d7
Author: Gary David Gregory (Code signing key) <[email protected]>
AuthorDate: Sun Apr 9 20:35:54 2023 -0400
Field not found -> search field in both super class and implemented
interfaces (5x duplicated code to find field by name and type is
refactored to a new method and now supports package-private) #181
---
.../java/org/apache/bcel/classfile/JavaClass.java | 80 +++++++++++-----------
.../bcel/verifier/statics/Pass3aVerifier.java | 6 +-
.../structurals/InstConstraintVisitor.java | 4 +-
3 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java
b/src/main/java/org/apache/bcel/classfile/JavaClass.java
index d95789a1..71e8e580 100644
--- a/src/main/java/org/apache/bcel/classfile/JavaClass.java
+++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java
@@ -307,46 +307,6 @@ public class JavaClass extends AccessFlags implements
Cloneable, Node, Comparabl
}
}
- /**
- * Finds a visible field by name and type in this class and its super
classes.
- * @param fieldName the field name to find
- * @param fieldType the field type to find
- * @return field matching given name and type, null if field is not found
or not accessible from this class.
- * @throws ClassNotFoundException
- * @since 6.8.0
- */
- public Field findFieldByNameAndType(final String fieldName, final Type
fieldType) throws ClassNotFoundException {
- for (final Field field : fields) {
- if (field.getName().equals(fieldName)) {
- final Type fType = Type.getType(field.getSignature());
- /*
- * TODO: Check if assignment compatibility is sufficient. What
does Sun do?
- */
- if (fType.equals(fieldType)) {
- return field;
- }
- }
- }
-
- final JavaClass superclass = getSuperClass();
- if (superclass != null &&
!"java.lang.Object".equals(superclass.getClassName())) {
- final Field f = superclass.findFieldByNameAndType(fieldName,
fieldType);
- if (f != null && (f.isPublic() || f.isProtected() ||
!f.isPrivate() && packageName.equals(superclass.getPackageName()))) {
- return f;
- }
- }
- JavaClass[] implementedInterfaces = getInterfaces();
- if (implementedInterfaces != null) {
- for (JavaClass implementedInterface : implementedInterfaces) {
- final Field f =
implementedInterface.findFieldByNameAndType(fieldName, fieldType);
- if (f != null) {
- return f;
- }
- }
- }
- return null;
- }
-
/**
* Dump Java class to output stream in binary format.
*
@@ -434,6 +394,46 @@ public class JavaClass extends AccessFlags implements
Cloneable, Node, Comparabl
return bcelComparator.equals(this, obj);
}
+ /**
+ * Finds a visible field by name and type in this class and its super
classes.
+ * @param fieldName the field name to find
+ * @param fieldType the field type to find
+ * @return field matching given name and type, null if field is not found
or not accessible from this class.
+ * @throws ClassNotFoundException
+ * @since 6.8.0
+ */
+ public Field findField(final String fieldName, final Type fieldType)
throws ClassNotFoundException {
+ for (final Field field : fields) {
+ if (field.getName().equals(fieldName)) {
+ final Type fType = Type.getType(field.getSignature());
+ /*
+ * TODO: Check if assignment compatibility is sufficient. What
does Sun do?
+ */
+ if (fType.equals(fieldType)) {
+ return field;
+ }
+ }
+ }
+
+ final JavaClass superclass = getSuperClass();
+ if (superclass != null &&
!"java.lang.Object".equals(superclass.getClassName())) {
+ final Field f = superclass.findField(fieldName, fieldType);
+ if (f != null && (f.isPublic() || f.isProtected() ||
!f.isPrivate() && packageName.equals(superclass.getPackageName()))) {
+ return f;
+ }
+ }
+ JavaClass[] implementedInterfaces = getInterfaces();
+ if (implementedInterfaces != null) {
+ for (JavaClass implementedInterface : implementedInterfaces) {
+ final Field f = implementedInterface.findField(fieldName,
fieldType);
+ if (f != null) {
+ return f;
+ }
+ }
+ }
+ return null;
+ }
+
/**
* Get all interfaces implemented by this JavaClass (transitively).
*
diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
index fcb2375a..61e555d7 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
@@ -322,7 +322,7 @@ public final class Pass3aVerifier extends PassVerifier {
final String fieldName = o.getFieldName(constantPoolGen);
final JavaClass jc =
Repository.lookupClass(getObjectType(o).getClassName());
- final Field f = jc.findFieldByNameAndType(fieldName,
o.getType(constantPoolGen));
+ final Field f = jc.findField(fieldName,
o.getType(constantPoolGen));
if (f == null) {
constraintViolated(o, "Referenced field '" + fieldName +
"' does not exist in class '" + jc.getClassName() + "'.");
}
@@ -366,7 +366,7 @@ public final class Pass3aVerifier extends PassVerifier {
try {
final String fieldName = o.getFieldName(constantPoolGen);
final JavaClass jc =
Repository.lookupClass(getObjectType(o).getClassName());
- final Field f = jc.findFieldByNameAndType(fieldName,
o.getType(constantPoolGen));
+ final Field f = jc.findField(fieldName,
o.getType(constantPoolGen));
if (f == null) {
throw new AssertionViolatedException("Field '" + fieldName
+ "' not found in " + jc.getClassName());
}
@@ -807,7 +807,7 @@ public final class Pass3aVerifier extends PassVerifier {
try {
final String fieldName = o.getFieldName(constantPoolGen);
final JavaClass jc =
Repository.lookupClass(getObjectType(o).getClassName());
- final Field f = jc.findFieldByNameAndType(fieldName,
o.getType(constantPoolGen));
+ final Field f = jc.findField(fieldName,
o.getType(constantPoolGen));
if (f == null) {
throw new AssertionViolatedException("Field '" + fieldName
+ "' not found in " + jc.getClassName());
}
diff --git
a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
index dae00b07..ec6d6743 100644
---
a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
+++
b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
@@ -918,7 +918,7 @@ public class InstConstraintVisitor extends EmptyVisitor {
private Field visitFieldInstructionInternals(final FieldInstruction o)
throws ClassNotFoundException {
final String fieldName = o.getFieldName(cpg);
final JavaClass jc =
Repository.lookupClass(getObjectType(o).getClassName());
- final Field f = jc.findFieldByNameAndType(fieldName, o.getType(cpg));
+ final Field f = jc.findField(fieldName, o.getType(cpg));
if (f == null) {
throw new AssertionViolatedException("Field '" + fieldName + "'
not found in " + jc.getClassName());
}
@@ -1040,7 +1040,7 @@ public class InstConstraintVisitor extends EmptyVisitor {
final String fieldName = o.getFieldName(cpg);
final JavaClass jc =
Repository.lookupClass(getObjectType(o).getClassName());
- final Field f = jc.findFieldByNameAndType(fieldName,
o.getType(cpg));
+ final Field f = jc.findField(fieldName, o.getType(cpg));
if (f == null) {
throw new AssertionViolatedException("Field '" + fieldName +
"' not found in " + jc.getClassName());
}