1 salcianu 1.1.2.1 // ArrayInfo.java, created Sun Apr  2 18:18:01 2000 by salcianu
 2 cananian 1.1.2.5 // Copyright (C) 2000 Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu>
 3 salcianu 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 salcianu 1.1.2.1 package harpoon.Util.TypeInference;
 5 salcianu 1.1.2.1 
 6 salcianu 1.1.2.1 import java.util.Set;
 7 salcianu 1.1.2.1 import java.util.HashSet;
 8 salcianu 1.1.2.1 import java.util.Map;
 9 salcianu 1.1.2.1 import java.util.HashMap;
10 salcianu 1.1.2.1 import java.util.Iterator;
11 salcianu 1.1.2.2 import java.util.Collections;
12 salcianu 1.1.2.1 
13 salcianu 1.1.2.1 import harpoon.ClassFile.HCode;
14 salcianu 1.1.2.1 import harpoon.ClassFile.HMethod;
15 salcianu 1.1.2.1 
16 salcianu 1.1.2.1 import harpoon.IR.Quads.Quad;
17 salcianu 1.1.2.1 import harpoon.IR.Quads.QuadVisitor;
18 salcianu 1.1.2.1 import harpoon.IR.Quads.AGET;
19 salcianu 1.1.2.1 
20 salcianu 1.1.2.1 
21 salcianu 1.1.2.1 /**
22 salcianu 1.1.2.1  * <code>ArrayInfo</code>
23 salcianu 1.1.2.1  * 
24 cananian 1.1.2.5  * @author  Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu>
25 cananian 1.3      * @version $Id: ArrayInfo.java,v 1.3 2004/02/08 03:22:00 cananian Exp $
26 salcianu 1.1.2.1  */
27 salcianu 1.1.2.4 public class ArrayInfo implements java.io.Serializable {
28 salcianu 1.1.2.1     
29 salcianu 1.1.2.1     /** Creates a <code>ArrayInfo</code>. */
30 salcianu 1.1.2.1     public ArrayInfo() {
31 salcianu 1.1.2.1     }
32 salcianu 1.1.2.1 
33 salcianu 1.1.2.1     /** Returns the set of <code>AGET</code> instructions from hcode
34 salcianu 1.1.2.1         that access arrays of non primitive objects. */
35 salcianu 1.1.2.1     public Set getInterestingAGETs(HMethod hm, HCode hcode){
36 salcianu 1.1.2.1 
37 salcianu 1.1.2.1         final Set set = new HashSet();
38 salcianu 1.1.2.1 
39 salcianu 1.1.2.1         final QuadVisitor qvisitor = new QuadVisitor(){
40 salcianu 1.1.2.1                 public void visit(AGET q){
41 salcianu 1.1.2.1                     set.add(new ExactTemp(q, q.objectref()));
42 salcianu 1.1.2.1                 }
43 salcianu 1.1.2.1                 public void visit(Quad q){
44 salcianu 1.1.2.1                 }
45 salcianu 1.1.2.1             };
46 salcianu 1.1.2.1 
47 salcianu 1.1.2.1         for(Iterator it = hcode.getElementsI(); it.hasNext(); )
48 salcianu 1.1.2.1             ((Quad) it.next()).accept(qvisitor);
49 salcianu 1.1.2.1         
50 salcianu 1.1.2.2         if(set.isEmpty())
51 salcianu 1.1.2.2             return Collections.EMPTY_SET;
52 salcianu 1.1.2.2         
53 salcianu 1.1.2.1         TypeInference ti = new TypeInference(hm, hcode, set);
54 salcianu 1.1.2.1 
55 salcianu 1.1.2.1         Set retval = new HashSet();
56 salcianu 1.1.2.1 
57 cananian 1.3             for(Object etO : set){
58 cananian 1.3                 ExactTemp et = (ExactTemp) etO;
59 salcianu 1.1.2.1             if(ti.isArrayOfNonPrimitives(et))
60 salcianu 1.1.2.1                 retval.add(et.q);
61 salcianu 1.1.2.1         }
62 salcianu 1.1.2.1 
63 salcianu 1.1.2.1         return retval;
64 salcianu 1.1.2.1     }
65 salcianu 1.1.2.1     
66 cananian 1.2     }