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     }