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 }