MethodDescriptor root;
Hashtable<MethodDescriptor, Set<FieldDescriptor>> fields;
Hashtable<MethodDescriptor, Set<TypeDescriptor>> arrays;
+ Hashtable<MethodDescriptor, Set<FieldDescriptor>> fieldsrd;
+ Hashtable<MethodDescriptor, Set<TypeDescriptor>> arraysrd;
HashSet<MethodDescriptor> containsAtomic;
HashSet<MethodDescriptor> containsBarrier;
this.root=root;
this.fields=new Hashtable<MethodDescriptor, Set<FieldDescriptor>>();
this.arrays=new Hashtable<MethodDescriptor, Set<TypeDescriptor>>();
+ this.fieldsrd=new Hashtable<MethodDescriptor, Set<FieldDescriptor>>();
+ this.arraysrd=new Hashtable<MethodDescriptor, Set<TypeDescriptor>>();
this.containsAtomic=new HashSet<MethodDescriptor>();
this.containsBarrier=new HashSet<MethodDescriptor>();
doAnalysis();
changed=true;
if (arrays.get(md).addAll(arrays.get(md2)))
changed=true;
+ if (fieldsrd.get(md).addAll(fieldsrd.get(md2)))
+ changed=true;
+ if (arraysrd.get(md).addAll(arraysrd.get(md2)))
+ changed=true;
if (containsAtomic.contains(md2)) {
if (containsAtomic.add(md))
changed=true;
return arrays.get(md);
}
+ public Set<FieldDescriptor> getFieldsRd(MethodDescriptor md) {
+ return fieldsrd.get(md);
+ }
+
+ public Set<TypeDescriptor> getArraysRd(MethodDescriptor md) {
+ return arraysrd.get(md);
+ }
+
+ public boolean containsAtomicAll(MethodDescriptor md) {
+ Set methodset=cg.getMethods(md);
+ for(Iterator it=methodset.iterator();it.hasNext();) {
+ MethodDescriptor md2=(MethodDescriptor)it.next();
+ if (containsAtomic.contains(md2))
+ return true;
+ }
+ return false;
+ }
+
+ public boolean containsBarrierAll(MethodDescriptor md) {
+ Set methodset=cg.getMethods(md);
+ for(Iterator it=methodset.iterator();it.hasNext();) {
+ MethodDescriptor md2=(MethodDescriptor)it.next();
+ if (containsBarrier.contains(md2))
+ return true;
+ }
+ return false;
+ }
+
+ public Set<FieldDescriptor> getFieldsAll(MethodDescriptor md) {
+ HashSet<FieldDescriptor> s=new HashSet<FieldDescriptor>();
+ Set methodset=cg.getMethods(md);
+ for(Iterator it=methodset.iterator();it.hasNext();) {
+ MethodDescriptor md2=(MethodDescriptor)it.next();
+ if (fields.containsKey(md2))
+ s.addAll(fields.get(md2));
+ }
+ return s;
+ }
+
+ public Set<TypeDescriptor> getArraysAll(MethodDescriptor md) {
+ HashSet<TypeDescriptor> s=new HashSet<TypeDescriptor>();
+ Set methodset=cg.getMethods(md);
+ for(Iterator it=methodset.iterator();it.hasNext();) {
+ MethodDescriptor md2=(MethodDescriptor)it.next();
+ if (arrays.containsKey(md2))
+ s.addAll(arrays.get(md2));
+ }
+ return s;
+ }
+
+ public Set<FieldDescriptor> getFieldsRdAll(MethodDescriptor md) {
+ HashSet<FieldDescriptor> s=new HashSet<FieldDescriptor>();
+ Set methodset=cg.getMethods(md);
+ for(Iterator it=methodset.iterator();it.hasNext();) {
+ MethodDescriptor md2=(MethodDescriptor)it.next();
+ if (fieldsrd.containsKey(md2))
+ s.addAll(fieldsrd.get(md2));
+ }
+ return s;
+ }
+
+ public Set<TypeDescriptor> getArraysRdAll(MethodDescriptor md) {
+ HashSet<TypeDescriptor> s=new HashSet<TypeDescriptor>();
+ Set methodset=cg.getMethods(md);
+ for(Iterator it=methodset.iterator();it.hasNext();) {
+ MethodDescriptor md2=(MethodDescriptor)it.next();
+ if (arraysrd.containsKey(md2))
+ s.addAll(arraysrd.get(md2));
+ }
+ return s;
+ }
+
public void analyzeMethod(MethodDescriptor md) {
fields.put(md, new HashSet<FieldDescriptor>());
arrays.put(md, new HashSet<TypeDescriptor>());
+ fieldsrd.put(md, new HashSet<FieldDescriptor>());
+ arraysrd.put(md, new HashSet<TypeDescriptor>());
FlatMethod fm=st.getMethodFlat(md);
for(Iterator it=fm.getNodeSet().iterator();it.hasNext();) {
if (fn.kind()==FKind.FlatSetElementNode) {
FlatSetElementNode fsen=(FlatSetElementNode)fn;
arrays.get(md).add(fsen.getDst().getType());
+ } else if (fn.kind()==FKind.FlatElementNode) {
+ FlatElementNode fen=(FlatElementNode)fn;
+ arraysrd.get(md).add(fen.getSrc().getType());
} else if (fn.kind()==FKind.FlatSetFieldNode) {
FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
fields.get(md).add(fsfn.getField());
+ } else if (fn.kind()==FKind.FlatFieldNode) {
+ FlatFieldNode ffn=(FlatFieldNode)fn;
+ fieldsrd.get(md).add(ffn.getField());
} else if (fn.kind()==FKind.FlatAtomicEnterNode) {
containsAtomic.add(md);
} else if (fn.kind()==FKind.FlatCall) {