Added support for reading runtime visible annotations

git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@3359 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
yinnon_haviv 2009-03-22 07:51:00 +00:00
parent 838f6cf90a
commit 1003bbfd60
3 changed files with 55 additions and 18 deletions

View File

@ -17,6 +17,7 @@ import java.util.HashMap;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.shrikeBT.Decoder;
import com.ibm.wala.shrikeBT.shrikeCT.CTDecoder;
import com.ibm.wala.shrikeCT.AnnotationsReader;
import com.ibm.wala.shrikeCT.ClassReader;
import com.ibm.wala.shrikeCT.CodeReader;
import com.ibm.wala.shrikeCT.ExceptionsReader;
@ -24,9 +25,10 @@ import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.shrikeCT.LineNumberTableReader;
import com.ibm.wala.shrikeCT.LocalVariableTableReader;
import com.ibm.wala.shrikeCT.RuntimeInvisibleAnnotationsReader;
import com.ibm.wala.shrikeCT.RuntimeVisibleAnnotationsReader;
import com.ibm.wala.shrikeCT.SignatureReader;
import com.ibm.wala.shrikeCT.AnnotationsReader.UnimplementedException;
import com.ibm.wala.shrikeCT.ClassReader.AttrIterator;
import com.ibm.wala.shrikeCT.RuntimeInvisibleAnnotationsReader.UnimplementedException;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.types.annotations.Annotation;
import com.ibm.wala.types.generics.MethodTypeSignature;
@ -269,17 +271,24 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IMethod {
return result;
}
private RuntimeInvisibleAnnotationsReader getRuntimeInvisibleAnnotationsReader() {
private AnnotationsReader getAnnotationsReader(boolean runtimeInvisable) {
ClassReader.AttrIterator iter = new AttrIterator();
getClassReader().initMethodAttributeIterator(shrikeMethodIndex, iter);
// search for the desired attribute
RuntimeInvisibleAnnotationsReader result = null;
AnnotationsReader result = null;
try {
for (; iter.isValid(); iter.advance()) {
if (iter.getName().equals("RuntimeInvisibleAnnotations")) {
result = new RuntimeInvisibleAnnotationsReader(iter);
break;
if (runtimeInvisable){
if (iter.getName().equals(RuntimeInvisibleAnnotationsReader.attrName)) {
result = new RuntimeInvisibleAnnotationsReader(iter);
break;
}
} else {
if (iter.getName().equals(RuntimeVisibleAnnotationsReader.attrName)) {
result = new RuntimeVisibleAnnotationsReader(iter);
break;
}
}
}
} catch (InvalidClassFileException e) {
@ -329,7 +338,18 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IMethod {
* read the runtime-invisible annotations from the class file
*/
public Collection<Annotation> getRuntimeInvisibleAnnotations() throws InvalidClassFileException, UnimplementedException {
RuntimeInvisibleAnnotationsReader r = getRuntimeInvisibleAnnotationsReader();
return getAnnotations(true);
}
/**
* read the runtime-visible annotations from the class file
*/
public Collection<Annotation> getRuntimeVisibleAnnotations() throws InvalidClassFileException, UnimplementedException {
return getAnnotations(false);
}
public Collection<Annotation> getAnnotations(boolean runtimeInvisable) throws InvalidClassFileException, UnimplementedException {
AnnotationsReader r = getAnnotationsReader(runtimeInvisable);
if (r != null) {
int[] offsets = r.getAnnotationOffsets();
Collection<Annotation> result = HashSetFactory.make();
@ -346,11 +366,11 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IMethod {
}
/**
* Retrieves all the annotations associated with a given index. Returns null
* Retrieves all runtime-invisible annotations associated with a given index. Returns null
* if the index is not valid or the annotation contains arrays.
*/
public HashMap<String, String> getAnnotations(int index) {
RuntimeInvisibleAnnotationsReader r = getRuntimeInvisibleAnnotationsReader();
AnnotationsReader r = getAnnotationsReader(true);
if (r == null)
return null;
int offsets[];

View File

@ -18,14 +18,16 @@ import java.util.List;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.shrikeBT.Constants;
import com.ibm.wala.shrikeCT.AnnotationsReader;
import com.ibm.wala.shrikeCT.ClassConstants;
import com.ibm.wala.shrikeCT.ClassReader;
import com.ibm.wala.shrikeCT.InnerClassesReader;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.shrikeCT.RuntimeInvisibleAnnotationsReader;
import com.ibm.wala.shrikeCT.RuntimeVisibleAnnotationsReader;
import com.ibm.wala.shrikeCT.SignatureReader;
import com.ibm.wala.shrikeCT.AnnotationsReader.UnimplementedException;
import com.ibm.wala.shrikeCT.ClassReader.AttrIterator;
import com.ibm.wala.shrikeCT.RuntimeInvisibleAnnotationsReader.UnimplementedException;
import com.ibm.wala.types.TypeName;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.types.annotations.Annotation;
@ -225,8 +227,16 @@ public final class ShrikeClass extends JVMClass<IClassLoader> {
reader.clear();
}
public Collection<Annotation> getRuntimeInvisibleAnnotations() throws InvalidClassFileException, UnimplementedException {
RuntimeInvisibleAnnotationsReader r = getRuntimeInvisibleAnnotationsReader();
public Collection<Annotation> getRuntimeInvisibleAnnotations() throws InvalidClassFileException, UnimplementedException {
return getAnnotations(true);
}
public Collection<Annotation> getRuntimeVisibleAnnotations() throws InvalidClassFileException, UnimplementedException {
return getAnnotations(false);
}
public Collection<Annotation> getAnnotations(boolean runtimeInvisable) throws InvalidClassFileException, UnimplementedException {
AnnotationsReader r = getAnnotationsReader(runtimeInvisable);
if (r != null) {
int[] offsets = r.getAnnotationOffsets();
Collection<Annotation> result = HashSetFactory.make();
@ -242,18 +252,25 @@ public final class ShrikeClass extends JVMClass<IClassLoader> {
}
}
private RuntimeInvisibleAnnotationsReader getRuntimeInvisibleAnnotationsReader() throws InvalidClassFileException {
private AnnotationsReader getAnnotationsReader(boolean runtimeInvisable) throws InvalidClassFileException {
ClassReader r = reader.get();
ClassReader.AttrIterator attrs = new ClassReader.AttrIterator();
r.initClassAttributeIterator(attrs);
// search for the desired attribute
RuntimeInvisibleAnnotationsReader result = null;
AnnotationsReader result = null;
try {
for (; attrs.isValid(); attrs.advance()) {
if (attrs.getName().equals("RuntimeInvisibleAnnotations")) {
result = new RuntimeInvisibleAnnotationsReader(attrs);
break;
if (runtimeInvisable){
if (attrs.getName().equals(RuntimeInvisibleAnnotationsReader.attrName)) {
result = new RuntimeInvisibleAnnotationsReader(attrs);
break;
}
} else {
if (attrs.getName().equals(RuntimeVisibleAnnotationsReader.attrName)) {
result = new RuntimeVisibleAnnotationsReader(attrs);
break;
}
}
}
} catch (InvalidClassFileException e) {

View File

@ -19,7 +19,7 @@ import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.classLoader.ShrikeCTMethod;
import com.ibm.wala.classLoader.ShrikeClass;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.shrikeCT.RuntimeInvisibleAnnotationsReader.UnimplementedException;
import com.ibm.wala.shrikeCT.AnnotationsReader.UnimplementedException;
import com.ibm.wala.types.TypeName;
import com.ibm.wala.util.debug.Assertions;