1 cananian 1.1.4.1 // DataInterfaceList.java, created Mon Oct 11 13:49:57 1999 by cananian
 2 cananian 1.1.4.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.4.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.4.1 package harpoon.Backend.Runtime1;
 5 cananian 1.1.4.1 
 6 cananian 1.1.4.1 import harpoon.Analysis.ClassHierarchy;
 7 cananian 1.1.4.1 import harpoon.Backend.Generic.Frame;
 8 cananian 1.1.4.1 import harpoon.Backend.Maps.NameMap;
 9 cananian 1.1.4.1 import harpoon.ClassFile.HClass;
10 cananian 1.1.4.1 import harpoon.ClassFile.HDataElement;
11 cananian 1.1.4.1 import harpoon.IR.Tree.Stm;
12 cananian 1.1.4.2 import harpoon.IR.Tree.ALIGN;
13 cananian 1.1.4.1 import harpoon.IR.Tree.CONST;
14 cananian 1.1.4.3 import harpoon.IR.Tree.DATUM;
15 cananian 1.1.4.1 import harpoon.IR.Tree.LABEL;
16 cananian 1.1.4.1 import harpoon.IR.Tree.NAME;
17 cananian 1.1.4.1 import harpoon.IR.Tree.SEGMENT;
18 cananian 1.1.4.4 import harpoon.Util.HClassUtil;
19 cananian 1.3     import net.cscott.jutil.UniqueVector;
20 cananian 1.1.4.1 import harpoon.Util.Util;
21 cananian 1.1.4.1 
22 cananian 1.1.4.1 import java.util.ArrayList;
23 cananian 1.1.4.1 import java.util.Arrays;
24 cananian 1.1.4.8 import java.util.HashSet;
25 cananian 1.1.4.1 import java.util.Iterator;
26 cananian 1.1.4.1 import java.util.List;
27 cananian 1.1.4.8 import java.util.Set;
28 cananian 1.1.4.1 /**
29 cananian 1.1.4.1  * <code>DataInterfaceList</code> lays out the expanded list of interfaces.
30 cananian 1.1.4.1  * 
31 cananian 1.1.4.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
32 cananian 1.4      * @version $Id: DataInterfaceList.java,v 1.4 2004/02/08 03:20:58 cananian Exp $
33 cananian 1.1.4.1  */
34 cananian 1.1.4.1 public class DataInterfaceList extends Data {
35 cananian 1.1.4.1     final TreeBuilder m_tb;
36 cananian 1.1.4.1     final NameMap m_nm;
37 cananian 1.1.4.1     
38 cananian 1.1.4.1     /** Creates a <code>DataInterfaceList</code>. */
39 cananian 1.1.4.1     public DataInterfaceList(Frame f, HClass hc, ClassHierarchy ch) {
40 cananian 1.1.4.1         super("ilist-data", hc, f);
41 cananian 1.1.4.6         this.m_nm = f.getRuntime().getNameMap();
42 cananian 1.1.4.6         this.m_tb = (TreeBuilder) f.getRuntime().getTreeBuilder();
43 cananian 1.1.4.1         this.root = build(hc, ch);
44 cananian 1.1.4.1     }
45 cananian 1.1.4.1 
46 cananian 1.1.4.1     private HDataElement build(HClass hc, ClassHierarchy ch) {
47 cananian 1.1.4.1         List stmlist = new ArrayList();
48 cananian 1.1.4.1         // write the appropriate segment header
49 cananian 1.1.4.1         stmlist.add(new SEGMENT(tf, null, SEGMENT.CLASS));
50 cananian 1.1.4.2         // word-align.
51 cananian 1.1.4.2         stmlist.add(new ALIGN(tf, null, 4));
52 cananian 1.1.4.1         // write the list label.
53 cananian 1.1.4.1         stmlist.add(new LABEL(tf, null, m_nm.label(hc, "interfaces"), false));
54 cananian 1.1.4.1         // okay, now collect all the interfaces that this class implements.
55 cananian 1.1.4.1         List in = allInterfaces(hc);
56 cananian 1.1.4.4         // add all interfaces of the component class.
57 cananian 1.1.4.5         int dims = 0;
58 cananian 1.1.4.4         while (hc.isArray()) {
59 cananian 1.1.4.5             hc = hc.getComponentType(); dims++;
60 cananian 1.4                 for (Object hccO : allInterfaces(hc)) {
61 cananian 1.4                     HClass hcc = (HClass) hccO;
62 cananian 1.1.4.5                 in.add(HClassUtil.arrayClass(linker, hcc, dims));
63 cananian 1.1.4.4             }
64 cananian 1.1.4.4         }
65 cananian 1.1.4.1         // filter out those not in the class hierarchy.
66 cananian 1.1.4.1         in.retainAll(ch.classes());
67 cananian 1.1.4.1         // and make a list of stms.
68 cananian 1.1.4.8         Set done = new HashSet();
69 cananian 1.4             for (Object hccO : in) {
70 cananian 1.4                 HClass hcc = (HClass) hccO;
71 cananian 1.1.4.8             if (done.add(hcc)) // if not already in done...
72 cananian 1.1.4.8                 stmlist.add(_DATUM(m_nm.label(hcc)));
73 cananian 1.1.4.8         }
74 cananian 1.1.4.1         // ...and null-terminate the list.
75 cananian 1.1.4.3         stmlist.add(_DATUM(new CONST(tf, null)));
76 cananian 1.1.4.1         return (HDataElement) Stm.toStm(stmlist);
77 cananian 1.1.4.1     }
78 cananian 1.1.4.1 
79 cananian 1.1.4.1     private List allInterfaces(HClass hc) {
80 cananian 1.1.4.1         // stolen from HClass.isSuperinterfaceOf
81 cananian 1.1.4.1         UniqueVector uv = new UniqueVector();//unique in case of circularity 
82 cananian 1.1.4.1         // seed with class hierarchy.
83 cananian 1.1.4.1         for ( ; hc!=null; hc = hc.getSuperclass())
84 cananian 1.1.4.1             uv.addElement(hc);
85 cananian 1.1.4.1         // extend with all interfaces implemented by each element.
86 cananian 1.1.4.1         for (int i=0; i<uv.size(); i++) {
87 cananian 1.1.4.1             HClass in[] = ((HClass)uv.elementAt(i)).getInterfaces();
88 cananian 1.1.4.1             uv.addAll(Arrays.asList(in));
89 cananian 1.1.4.1         }
90 cananian 1.1.4.1         // now filter out those that aren't interfaces.
91 cananian 1.1.4.1         List result = new ArrayList(uv.size());
92 cananian 1.4             for (Object nhcO : uv) {
93 cananian 1.4                 HClass nhc = (HClass) nhcO;
94 cananian 1.1.4.1             if (nhc.isInterface()) result.add(nhc);
95 cananian 1.1.4.1         }
96 cananian 1.1.4.1         return result;
97 cananian 1.1.4.1     }
98 cananian 1.2     }