1 cananian 1.1.4.1 // DataStrings.java, created Mon Oct 11 20:37:16 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.Backend.Generic.Runtime.ObjectBuilder.ArrayInfo; 7 cananian 1.1.4.1 import harpoon.Backend.Generic.Runtime.ObjectBuilder.ObjectInfo; 8 cananian 1.1.4.1 import harpoon.Backend.Generic.Runtime.ObjectBuilder; 9 cananian 1.1.4.1 import harpoon.Backend.Generic.Frame; 10 cananian 1.1.4.1 import harpoon.Backend.Maps.NameMap; 11 cananian 1.1.4.1 import harpoon.ClassFile.HClass; 12 cananian 1.1.4.1 import harpoon.ClassFile.HDataElement; 13 cananian 1.1.4.1 import harpoon.ClassFile.HField; 14 cananian 1.1.4.1 import harpoon.IR.Tree.Stm; 15 cananian 1.1.4.1 import harpoon.IR.Tree.TreeFactory; 16 cananian 1.1.4.1 import harpoon.IR.Tree.SEGMENT; 17 cananian 1.1.4.1 import harpoon.Temp.Label; 18 cananian 1.1.4.1 19 cananian 1.1.4.1 import java.util.ArrayList; 20 cananian 1.1.4.1 import java.util.Iterator; 21 cananian 1.1.4.1 import java.util.List; 22 cananian 1.1.4.1 import java.util.Set; 23 cananian 1.1.4.1 /** 24 cananian 1.1.4.1 * <code>DataStrings</code> lays out string constant objects. 25 cananian 1.1.4.1 * 26 cananian 1.1.4.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 27 cananian 1.4 * @version $Id: DataStrings.java,v 1.4 2002/08/06 20:01:32 cananian Exp $ 28 cananian 1.1.4.1 */ 29 cananian 1.1.4.1 public class DataStrings extends Data { 30 cananian 1.1.4.1 final NameMap m_nm; 31 cananian 1.1.4.1 final ObjectBuilder m_ob; 32 cananian 1.1.4.1 33 cananian 1.1.4.1 /** Creates a <code>DataStrings</code> containing tables corresponding 34 cananian 1.1.4.1 * to the given set of strings. */ 35 cananian 1.2.2.1 public DataStrings(Frame f, HClass hc, Set<String> strings) { 36 cananian 1.1.4.1 super("string-data", hc, f); 37 cananian 1.1.4.5 this.m_nm = f.getRuntime().getNameMap(); 38 cananian 1.1.4.1 this.m_ob = ((Runtime) f.getRuntime()).ob; 39 cananian 1.1.4.1 this.root = build(strings); 40 cananian 1.1.4.1 } 41 cananian 1.2.2.1 private HDataElement build(Set<String> strings) { 42 cananian 1.2.2.1 List<Stm> stmlist = new ArrayList<Stm>(strings.size()+1); 43 cananian 1.2.2.1 for (Iterator<String> it=strings.iterator(); it.hasNext(); ) 44 cananian 1.2.2.1 stmlist.add(buildOne(it.next())); 45 cananian 1.1.4.1 return (HDataElement) Stm.toStm(stmlist); 46 cananian 1.1.4.1 } 47 cananian 1.1.4.1 private Stm buildOne(final String str) { 48 cananian 1.1.4.1 final ArrayInfo charArray = new ArrayInfo() { 49 cananian 1.1.4.2 public HClass type() { return HCcharA; } 50 cananian 1.1.4.1 public Label label() { return m_nm.label(str, "chararray"); } 51 cananian 1.1.4.1 public int length() { return str.length(); } 52 cananian 1.1.4.1 public Object get(int i) { return new Character(str.charAt(i)); } 53 cananian 1.1.4.2 final HClass HCcharA = linker.forDescriptor("[C"); 54 cananian 1.1.4.1 }; 55 cananian 1.1.4.1 final ObjectInfo strObject = new ObjectInfo() { 56 cananian 1.1.4.1 public HClass type() { return HCstr; } 57 cananian 1.1.4.1 public Label label() { return m_nm.label(str); } 58 cananian 1.1.4.1 public Object get(HField hf) { 59 cananian 1.1.4.1 if (HFval.equals(hf)) return charArray; 60 cananian 1.1.4.1 if (HFcnt.equals(hf)) return new Integer(str.length()); 61 cananian 1.1.4.6 // this test is different because size optimizations 62 cananian 1.1.4.6 // may eliminate the 'offset' field as a compile-time 63 cananian 1.1.4.6 // constant. 64 cananian 1.1.4.6 if (hf.getName().equals("offset") && 65 cananian 1.1.4.6 hf.getDeclaringClass().equals(HCstr)) 66 cananian 1.1.4.6 return new Integer(0); 67 cananian 1.4 // special test for GNU classpath libraries. 68 cananian 1.4 if (hf.getName().equals("cachedHashCode") && 69 cananian 1.4 hf.getDeclaringClass().equals(HCstr)) 70 cananian 1.4 return new Integer(str.hashCode()); 71 cananian 1.1.4.1 throw new Error("Unknown field "+hf+" of string object."); 72 cananian 1.1.4.1 } 73 cananian 1.1.4.2 final HClass HCstr = linker.forName("java.lang.String"); 74 cananian 1.1.4.2 final HField HFval = HCstr.getField("value"); 75 cananian 1.1.4.2 final HField HFcnt = HCstr.getField("count"); 76 cananian 1.1.4.1 }; 77 cananian 1.1.4.1 List stmlist = new ArrayList(4); 78 cananian 1.1.4.1 stmlist.add(new SEGMENT(tf, null, SEGMENT.STRING_CONSTANTS)); 79 cananian 1.1.4.1 stmlist.add(m_ob.buildObject(tf, strObject, true)); 80 cananian 1.1.4.1 stmlist.add(new SEGMENT(tf, null, SEGMENT.STRING_DATA)); 81 cananian 1.1.4.1 stmlist.add(m_ob.buildArray (tf, charArray, false)); 82 cananian 1.1.4.1 return Stm.toStm(stmlist); 83 cananian 1.1.4.1 } 84 cananian 1.2 }