1 cananian 1.1.2.1 // Data.java, created Wed Sep  8 16:13:24 1999 by cananian
  2 cananian 1.1.2.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 cananian 1.1.2.1 package harpoon.Backend.Runtime1;
  5 cananian 1.1.2.1 
  6 cananian 1.1.2.1 import harpoon.Backend.Generic.Frame;
  7 cananian 1.1.2.1 import harpoon.ClassFile.HClass;
  8 cananian 1.1.2.1 import harpoon.ClassFile.HDataElement;
  9 cananian 1.1.2.7 import harpoon.ClassFile.Linker;
 10 cananian 1.1.2.1 import harpoon.IR.Tree.Exp;
 11 cananian 1.1.2.5 import harpoon.IR.Tree.Stm;
 12 cananian 1.1.2.5 import harpoon.IR.Tree.CONST;
 13 cananian 1.1.2.6 import harpoon.IR.Tree.DATUM;
 14 cananian 1.1.2.1 import harpoon.IR.Tree.NAME;
 15 cananian 1.1.2.1 import harpoon.IR.Tree.Tree;
 16 cananian 1.1.2.3 import harpoon.IR.Tree.Type;
 17 cananian 1.1.2.1 import harpoon.Temp.Label;
 18 cananian 1.1.2.1 
 19 cananian 1.1.2.1 import java.util.ArrayList;
 20 cananian 1.1.2.5 import java.util.List;
 21 cananian 1.1.2.1 /**
 22 cananian 1.1.2.4  * <code>Data</code> is an abstract superclass with handy useful methods
 23 cananian 1.1.2.4  * for the <code>harpoon.IR.Tree.Data</code> subclasses in
 24 cananian 1.1.2.4  * <code>Runtime1</code>.
 25 cananian 1.1.2.1  * 
 26 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 27 cananian 1.3      * @version $Id: Data.java,v 1.3 2002/04/10 03:03:20 cananian Exp $
 28 cananian 1.1.2.1  */
 29 cananian 1.1.2.1 public class Data extends harpoon.IR.Tree.Data {
 30 cananian 1.1.2.7     final Linker linker;
 31 cananian 1.1.2.1     final HClass hc;
 32 wbeebee  1.1.2.8     // All subclasses should be able to set this.
 33 wbeebee  1.1.2.8     protected HDataElement root = null;
 34 cananian 1.1.2.1     
 35 cananian 1.1.2.1     /** Creates a <code>Data</code>. */
 36 wbeebee  1.1.2.8     protected Data(String desc, HClass hc, Frame f) {
 37 cananian 1.1.2.1         super(desc, f);
 38 cananian 1.1.2.7         this.linker = f.getLinker();
 39 cananian 1.1.2.1         this.hc = hc;
 40 cananian 1.1.2.1     }
 41 cananian 1.1.2.1     public HClass getHClass() { return hc; }
 42 cananian 1.1.2.1     public HDataElement getRootElement() { return root; }
 43 cananian 1.1.2.2 
 44 cananian 1.1.2.2     public int hashCode() { return hc.hashCode() ^ desc.hashCode(); }
 45 cananian 1.1.2.1 
 46 cananian 1.1.2.1     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 47 cananian 1.1.2.1      *                                                          *
 48 cananian 1.1.2.1      *                    Utility methods                       *
 49 cananian 1.1.2.1      *                                                          *
 50 cananian 1.1.2.1      *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 51 cananian 1.1.2.1 
 52 cananian 1.2.2.1     protected DATUM _DATUM(Exp e) { 
 53 cananian 1.1.2.6         return new DATUM(tf, null, e); 
 54 cananian 1.1.2.1     }
 55 cananian 1.1.2.1 
 56 cananian 1.2.2.1     protected DATUM _DATUM(Label l) {
 57 cananian 1.1.2.6         return new DATUM(tf,null,new NAME(tf,null,l));
 58 cananian 1.1.2.5     }
 59 cananian 1.1.2.5 
 60 cananian 1.1.2.5     // UTF-8 handling methods -----------------------------------
 61 cananian 1.1.2.5 
 62 cananian 1.1.2.5     /** Make a java-style UTF-8 encoded byte array for a string. */
 63 cananian 1.1.2.5     public static byte[] toUTF8(String str) {
 64 cananian 1.1.2.5         // first count how many bytes we'll need.
 65 cananian 1.1.2.5         int len=0;
 66 cananian 1.1.2.5         for (int i=0; i<str.length(); i++) {
 67 cananian 1.1.2.5             int c = (int) str.charAt(i);
 68 cananian 1.1.2.5             if (c >= 0x0001 && c <= 0x007f) len+=1; // one byte format
 69 cananian 1.1.2.5             else if (c == 0 || (c >= 0x0080 && c <= 0x07FF)) len+=2; //two byte
 70 cananian 1.1.2.5             else len += 3; // three byte format.
 71 cananian 1.1.2.5         }
 72 cananian 1.1.2.5         // allocate byte array for result.
 73 cananian 1.1.2.5         byte[] r = new byte[len];
 74 cananian 1.1.2.5         // now make the UTF-8 encoding.
 75 cananian 1.1.2.5         len=0;
 76 cananian 1.1.2.5         for (int i=0; i<str.length(); i++) {
 77 cananian 1.1.2.5             int c = (int) str.charAt(i);
 78 cananian 1.1.2.5             if (c >= 0x0001 && c <= 0x007f) { // one byte format
 79 cananian 1.1.2.5                 r[len++] = (byte) c;
 80 cananian 1.1.2.5             } else if (c == 0 || (c >= 0x0080 && c <= 0x07FF)) { // two byte
 81 cananian 1.1.2.5                 r[len++] = (byte) (0xC0 | (c>>>6));
 82 cananian 1.1.2.5                 r[len++] = (byte) (0x80 | (c & 0x3F));
 83 cananian 1.1.2.5             } else { // three byte format
 84 cananian 1.1.2.5                 r[len++] = (byte) (0xE0 | (c>>>12));
 85 cananian 1.1.2.5                 r[len++] = (byte) (0x80 | ((c>>>6) & 0x3F));
 86 cananian 1.1.2.5                 r[len++] = (byte) (0x80 | (c & 0x3F));
 87 cananian 1.1.2.5             }
 88 cananian 1.1.2.5         }
 89 cananian 1.1.2.5         // okay, done.
 90 cananian 1.1.2.5         return r;
 91 cananian 1.1.2.5     }
 92 cananian 1.1.2.5 
 93 cananian 1.1.2.5     /* Return a <code>Stm</code> representing a string constant in UTF-8
 94 cananian 1.1.2.5      * encoded form. */
 95 cananian 1.1.2.5     protected Stm emitUtf8String(String str) {
 96 cananian 1.1.2.5         byte[] bytes = toUTF8(str);
 97 cananian 1.1.2.5         List stmlist = new ArrayList(bytes.length+1);
 98 cananian 1.1.2.5         for (int i=0; i<bytes.length; i++)
 99 cananian 1.1.2.6             stmlist.add(_DATUM(new CONST(tf, null, 8, false,
100 cananian 1.1.2.5                                         ((int)bytes[i])&0xFF)));
101 cananian 1.1.2.5         // null-terminate the string.
102 cananian 1.1.2.6         stmlist.add(_DATUM(new CONST(tf, null, 8, false, 0)));
103 cananian 1.1.2.5         return Stm.toStm(stmlist);
104 cananian 1.1.2.1     }
105 cananian 1.2     }