private static final int DISCOVERED_DECLARED_SIGNATURE = 0x0010;
private static final int DISCOVERED_WHETHER_ANNOTATION_STYLE = 0x0020;
+ private static final int ANNOTATION_UNPACK_IN_PROGRESS = 0x0100;
+
private static final String[] NO_INTERFACE_SIGS = new String[] {};
/*
}
public boolean hasAnnotation(UnresolvedType ofType) {
+ // Due to re-entrancy we may be in the middle of unpacking the annotations already... in which case use this slow
+ // alternative until the stack unwinds itself
+ if (isUnpackingAnnotations()) {
+ AnnotationGen annos[] = javaClass.getAnnotations();
+ if (annos == null || annos.length == 0) {
+ return false;
+ } else {
+ String lookingForSignature = ofType.getSignature();
+ for (int a = 0; a < annos.length; a++) {
+ AnnotationGen annotation = annos[a];
+ if (lookingForSignature.equals(annotation.getTypeSignature())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
ensureAnnotationsUnpacked();
for (int i = 0; i < annotationTypes.length; i++) {
- ResolvedType ax = annotationTypes[i];
- if (ax.equals(ofType))
+ UnresolvedType ax = annotationTypes[i];
+ if (ax == null) {
+ throw new RuntimeException("Annotation entry " + i + " on type " + this.getResolvedTypeX().getName() + " is null!");
+ }
+ if (ax.equals(ofType)) {
return true;
+ }
}
return false;
}
// --- unpacking methods
+ private boolean isUnpackingAnnotations() {
+ return (bitflag & ANNOTATION_UNPACK_IN_PROGRESS) != 0;
+ }
+
private void ensureAnnotationsUnpacked() {
+ if (isUnpackingAnnotations()) {
+ throw new BCException("Re-entered weaver instance whilst unpacking annotations on " + this.className);
+ }
if (annotationTypes == null) {
- AnnotationGen annos[] = javaClass.getAnnotations();
- if (annos == null || annos.length == 0) {
- annotationTypes = ResolvedType.NONE;
- annotations = AnnotationAJ.EMPTY_ARRAY;
- } else {
- World w = getResolvedTypeX().getWorld();
- annotationTypes = new ResolvedType[annos.length];
- annotations = new AnnotationAJ[annos.length];
- for (int i = 0; i < annos.length; i++) {
- AnnotationGen annotation = annos[i];
- annotationTypes[i] = w.resolve(UnresolvedType.forSignature(annotation.getTypeSignature()));
- annotations[i] = new BcelAnnotation(annotation, w);
+ try {
+ bitflag |= ANNOTATION_UNPACK_IN_PROGRESS;
+ AnnotationGen annos[] = javaClass.getAnnotations();
+ if (annos == null || annos.length == 0) {
+ annotationTypes = ResolvedType.NONE;
+ annotations = AnnotationAJ.EMPTY_ARRAY;
+ } else {
+ World w = getResolvedTypeX().getWorld();
+ annotationTypes = new ResolvedType[annos.length];
+ annotations = new AnnotationAJ[annos.length];
+ for (int i = 0; i < annos.length; i++) {
+ AnnotationGen annotation = annos[i];
+ String typeSignature = annotation.getTypeSignature();
+ ResolvedType rType = w.resolve(UnresolvedType.forSignature(typeSignature));
+ if (rType == null) {
+ throw new RuntimeException("Whilst unpacking annotations on '" + getResolvedTypeX().getName()
+ + "', failed to resolve type '" + typeSignature + "'");
+ }
+ annotationTypes[i] = rType;
+ annotations[i] = new BcelAnnotation(annotation, w);
+ }
}
+ } finally {
+ bitflag &= ~ANNOTATION_UNPACK_IN_PROGRESS;
}
}
}